C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#の静的バインディングとは?仕組みとオーバーロードによる実装方法を解説

静的バインディングとは

静的バインディング(Static Binding)とは、コンパイル時に関数(メソッド)とオブジェクトを結び付ける仕組みのことです。「早期バインディング(Early Binding)」とも呼ばれます。

実行時に呼び出す関数を決める動的バインディング(Dynamic Binding)とは異なり、静的バインディングではプログラムの実行前に、実際に呼び出される関数が確定します。そのため、実行時のオーバーヘッドが少なく、高速に動作するというメリットがあります。

C#で静的ポリモーフィズムを実現する2つの手法

C#では、静的バインディングを利用した「静的ポリモーフィズム(静的多態性)」を実現するために、次の2つの手法が用意されています。

  • 関数のオーバーロード(Function Overloading)
  • 演算子のオーバーロード(Operator Overloading)

1. 関数のオーバーロード

関数のオーバーロードでは、同じスコープ内で同名の関数に対して複数の定義を持つことができます。それぞれの定義は、引数の型や個数が異なっている必要があります。コンパイラは、呼び出し時に渡される引数の情報をもとに、どの関数を呼び出すかを判断します。

コード例

void print(int i) {
    Console.WriteLine("Printing int: {0}", i);
}

void print(double f) {
    Console.WriteLine("Printing float: {0}", f);
}

上記の例では、printという同じ名前の関数が2つ定義されています。int型の引数を渡せば最初の関数が、double型の引数を渡せば2番目の関数が、それぞれコンパイル時に決定され、呼び出されます。

2. 演算子のオーバーロード

オーバーロードされた演算子は、特別な名前を持つ関数です。operatorキーワードの後に、定義したい演算子の記号(+ や - など)を続けて定義します。これにより、独自に作成したクラスのオブジェクト同士でも、組み込み型のように演算子を使った計算が可能になります。

コード例

public static Box operator+ (Box b, Box c) {
    Box box = new Box();
    box.length = b.length + c.length;
    box.breadth = b.breadth + c.breadth;
    box.height = b.height + c.height;
    return box;
}

この例では、Boxクラスに対して+演算子をオーバーロードしています。これにより、2つのBoxオブジェクトを+演算子で足し合わせると、各辺の長さが合計された新しいBoxオブジェクトが返されます。

まとめ

静的バインディングは、コンパイル時に関数とオブジェクトを結び付ける仕組みであり、C#では「関数のオーバーロード」と「演算子のオーバーロード」という2つの手法によって静的ポリモーフィズムを実現できます。実行前に呼び出す関数が決まるため、効率の良い高速なプログラムを作成することが可能になります。

  1. C#の静的メンバー(staticメンバー)とは?特徴と使い方を実例で解説

    C#における静的メンバーの基本C#では、staticキーワードを使うことで、クラスのメンバーを「静的メンバー」として定義できます。クラスのメンバーをstaticとして宣言すると、そのクラスからいくつのオブジェクト(インスタンス)を作成しても、静的メンバーの実体は常に1つだけであることを意味します。つまり、staticキーワードは「そのメンバーがクラスに対してただ1つだけ存在する」ことを表しています。この特性を活かし、静的変数は定数の定義などによく使われます。静的変数には、クラスのインスタンスを生成しなくても、クラス名を指定するだけで直接アクセスできるという利点があります。また、静的変数はメンバ

  2. Pythonのラムダバインディングとは?仕組みとデフォルト引数の使い方を解説

    ラムダバインディングとはプログラムや関数のステートメントが実行されると、仮引数(formal parameters)の現在の値はスタック上に保存されます。そして、そのステートメントのスコープ内では、仮引数は呼び出し時に渡された実引数(actual arguments)の値へと束縛(バインド)されます。ステートメントを抜ける際には、保存しておいた元の値が復元されます。このプロトコルは完全に再帰的です。つまり、関数本体の中で仮引数が新しい値に再束縛されるような処理が行われても、ラムダバインディングの仕組みによって、すべてが秩序正しく処理されることが保証されています。変数xへの束縛は1つだけここで重