引数

引数は仮引数と実引数に分かれます

仮引数

仮引数の英名は Formal Parameter で、通常パラメータ・形式引数と呼ばれます。

仮引数はメソッド宣言の丸括弧内に記述する特殊なローカル変数であり、メソッド本体内部に定義するものではありません。

下記の関数名後の括弧内にある二つの変数が仮引数です。C言語を学んだ方であれば、この概念に見覚えがあるはずです。

// x、y は二つの仮引数
public void PrintArea(int x, float y )
{
}
Code language: C# (cs)
  1. データ型と変数名を持ち、読み書きが可能;
  2. 定義位置はメソッド本体の外側。メソッド実行前に自動的に初期化されますout出力パラメータを除く);
  3. 複数の引数はカンマで区切り、引数の数に上限はない;
  4. メソッド本体内での利用方法は、通常のローカル変数と完全に同じです。

つまり仮引数は特殊なローカル変数で、関数呼び出し元から渡された値を受け取る役割を持ちます。値の代入は関数呼び出し時に実行され、実行フローが関数内部に入った時点で、仮引数への値の設定は完了しています。

public void PrintArea( int x, float y )
{
    float area = x * y; // x、y が仮引数、area は通常のローカル変数でxとyの積を保持
    Console.WriteLine($"面積計算: { x } * { y } = { area }");
}
Code language: C# (cs)

実行可能なサンプル

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.PrintArea(10,6.5F);
    }

    public void PrintArea(int x, float y)
    {
        float area = x * y; // x、y が仮引数、area は通常のローカル変数でxとyの積を保持
        Console.WriteLine($"面積計算: {x} * {y} = {area}");
    }
}Code language: C# (cs)

出力結果

面積計算: 10 * 6.5 = 65

関数を呼び出す動作は、xに10、yに6.5を初期値として代入するのと同等と考えられます。

6.5Fの末尾Fは、この値がfloat型の単精度浮動小数点数であることを示します。Fを付けない場合、コンパイラはdouble型と判断しエラーを発生させます。

単精度floatと倍精度doubleは、メモリ上で占有するビット数が異なるため、保持可能な値の精度に差が生まれます。

精度とは、データ型が正しく保持できる小数桁の最大数のことを指します。上限を超えると値が不正確になる可能性があり、この性質はメモリに割り当てられるビット数に依存します。

xとyは仮引数です。呼び出し時には

二つのローカル変数にこれらの値を初期設定する動作と同じ意味になります。

int x = 10;

float y = 6.5F;Code language: C# (cs)

注意点:

仮引数の型・順序・書式とメソッド名を合わせたものがメソッドシグネチャです。シグネチャは関数のIDのようなものと理解してください。後ほどシグネチャについて学習し、シグネチャの一致がメソッドの同一判定基準となること、メソッドのオーバーロードについても解説します。


実引数

英名:Actual Parameters(実引数、argumentsとも呼ぶ)

メソッド呼び出し時、仮引数に値を渡すための変数または式を実引数と呼びます。メソッド実行前に、実引数の値が対応する仮引数に代入され初期化されます。

  1. 実引数はメソッド呼び出しの丸括弧内に記述;
  2. 型の適合ルール:実引数の型は対応する仮引数と一致するか、コンパイラが暗黙的型変換に対応している必要がある;
  3. 位置による対応:既定で順番通りにマッチング(位置引数 positional parameters)。

例として、上記コードのMain関数を下記のように修正します。呼び出し箇所の第一引数はリテラル5、第二引数はローカル変数fとなっています。

Program program = new Program();
float f = 6.3F;
program.PrintArea(5,f);
// 5 は定数式の実引数、f は変数の実引数
// 位置対応:5 → x、f → y
Code language: C# (cs)

呼び出し時、実引数の値が同じ位置の仮引数にコピーされた後、メソッド本体の処理が実行されます。


位置引数

class Calculate
{
    // int型の仮引数を二つ定義
    public int Sum(int x, int y)
    {
        return x + y;
    }

    // float型の仮引数を二つ定義
    public float Avg(float x, float y)
    {
        return (x + y) / 2.0F;
    }
}

class Program
{
    static void Main()
    {
        Calculate cal = new Calculate();
        int num = 6;

        // Sum:intの実引数がintの仮引数に適合
        Console.WriteLine("Sum: {0} and {1} is {2}",
            5, num, cal.Sum(5, num));

        // Avg:int実引数がfloat仮引数へ暗黙的に変換される
        Console.WriteLine("Avg: {0} and {1} is {2}",
            5, num, cal.Avg(5, num));
    }
}
Code language: PHP (php)
出力結果
Sum: 5 and 6 is 11
Avg: 5 and 6 is 5.5Code language: HTTP (http)

C#は値域の狭い型から広い型への暗黙的変換(int → float)に対応しています。逆方向のfloat → intはコンパイルエラーとなり、手動で明示的キャストを記述する必要があります。

numはint型変数です。Avg関数のfloat仮引数に実引数として渡す際、コンパイラが自動的にintからfloatへ暗黙変換を行うためエラーが発生しません。これはintの取りうる値の範囲がfloatの範囲内に収まるためです。

そのためintをfloatに渡してもデータ欠損が起きません。小さい箱を大きな箱の中に入れるイメージです。逆に大きな箱を小さな箱に収めようとすると入らない状況に相当します。

引数

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です