深入C#中get與set的詳解

來源:互聯網
上載者:User

釋一:
屬性的訪問器包含與擷取(讀取或計算)或設定(寫)屬性有關的可執行語句。訪問器聲明可以包含 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.
不知道這樣解釋你滿意嗎?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.