無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

C#をつつく12ープロパティ。入力値を信じるな!。

こんピヨー(こんにちは)。 今回はC#でカプセル化を実現する 為の機能であるプロパティの実装をつついてみよう。 プロパティのありがたみを知るには、やっぱりプロパティ無い状態を見るのが一番。 さっそくプロパティが無い時を見てみよう。

using System;

public class Bird
{
    public string Name;
    public int Age;
    public void Talk( ) {
        Console.WriteLine( "ワタシハ{0}。年は{1}だよ。", 
            this.Name, this.Age);
    }
}

class Program
{
    static void Main( string[ ] args ) {
        Bird b = new Bird( );
        b.Name = "インドリ";
        b.Age = 29;
        b.Talk( );

        b.Name = "ドリィちゃん";
        b.Age = -20;
        b.Talk( );
        Console.WriteLine(
             "えぇ〜!、凄い年齢詐称だ・・・" );
    }
}

ドリィちゃんそこまで年齢を誤魔化さなくても・・・
インドリィちゃん「女性の年齢を聞くな!」
こんな具合にフィールドを直接扱えるようにしてしまったら入力値の妥当性をチェックできない んだ。では入力値をチェックするために値の設定にメソッドを設定してみよう、

using System;

public class Bird
{
    public string Name;

    //これで直接操作できない
    private int Age;
    
    public void Talk( ) {
        Console.WriteLine( "ワタシハ{0}。年は{1}だよ。", 
            this.Name, this.Age);
    }

    public void SetAge( int age ) {
        if ( age > 0 ) this.Age = age;
    }
}

class Program
{
    static void Main( string[ ] args ) {
        Bird b = new Bird( );
        b.Name = "インドリ";
        b.SetAge( 29 );
        b.Talk( );

        b.Name = "ドリィちゃん";
        b.SetAge( -20 );
        b.Talk( );
        Console.WriteLine( 
            "ドリィちゃん、ボクと同じ年齢なんだね♪" );
    }
}

これで年齢にマイナス値を入力したら、その罰として前の人の年齢が表示されるようになるよ。
インドリィちゃん「この屈辱忘れるものかぁぁ」
ビック!ちょっと後がまずいことになるかも・・・それはさておき、フィールドを保護するために一々Set○○、Get○○って 名前のメソッドを作るのは面倒だし見栄えが悪いよね。だからC#にはもっといい方法が用意されているんだ。早速見てみよう。
using System;

public class Bird
{
    private string m_Name;

    public string Name {
        get { return m_Name; } //<ーツンツン
        set { m_Name = value; } //<ーツンツン
    }
    private int m_Age;

    public int Age { 
        get { return m_Age; } //<ーツンツン
        set { 
            if ( value > 0 ) m_Age = value;  //valueは特別な変数
        } 
    }
    
    public void Talk( ) {
        Console.WriteLine( "ワタシハ{0}。年は{1}だよ。", 
            this.m_Name, this.m_Age);
    }

}

この構文がプロパティなんだ。この構文を詳しく突付いてみよう。
まずは始めのプロパティの宣言は・・・
public int Age { プログラム } 

プロパティが見える範囲、 ってなっている。これはプロパティの型プロパティの名前の三つを指定しているんだ。
プロパティが見える範囲については色々あるから説明は後回しで、型と名前を考えてみよう。 型と名前はもうお馴染だよね?考え方はフィールド(変数)と変わらないピヨ。
プロパティとフィールドの違いは、
get { プログラム }
set { プログラム } 
があるところなんだ。
getはプロパティの値を取得する部分で、setはプロパティの値を設定する部分なんだ。 setの部分だけ注意が必要でvalueという特別な変数があるんだ。 これは今代入しようとしている値なんだ。
これは余談なんだけど実はプロパティは全てのオブジェクト指向言語に実装されているわけではないんだ。 それは何故かというと、メソッドでも実現できるから「メソッドで同じことが出来るからいいじゃん」という人がいるからなんだ。 だけどボク個人の意見としてはリフレクションを有効に使うためにはプロパティとメソッドを明確に分けたほうが良いと思うピヨ。
余談おしまい。この記事もおしまい。
別窓 | C# | コメント:0 | トラックバック:0 | ∧top | under∨
<<VB.NETをつつく10−構造体・モジュール。サブルーチン♪ | 無差別に技術をついばむ鳥 | C#をつつく11−クラス。サブルーチンの進化>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

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

∧top | under∨
| 無差別に技術をついばむ鳥 |