2008年03月31日

フィールドの初期化でのサイズ

   このエントリーをはてなブックマークに追加 Clip to Evernote
備忘のためアップします。

以下のように3つのコンストラクタをもったクラスがあるとします。

public class SomeClass {
private int _n = 24;
private string _s = "visual studio 2008";
public SomeClass() {
}
public SomeClass(int n) {
_n = n;
}
public SomeClass(int n, string s) {
_n = n;
_s = s;
}
}

この場合、インスタンスフィールドである、_n と _sは、
どこで初期化されるかというと、3つのコンストラクタの先頭で初期化されます。

つまり、

public class SomeClass {
private int _n = 24;
private string _s = "visual studio 2008";
public SomeClass() {
_n = 24;
_s = "visual studio 2008";
}
public SomeClass(int n) {
_n = 24;
_s = "visual studio 2008";
_n = n;
}
public SomeClass(int n, string s) {
_n = 24;
_s = "visual studio 2008";
_n = n;
_s = s;
}
}

と書いたのと同じになります。
コンパイル時に、コンストラクタの最初に初期化コードが挿入されるということです。

実は、この初期化コードを一か所にする方法があります。
キーワード this の出番です。

public class SomeClass {
private int _n;
private string _s;
public SomeClass() {
_n = 24;
_s = "visual studio 2008";
}
public SomeClass(int n) : this() {
_n = n;
}
public SomeClass(int n, string s) : this() {
_n = n;
_s = s;
}
}

フィールドは宣言だけにして、初期化コードは、引数なしコンストラクタで行い、引数ありコンストラクタでは、 this() を使って、明示的にコンストラクタを呼び出してあげます。


この記事へのコメント
自分としては
public SomeClass(int n, string s) { _n = n; _s = s; }
を出発点にして
public SomeClass(int n) : this(n, "visual studio 2008") { }
public SomeClass() : this(24) { }
という書き方の方が好きだったりします。
Posted by hzc at 2008年04月01日 23:28
なるほど。
Delphiのデフォルト引数(正確な名前は忘れた)みたいな感覚ですね。
確かに、このほうが、引数を省略された時にはどんな値を与えるかということが明確になりますね。
Posted by Gushwell at 2008年04月01日 23:42
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51462264