淺析C# get set的簡單用法
關(guān)于C# get set的文章很多,但是筆者的這篇文章有它的特別之處,筆者用簡單的語言把c# get set講述的十分明了。
C# get set釋一:屬性的訪問器包含與獲?。ㄗx取或計算)或設(shè)置(寫)屬性有關(guān)的可執(zhí)行語句。
訪問器聲明可以包含get 訪問器或set 訪問器,或者兩者均包含。聲明采用下列形式之一:get {}set {} get 訪問器 get 訪問器體與方法體相似。它必須返回屬性類型的值。執(zhí)行 get 訪問器相當(dāng)于讀取字段的值。以下是返回私有字段 name 的值的 get 訪問器:
- private string name; // the name field
- public string Name // the Name property
- {
- get { return name; }
- }
當(dāng)引用屬性時,除非該屬性為賦值目標(biāo),否則將調(diào)用 get 訪問器讀取該屬性的值。例如:Employee e1 = new Employee();...Console.Write(e1.Name); // The get accessor is invoked here get 訪問器必須在return或throw 語句中終止,并且控制不能超出訪問器體。set 訪問器set 訪問器與返回 void 的方法類似。它使用稱為 value 的隱式參數(shù),此參數(shù)的類型是屬性的類型。
在下例中,set 訪問器被添加到 Name 屬性:
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
當(dāng)對屬性賦值時,用提供新值的參數(shù)調(diào)用 set 訪問器。例如:e1.Name = "Joe"; // The set accessor is invoked here在 set 訪問器中對局部變量聲明使用隱式參數(shù)名 (value) 是錯誤的。
C# get set備注:
屬性按如下方式,根據(jù)所使用的訪問器進行分類:只帶有g(shù)et 訪問器的屬性稱為只讀屬性。無法對只讀屬性賦值。只帶有 set 訪問器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標(biāo)外,無法對其進行引用。同時帶有 get 和 set 訪問器的屬性為讀寫屬性。
在屬性聲明中,get 和set 訪問器都必須在屬性體的內(nèi)部聲明。使用 get 訪問器更改對象的狀態(tài)是一種錯誤的編程樣式。例如,以下訪問器在每次訪問 number 字段時都產(chǎn)生更改對象狀態(tài)的副作用。
- 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 { ...轉(zhuǎn)換 (BaseClass) 用于訪問基類中的隱藏屬性: ((BaseClass)d1).Name = "Mary";
C# get set釋二: 代碼如下:
- public class Car
- {
- private string color;
- public string Color
- {
- get {return color; }
- set {color=value; }
- }
- }
我的理解是:通過GET和SET對公有變量Color進行讀寫操作,實際就是間接更改color私有變量的值,那既然如此。為何不設(shè)color為public,讓實例直接對color進行讀寫操作呢? 如果有一天,老板讓你把這個類改成當(dāng)汽車的顏色改變時,同時計算一下汽車的《價格》屬性那么如果直接對Color操作,你不是死定了? “屬性”是.net的特色之一。
其實就相當(dāng)于方法,尤其是java中經(jīng)常會用到get、set方法(.net的有些思想就是java的)。 屬性的真實作用不只是為了更改某個成員變量的值比如form的size屬性在set的同時要重畫form,如果你不想讓用戶對color修改,就不要提供C# get set方法 是面向?qū)ο缶哂械膕et 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是不是相當(dāng)于Color的值} 我當(dāng)初和你有一樣的想法.但是現(xiàn)在改變了。舉個例子說明一下吧.
- public class Car
- {
- public string Color
- {
- get {
- if(this.viewstate["color"]!= null)
- {
- return this.viewstate["color"];
- }
- return "":
- }
- set { this.viewstate["color"];=value; }
- }
- }
在asp.net中通常這么使用.如果用變量的話就不好使用了。而且C# get set中可以寫多個語句。
【編輯推薦】