メソッドの配列型の引数に、通常のパラメーターとして値を渡せる (params キーワードの利用)
メソッドの配列型の引数に、通常のパラメーターとして値を渡せる記述について紹介します。
概要
メソッドの配列型の引数に、通常のパラメーターとして値を渡せる記述ができる場合があります。
C#でparamsキーワードを用いてメソッドを定義すると、配列型の引数に通常のパラメータの記述で値を渡せます。
この記事では、paramsキーワードを用いたメソッドの記述と利用コードを紹介します。
プログラム
UI
下図のフォームを作成します。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ParamsDemo
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public int calc1(int[] values)
{
int result = 0;
for (int i = 0; i < values.Length; i++) {
result += values[i];
}
return result;
}
public int calc2(params int[] values)
{
int result = 0;
for (int i = 0; i < values.Length; i++) {
result += values[i];
}
return result;
}
//コンパイルエラー
/*
public int calc3(params int[] values, string flag)
{
int result = 0;
for (int i = 0; i < values.Length; i++) {
result += values[i];
}
return result;
}
*/
public int calc4(string flag, params int[] values)
{
int result = 0;
for (int i = 0; i < values.Length; i++) {
result += values[i];
}
return result;
}
/*
public int calc5( params int[] values1, params int[] values2)
{
int result = 0;
for (int i = 0; i < values1.Length; i++) {
result += values1[i];
}
return result;
}
*/
private void button1_Click(object sender, EventArgs e)
{
int r = calc1(new int[] { 1, 3, 5, 2, 4 });
textBox1.Text = r.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
int[] ar = { 1, 3, 5, 2, 4 };
int r = calc1(ar);
textBox1.Text = r.ToString();
}
private void button3_Click(object sender, EventArgs e)
{
//エラー
/*
int r = calc1( 1, 3, 5, 2, 4 );
textBox1.Text = r.ToString();
*/
}
private void button4_Click(object sender, EventArgs e)
{
int r = calc2(new int[] { 1, 3, 5, 2, 4 });
textBox1.Text = r.ToString();
}
private void button5_Click(object sender, EventArgs e)
{
int[] ar = { 1, 3, 5, 2, 4 };
int r = calc2(ar);
textBox1.Text = r.ToString();
}
private void button6_Click(object sender, EventArgs e)
{
int r = calc2(1, 3, 5, 2, 4);
textBox1.Text = r.ToString();
}
}
}
解説
calc1
calc1
メソッドは配列を引数にとるメソッドです。
public int calc1(int[] values)
{
int result = 0;
for (int i = 0; i < values.Length; i++) {
result += values[i];
}
return result;
}
配列を引数にとるメソッドの場合、newキーワードで配列を作成して、直接渡すメソッド呼び出しコードは動作します。
int r = calc1(new int[] { 1, 3, 5, 2, 4 });
配列の変数を与える下記のコードも動作します。
int[] ar = { 1, 3, 5, 2, 4 };
int r = calc1(ar);
一方、通常のメソッド呼び出し同様に引数を与える記述はコンパイル時にエラーとなります。
//エラー
int r = calc1( 1, 3, 5, 2, 4 );
calc2
calc2
メソッドは配列を引数にとるメソッドですが、params キーワードを型名の前に記述しています。
public int calc2(params int[] values)
{
int result = 0;
for (int i = 0; i < values.Length; i++) {
result += values[i];
}
return result;
}
paramsキーワードを指定した配列を引数にとるメソッドの場合、newキーワードで配列を作成して、直接渡すメソッド呼び出しコードでも動作します。
int r = calc2(new int[] { 1, 3, 5, 2, 4 });
配列の変数を与える下記のコードも動作します。
int[] ar = { 1, 3, 5, 2, 4 };
int r = calc2(ar);
paramsキーワードを指定した配列型のパラメーターの場合、通常の引数を並べて記述する、下記のコードも動作します。
int r = calc2(1, 3, 5, 2, 4);
calc3
以下のコードはコンパイルエラーになります。params キーワードをつけたパラメータの後ろに、メソッドのパラメーターを配置できません。
//コンパイルエラー
public int calc3(params int[] values, string flag)
{
int result = 0;
for (int i = 0; i < values.Length; i++) {
result += values[i];
}
return result;
}
calc4
calc3 はコンパイルエラーになりましたが、下記の calc4 メソッドは動作します。
paramsメソッドより手前にパラメーターを配置することはできます。
public int calc4(string flag, params int[] values)
{
int result = 0;
for (int i = 0; i < values.Length; i++) {
result += values[i];
}
return result;
}
calc4
下記コードもコンパイル時にエラーとなります。paramキーワードの引数を2つ配置することはできないです。
public int calc5( params int[] values1, params int[] values2)
{
int result = 0;
for (int i = 0; i < values1.Length; i++) {
result += values1[i];
}
return result;
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
コンパイルが通らない[button3]以外のボタンをクリックすると、引数(1, 3, 5, 2, 4)の合計値(15)がテキストボックスに表示されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用