-
C#のsetとgetの使い方
C# 言語には、代入関数 (get) と値関数 (set) という 2 つの関数があります。これは、C# 言語が生成する中間言語コードから明らかです。 C# は、ドメインの保護レベルをパブリックに設定して、ユーザーがクラスの外で任意に操作できるようにすることを推奨していません。これはあまりにも非OO、より具体的に言うと、あまりにも安全ではありません。クラスの外部で表示する必要があるすべてのフィールドについて、C# では属性を使用してそれらを表現することをお勧めします。属性は保管場所を表しません。これが属性とドメインの基本的な違いです。以下は典型的な属性設計です。
システムを使用する;
クラス私のクラス
{
int 整数;
public int 整数
{
get {整数を返す;}
{整数=値;}を設定します
}
}
クラステスト
{
パブリック静的 void Main()
{
MyClass MyObject=new MyClass();
Console.Write(MyObject.Integer);
MyObject.Integer++;
Console.Write(MyObject.Integer);
}
}
予想どおり、プログラムは 0 1 を出力します。属性は、メソッドをラップすることによって、プログラマにドメイン メンバーへの使いやすいアクセス インターフェイスを提供することがわかります。ここでの値は C# のキーワードであり、属性操作を実行するときの set の暗黙のパラメーター、つまり属性書き込み操作を実行するときの右辺値です。
属性は、読み取り専用 (取得)、書き込み専用 (設定)、および読み取り/書き込み (取得および設定) の 3 つのインターフェイス操作を提供します。ドメイン上のこれら 3 つの操作は同じ属性名で宣言する必要があり、分離することはできません。次の実装を参照してください。
クラス私のクラス
{
プライベート文字列名。
パブリック文字列名
{
get { 名前を返す }
}
パブリック文字列名
{
セット { 名前 = 値 }
}
}
Name 属性の実装を分離する上記の方法は間違っています。前の例のようにそれらをまとめるべきです。 3 つのプロパティ (読み取り専用、書き込み専用、読み取り/書き込み) は C# によって同じプロパティ名とみなされます。次の例を参照してください。
クラス私のクラス
{
protected int num=0;
public int 数値
{
セット
{
数値=値;
}
}
}
クラスMyClassDerived: MyClass
{
新しい public int 数値
{
得る
{
数値を返します。
}
}
}
クラステスト
{
パブリック静的 void Main()
{
MyClassDerived MyObject = new MyClassDerived();
//MyObject.Num= 1; //エラー!
((MyClass)MyObject).Num = 1;
}
}
MyClassDerived の属性 Num-get{} が MyClass の属性 Num-set{} の定義をブロックしていることがわかります。
もちろん、属性は単なるドメイン インターフェイス操作ではありません。属性の本質は、属性を抽出または割り当てるときに、プログラム ロジックに基づいて特定のチェック、警告、その他の追加操作を実行できることです。
クラス私のクラス
{
プライベート文字列名。
パブリック文字列名
{
get { 名前を返す }
セット
{
if (値==null)
名前 = "マイクロソフト";
それ以外
名前=値;
}
}
}
属性のメソッドの性質上、当然属性にもメソッドのさまざまな変更が加えられます。属性にも 5 つのアクセス修飾子がありますが、属性のアクセス修飾子はパブリックであることがよくあります。そうしないと、クラスのパブリック インターフェイスとしての属性の意味が失われます。メソッドの複数のパラメーターによってもたらされるメソッドのオーバーロードなどの機能属性がないことに加えて、virtual、sealed、override、abstract などの修飾子は属性とメソッドに対して同じ動作をします。ただし、属性は本質的に 2 つのメソッドとして実装されます。 、それ 特定の行動には注意が必要です。次の例を見てください。
抽象クラスA
{
int y;
パブリック仮想整数X
{
取得 { 0 を返す }
}
パブリック仮想整数Y
{
取得 { y を返す }
セット { y = 値 }
}
パブリック抽象 int Z { セット;
}
クラスB:A
{
int z;
パブリックオーバーライド int X
{
get { returnbase.X + 1 }
}
パブリックオーバーライド int Y
{
セット {base.Y = 値 < 0: 値 }
}
パブリックオーバーライド int Z
{
取得 { z を返す }
セット { z = 値 }
}
}
この例では、継承のコンテキストにおけるプロパティの典型的な動作をいくつか取り上げます。ここで、抽象属性 Z が存在するため、クラス A は抽象として宣言される必要があります。サブクラス B は、base キーワードを通じて親クラス A の属性を参照します。クラス B は、Y セットを介してのみクラス A の仮想属性を上書きできます。
静的プロパティは、静的メソッドと同様、クラスの静的ドメイン変数にのみアクセスできます。外部メソッドと同じように、外部プロパティを宣言することもできます。