可変長引数

先日 あるソースを眺めていたら、CとかC++のように可変長引数を使ってるコードがありました。こんな機能は可読性が下がる害悪しかないじゃないか、と思いましたがいちおう記事にしてみます。いろんなスキルの人でチーム開発している場合は利用しないほうがいいでしょう。

コマンドライン引数を取るぐらいにしか用途が思いつきません。

以下ソースコードです。

private bool testA(
				ref int ans,
				int a = 0,
				int b = 0,
				int c = 0,
				bool flag_add = true
				)
{

	if ( flag_add )
	{
		ans = a + b + c;
	}
	else
	{
		ans = a * b * c;
	}

	return true;

}

private bool testB(
				ref int ans,
				int a = 0,
				int b = 0,
				int c = 0,
				bool flag_add = false
				)
{

	if ( flag_add )
	{
		ans = a + b + c;
	}
	else
	{
		ans = a * b * c;
	}

	return true;

}

private void button1_Click( object sender, EventArgs e )
{

	int ans00 = 0;
	int ans01 = 0;
	int ans02 = 0;
	int ans03 = 0;
	int ans04 = 0;

	int ans10 = 0;
	int ans11 = 0;
	int ans12 = 0;
	int ans13 = 0;
	int ans14 = 0;

	testA( ref ans00, 1 );
	testA( ref ans01, 1, 10 );
	testA( ref ans02, 1, 10, 100 );
	testA( ref ans03, 1, 10, 100, true );
	testA( ref ans04, 1, 10, 100, false );

	testB( ref ans10, 1 );
	testB( ref ans11, 1, 10 );
	testB( ref ans12, 1, 10, 100 );
	testB( ref ans13, 1, 10, 100, true );
	testB( ref ans14, 1, 10, 100, false );

	StringBuilder sb = new StringBuilder();

	sb.AppendLine( "testA" );
	sb.AppendLine( ans00.ToString() );
	sb.AppendLine( ans01.ToString() );
	sb.AppendLine( ans02.ToString() );
	sb.AppendLine( ans03.ToString() );
	sb.AppendLine( ans04.ToString() );

	sb.AppendLine( "" );

	sb.AppendLine( "testB" );
	sb.AppendLine( ans10.ToString() );
	sb.AppendLine( ans11.ToString() );
	sb.AppendLine( ans12.ToString() );
	sb.AppendLine( ans13.ToString() );
	sb.AppendLine( ans14.ToString() );

	MessageBox.Show( sb.ToString().Trim() );

	Console.WriteLine( sb.ToString().Trim() );

}

メッセージボックスやコンソールには下記のような結果が出力されます。

testA
1
11
111
111
1000

testB
0
0
1000
111
1000