人気ブログランキング | 話題のタグを見る
「C# エッセンシャルズ」まとめ その2

2.9.5 プロパティ (p.47, 48)

 アクセサ (Java でいう getter や setter) を生成する機能。

public class Well {
decimal dollars; // private フィールド
public int Cents {
get { return(int)(dollars * 100); }
set {
if (value >= 0)
dollars = (decimal)value / 100;
}
}
}

class Test {
static void Main() {
Well w = new Well();
w.Cents = 25; // set
int x = w.Cents; // get
w.Cents += 10; // get と set
}
}
 get{} だけ定義すると読み取り専用、set{} だけ定義すると書き込み専用というように定義できる。

 プロパティは、MSIL (Microsoft Intermediate Language) の段階で、get_XXX や set_XXX に変換される、とのこと。
public int get_Cents {...}
public void set_Cents (int value) {...}

 したがって、上の例のように Cents というプロパティを定義しているクラスでは、(C# の段階で) get_Cents や set_Cents といったメソッドは作成できない (Visual C# 2008 Express Edition で確認)。
public class Well {
decimal dollars; // private フィールド
public int Cents {
get { return (int)(dollars * 100); }
set {
if (value >= 0)
dollars = (decimal)value / 100;
}
}

// ***** エラー!! *****
public int get_Cents() {
return (int)dollars;
}
}


2.9.6 インデクサ (p.48, 49)

 配列スタイルの [] 構文をつかって、オブジェクトにアクセサを生やす。コレクションをカプセル化するクラスの生成等に使える。
public class ScoreList {
int[] scores = new int[5];

// インデクサ
public int this[int index] {
get { return scores[index]; }
set {
if (value >= 0 && value <= 10)
scores[index] = value;
}
}

// プロパティ (読み取り専用)
public int Average {
get {
int sum = 0;
foreach (int score in scores)
sum += score;
return sum / scores.Length;
}
}
}

class IndexerTest {
static void Main() {
ScoreList sl = new ScoreList();
sl[0] = 9;
sl[1] = 8;
sl[2] = 7;
sl[3] = sl[4] = sl[1];
System.Console.WriteLine(sl.Average); //=> 8
}
}

 微妙に分かりにくい機能。obj[0] を obj.0 というプロパティに対する構文糖衣と考えると、少し分かりやすいかも。


次回へ続く。
by fkmn | 2009-04-08 23:55 | IT
<< JPA という略称の日本の団体 「C# エッセンシャルズ」まと... >>


とあるWebアプリケーションエンジニアの日記

by fkmn
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX