struct
以下は、RealとImaginaryの2つのメンバー変数を持つ名前付きComplexのコンストラクターです。
public Complex(double real, double imaginary) : this()
{
Real = real;
Imaginary = imaginary;
}
関数ヘッダーのコロンの後の部分の使用は何ですか?
struct
以下は、RealとImaginaryの2つのメンバー変数を持つ名前付きComplexのコンストラクターです。
public Complex(double real, double imaginary) : this()
{
Real = real;
Imaginary = imaginary;
}
関数ヘッダーのコロンの後の部分の使用は何ですか?
あるコンストラクターを別のコンストラクター内からいつでも呼び出すことができます。たとえば、次のように言います。
public class mySampleClass
{
public mySampleClass(): this(10)
{
// This is the no parameter constructor method.
// First Constructor
}
public mySampleClass(int Age)
{
// This is the constructor with one parameter.
// Second Constructor
}
}
this
同じクラスを参照しているので、と言うときはthis(10)
、実際にはpublic mySampleClass(int Age)
メソッドを実行することを意味します。上記のメソッドの呼び出し方法は、初期化子と呼ばれます。この方法では、メソッドに最大で1つの初期化子を含めることができます。
あなたの場合、パラメータなしでデフォルトのコンストラクタを呼び出します
これはコンストラクターチェーンと呼ばれ、実際には別のコンストラクター(この場合はパラメーターを取りません)を呼び出してから戻ってきて、このコンストラクターで追加の作業を行います(この場合はReal
との値を設定しますImaginary
)。
これは、コンストラクター本体の直前に別のインスタンスコンストラクターを呼び出すコンストラクター初期化子です。コンストラクタ初期化子には、との2つの形式がありthis
ますbase
。
base
コンストラクター初期化子を使用すると、直接基本クラスのインスタンスコンストラクターが呼び出されます。
this
コンストラクター初期化子により、クラス自体からインスタンスコンストラクターが呼び出されます。コンストラクター初期化子にパラメーターがない場合、パラメーターなしのコンストラクターが呼び出されます。
class Complex
{
public Complex() // this constructor will be invoked
{
}
public Complex(double real, double imaginary) : this()
{
Real = real;
Imaginary = imaginary;
}
}
ところで、通常、コンストラクターのチェーンは、パラメーター数が少ないコンストラクターからパラメーターが多いコンストラクターまで(デフォルト値を提供することにより)行われます。
class Complex
{
public Complex() : this(0, 0)
{
}
public Complex(double real, double imaginary)
{
Real = real;
Imaginary = imaginary;
}
}
は、この: this()
コンストラクターで見つかったコードを実行する前に、クラスのデフォルトコンストラクターを呼び出すようにコンパイラーに指示します。デフォルトのコンストラクターが空の場合、実際の効果はありません。
これはコンストラクターチェーンと呼ばれます。コンストラクターでそれを使用して、別のコンストラクターを呼び出します。たとえば、クラスの継承のためにそれを行うこともできます。
public class MyException : Exception
{
public MyException(string message) : base(message){}
}
同じクラスのデフォルトまたはパラメーターなしのコンストラクターを呼び出すコンストラクターチェーン。
デフォルトのコンストラクターの呼び出しは、プロパティにC#の省略表記を使用する構造体を定義するときに役立ちます(必須です)。例えば:
public struct Foo
{
public int X{get;set;}
public Foo(int x)
{
X = x;
}
}
すべての構造体フィールドが割り当てられるまで、コンストラクター内で'this'オブジェクトを使用してXを割り当てることはできないため、コンパイラーはここでエラーを発生させます。舞台裏では、フィールドがプロパティXのバッキングストアとして自動的に作成され、構造体のデフォルトコンストラクターを呼び出すと、このフィールドが初期化されます(この場合はデフォルト値の0になります)。
詳細については、この質問を参照してください。構造体に自動的に実装されたプロパティを割り当てることはできません