1. 程式人生 > >深入C#中get與set的詳解

深入C#中get與set的詳解

釋一:
屬性的訪問器包含與獲取(讀取或計算)或設定(寫)屬性有關的可執行語句。訪問器宣告可以包含 get 訪問器或 set 訪問器,或者兩者均包含。宣告採用下列形式之一:
get {}
set {}
get 訪問器
get 訪問器體與方法體相似。它必須返回屬性型別的值。執行 get 訪問器相當於讀取欄位的值。以下是返回私有欄位 name 的值的 get 訪問器:
複製程式碼 程式碼如下:
private string name;   // the name field
public string Name   // the Name property
{
   get
   {
      return name;
   }
}

當引用屬性時,除非該屬性為賦值目標,否則將呼叫 get 訪問器讀取該屬性的值。例如:
Employee e1 = new Employee();
...
Console.Write(e1.Name);   // The get accessor is invoked here
get 訪問器必須在 return 或 throw 語句中終止,並且控制不能超出訪問器體。
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 hiding
using 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: John
Name in the base class is: Mary
以下是上例中顯示的重點:
派生類中的屬性 Name 隱藏基類中的屬性 Name。在這種情況下,派生類的該屬性宣告使用 new 修飾符:
   public new string Name
   {
   ...
轉換 (BaseClass) 用於訪問基類中的隱藏屬性:
   ((BaseClass)d1).Name = "Mary";

釋二:
程式碼如下:
複製程式碼 程式碼如下:
public class Car
{private string color;
 public string Color
 {
   get
   {return color;
    }
   set
    {color=value;
    }
  }
}

我的理解是:通過GET和SET對公有變數Color進行讀寫操作,實際就是間接更改color私有變數的值,那既然如此。為何不設color為public,讓例項進接對color進行讀寫操作呢?

如果有一天,老闆讓你把這個類改成
當汽車的顏色改變時,同時計算一下汽車的《價格》屬性
那麼如果直接對Color操作,你不是死定了?

“屬性”是.net的特色之一。
其實就相當於方法,尤其是java中經常會用到get、set方法(.net的有些思想就是java的)。

屬性的真實作用不只是為了更改某個成員變數的值
比如form的size屬性在set的同時要重畫form,如果你不想讓使用者對color修改,就不要提供set方法

是面向物件具有的
set and get
它的用途:一般是對類裡面的變數進行操作. 而不是直接對類的變數進行操作.
有一個很大的作用就是:便於維護.
因為:
如果一個類的一個變數int a ,在其它包或名稱空間類中使用了1000次,但是過了許久,你想把a改為b,
如果直接對變數a操作的話,就得需求修改整個程式的1000處.  如果用屬性了,就不會了,只需改這個方法即可
複製程式碼 程式碼如下:
public int A
{
 set
 {
   a = value;
 }
 get
 {
   return a;
 }
}
放為:
public int B
{
 set
 {
   b = value;
 }
 get
 {
   return b;
 }
}

除去這個屬性之外的地方根本不需要改變
通過上面的講解。有一點點明白了。
是不是讓滿足一定條件讓GET和SET來改變類中的私有變數。而不能讓例項直接操作。像上面的程式碼保證了color屬性的安全性。
既然如此可不可以寫成
複製程式碼 程式碼如下:
set
{color=value*20;  //value是不是相當於Color的值
}

我當初和你有一樣的想法.但是現在改變了。
舉個例子說明一下吧.
複製程式碼 程式碼如下:
public class Car
{
 public string Color
 {
   get
   {
      if(this.viewstate["color"]!= null)
       {
       return this.viewstate["color"];
       }
       return "":
    }
   set
    {
      this.viewstate["color"];=value;
    }
  }
}

在asp.net中通常這麼使用.如果用變數的話就不好使用了。而且get,set中可以寫多個語句.如上的get.
不知道這樣解釋你滿意嗎?