c#におけるget setの使用

5001 ワード

c#を早期に学習する過程で、このような文によく遭遇します.
public string StudentName
{
      get{return stuName;}
      set{stuName=value;}
}
なぜこんなことになったのかよく分からなかった.c#を深く学んだ後、またそれに対して1つの総括をすることができません.今日は『Visual c#.netプログラミングチュートリアル』という本を読んで、よくまとめました.メモをとります.多くのオブジェクト向けプログラミング言語では、属性{Student stu=new Studio();Console.Write(stu.StudentName);Console.ReadKey()}}
上のコードには、getアクセサとsetアクセサを含むプロパティStudentNameが定義されています.プロパティStudentNameはクラスStudentのフィールドstuNameをカプセル化しています.フィールドにアクセス制御子が付いていない場合はprivateとしてデフォルト設定されています.外部から直接アクセスすることはできません.stuNameフィールドにはStudentNameプロパティを使用して自由にアクセスできます.
 
属性のgetとsetは実行可能なプログラム文の組み合わせであり、動作の特徴を持っている.一方、getアクセサとsetアクセサを有する属性を使用する場合、フィールドを使用するように、左値としてデータを受け入れることができ、右値としてデータを出力することができ、システムは属性に従って文に現れる位置で、自動的にgetを呼び出すかsetを呼び出すかを選択する.
 
属性の読み書き制御
属性のgetとsetは1つしか使用できません.getだけでsetがない場合、この属性は読み出すことができ、書き込むことができません.setのみでgetがない場合、この属性は書き込みのみであり、読み出し不可である.
プロパティの詳細
getとsetがプログラムである以上、もちろんもっと多くのことをすることができます.合理的な分業は、フィールドを設計するのは内部の方法の使用を容易にするためであり、できるだけ外部と隔絶することである.設計属性は外部の使用を便利にすることを考慮しているが,外部に知られないデータは一切与えない.
 
詳細:
 
setアクセサはvoidを返す方法と似ています.valueと呼ばれる暗黙的なパラメータを使用します.このパラメータのタイプは属性のタイプです.次の例では、setアクセサはNameプロパティに追加されます.
public string Name 
{
   get 
   { 
      return name; 
   }
   set 
   {
      name = value; 
   }
}

プロパティに値を割り当てると、setアクセサが新しい値を指定するパラメータで呼び出されます.例:
e1.Name = "Joe";   // The set accessor is invoked here

setアクセサでローカル変数宣言に暗黙パラメータ名(value)を使用するのはエラーです.
コメント
プロパティは、使用するアクセサによって分類されます.
  • getアクセサのみを持つプロパティを読み取り専用プロパティと呼びます.読み取り専用プロパティに値を割り当てることはできません.
  • setアクセサのみを持つプロパティを書き込みのみと呼びます.書き込み属性のみは、付与されたターゲットとして以外は参照できません.
  • getとsetアクセサを同時に持つプロパティは読み書きプロパティです.

  • プロパティ宣言では、getおよびsetアクセサは、プロパティボディの内部で宣言する必要があります.
    getアクセサを使用してオブジェクトの状態を変更するのは、誤ったプログラミングスタイルです.たとえば、次のアクセサは、numberフィールドにアクセスするたびに、オブジェクトのステータスを変更する副作用を生じます.
    public int Number 
    {
       get
       {
          return number++;   // Don't do this
       }
    }

    getアクセサを使用してフィールド値を返すか、フィールド値を計算して返すことができます.例:
    public string Name 
    {
       get 
       {
          return name != null ? name : "NA";
       }
    }

    上記のコードセグメントでは、Name属性に値を割り当てなければ、NAの値が返されます.
    例1この例では、ベースクラスの派生クラスで同じ名前を持つ別の属性が非表示になっている属性にアクセスする方法を示します.//property_hiding.cs//Property hidingusing System;public class BaseClass {   private string name;   public string Name   {      get       {         return name;       }      set       {         name = value;       }   }}
    public class DerivedClass : BaseClass {   private string name;   public new string Name  //Notice the use of the new modifier   {      get       {         return name;       }      set       {         name = value;       }   }}
    public class MainClass {   public static void Main()    {      DerivedClass d1 = new DerivedClass();      d1.Name = "John";//Derived class property      Console.WriteLine("Name in the derived class is: {0}",d1.Name);      ((BaseClass)d1).Name = "Mary";//Base class property      Console.WriteLine("Name in the base class is: {0}",         ((BaseClass)d1).Name);}}出力Name in the derived class is:JohnName in the base class is:Mary以下は、派生クラスの属性Nameがベースクラスの属性Nameを隠すことに重点を置きます.この場合、派生クラスのこの属性宣言は、new修飾子:public new string Name{...変換(BaseClass)を使用してベースクラスの非表示属性にアクセスします:((BaseClass)d 1).Name="Mary";
     
    ------------------------------------------------------------------------------------------------------------------------------------------------------------
    クラス内の属性public class Studio{private string name public string Name{set{name=value;}//を定義します.ここではプライベート属性nameにget{return name;}//を割り当てる.ここでプライベート属性nameの値}}c#を取り出すクラスを定義する際には、通常、クラスで宣言されたオブジェクトをカプセル化し、外部からこの属性にアクセスできないようにします.上記のコードでset部分を削除すると,外部ではnameの値しか読み取れず,get部分を削除するとnameにのみ値を付与できる.これにより,外部からのプライベート属性nameへのアクセス権限を制御することができ,この書き方はC#の特性の一つである.
    もちろん、自分で関数を作成してnameに値を取り、値を割り当てることもできますが、これは面倒に見えます.
    属性が普通変数と異なるのは、普通変数が部屋に置かれているものであり、どのようにはっきりしているかにある.属性は部屋の入り口に門番を置いて、あなたは物を置いて彼を通らなければなりません.
    このドアを守る人は属性アクセス器で、物を持つのはgetで、物を置くのはsetです.どうやって置くかはそれで決めます.直接持って直接置くような気がしますが、差は多くありません.GET SETは対外的なインタフェースで、一般的にインスタンスの中でメンバーデータにアクセスするにはこのメンバーデータのアクセス方式がPUBLICが必要で、今C#はとても高級で、GETは取得で、SETは設定で、しかしそれは良い収縮性を提供して、GETとSETに対して単独でアクセス権限を設定することができますあるいは派生クラスのみがアクセスできるなど...従来に比べて、プロパティ・アクセサはなく、関数によってプライベート・メンバー・データを呼び出す必要があり、プロパティは効率的なアクセス・モードと簡単な書き込みを提供します.安全のためです~~フィールドはあなたが具体的に操作するデータなので彼の値は间违いを犯すことができなくて、しかしあなたはまたユーザーの间违いを避けることができません~~安全のために属性でフィールドに値を割り当てて、setの中であなたはデータの安全に対して検証することができて、getは更に简単にデータを検証してフィールドに値をあげますだからget setの中国语の意味は“设定”です;getの中国語の意味は「獲得」です.
    補足:
    getとsetは、主にプログラム内のデータ構造を隠すためにgetでその属性の値を取得するために自動的に呼び出され、setはその属性の値を設定します.setを使用するときに特殊な変数valueがあります.属性を設定するときの値です.
    value暗黙パラメータは、アクセサを設定したり、イベントハンドラを追加または削除したりするために使用されます.
    クラスの属性を設定するには、例えばクラス名を用いる.属性="割り当てset作用変数=クラス名.属性取値getの役割
    転載先:https://www.cnblogs.com/gallen-n/p/5502806.html