深入C#中g(shù)et與set的詳解
更新時間:2013年06月05日 15:46:04 作者:
本篇文章是對C#中的get與set進(jìn)行了詳細(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) 是錯誤的。
備注
屬性按如下方式,根據(jù)所使用的訪問器進(jìn)行分類:
只帶有 get 訪問器的屬性稱為只讀屬性。無法對只讀屬性賦值。
只帶有 set 訪問器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標(biāo)外,無法對其進(jìn)行引用。
同時帶有 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 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
以下是上例中顯示的重點(diǎn):
派生類中的屬性 Name 隱藏基類中的屬性 Name。在這種情況下,派生類的該屬性聲明使用 new 修飾符:
public new string Name
{
...
轉(zhuǎn)換 (BaseClass) 用于訪問基類中的隱藏屬性:
((BaseClass)d1).Name = "Mary";
釋二:
代碼如下:
public class Car
{private string color;
public string Color
{
get
{return color;
}
set
{color=value;
}
}
}
我的理解是:通過GET和SET對公有變量Color進(jìn)行讀寫操作,實(shí)際就是間接更改color私有變量的值,那既然如此。為何不設(shè)color為public,讓實(shí)例進(jìn)接對color進(jìn)行讀寫操作呢?
如果有一天,老板讓你把這個類改成
當(dāng)汽車的顏色改變時,同時計算一下汽車的《價格》屬性
那么如果直接對Color操作,你不是死定了?
“屬性”是.net的特色之一。
其實(shí)就相當(dāng)于方法,尤其是java中經(jīng)常會用到get、set方法(.net的有些思想就是java的)。
屬性的真實(shí)作用不只是為了更改某個成員變量的值
比如form的size屬性在set的同時要重畫form,如果你不想讓用戶對color修改,就不要提供set方法
是面向?qū)ο缶哂械?BR>set and get
它的用途:一般是對類里面的變量進(jìn)行操作. 而不是直接對類的變量進(jìn)行操作.
有一個很大的作用就是:便于維護(hù).
因?yàn)?
如果一個類的一個變量int a ,在其它包或命名空間類中使用了1000次,但是過了許久,你想把a(bǔ)改為b,
如果直接對變量a操作的話,就得需求修改整個程序的1000處. 如果用屬性了,就不會了,只需改這個方法即可
public int A
{
set
{
a = value;
}
get
{
return a;
}
}
放為:
public int B
{
set
{
b = value;
}
get
{
return b;
}
}
除去這個屬性之外的地方根本不需要改變
通過上面的講解。有一點(diǎn)點(diǎn)明白了。
是不是讓滿足一定條件讓GET和SET來改變類中的私有變量。而不能讓實(shí)例直接操作。像上面的代碼保證了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中通常這么使用.如果用變量的話就不好使用了。而且get,set中可以寫多個語句.如上的get.
不知道這樣解釋你滿意嗎?
屬性的訪問器包含與獲取(讀取或計算)或設(shè)置(寫)屬性有關(guān)的可執(zhí)行語句。訪問器聲明可以包含 get 訪問器或 set 訪問器,或者兩者均包含。聲明采用下列形式之一:
get {}
set {}
get 訪問器
get 訪問器體與方法體相似。它必須返回屬性類型的值。執(zhí)行 get 訪問器相當(dāng)于讀取字段的值。以下是返回私有字段 name 的值的 get 訪問器:
復(fù)制代碼 代碼如下:
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 屬性:
復(fù)制代碼 代碼如下:
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) 是錯誤的。
備注
屬性按如下方式,根據(jù)所使用的訪問器進(jìn)行分類:
只帶有 get 訪問器的屬性稱為只讀屬性。無法對只讀屬性賦值。
只帶有 set 訪問器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標(biāo)外,無法對其進(jìn)行引用。
同時帶有 get 和 set 訪問器的屬性為讀寫屬性。
在屬性聲明中,get 和 set 訪問器都必須在屬性體的內(nèi)部聲明。
使用 get 訪問器更改對象的狀態(tài)是一種錯誤的編程樣式。例如,以下訪問器在每次訪問 number 字段時都產(chǎn)生更改對象狀態(tài)的副作用。
復(fù)制代碼 代碼如下:
public int Number
{
get
{
return number++; // Don't do this
}
}
可以將 get 訪問器用于返回字段值,或用于計算字段值并將其返回。例如:
復(fù)制代碼 代碼如下:
public string Name
{
get
{
return name != null ? name : "NA";
}
}
在上述代碼段中,如果不對 Name 屬性賦值,它將返回值 NA。
示例 1
此例說明如何訪問基類中被派生類中具有同一名稱的另一個屬性隱藏的屬性。
復(fù)制代碼 代碼如下:
// 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
以下是上例中顯示的重點(diǎn):
派生類中的屬性 Name 隱藏基類中的屬性 Name。在這種情況下,派生類的該屬性聲明使用 new 修飾符:
public new string Name
{
...
轉(zhuǎn)換 (BaseClass) 用于訪問基類中的隱藏屬性:
((BaseClass)d1).Name = "Mary";
釋二:
代碼如下:
復(fù)制代碼 代碼如下:
public class Car
{private string color;
public string Color
{
get
{return color;
}
set
{color=value;
}
}
}
我的理解是:通過GET和SET對公有變量Color進(jìn)行讀寫操作,實(shí)際就是間接更改color私有變量的值,那既然如此。為何不設(shè)color為public,讓實(shí)例進(jìn)接對color進(jìn)行讀寫操作呢?
如果有一天,老板讓你把這個類改成
當(dāng)汽車的顏色改變時,同時計算一下汽車的《價格》屬性
那么如果直接對Color操作,你不是死定了?
“屬性”是.net的特色之一。
其實(shí)就相當(dāng)于方法,尤其是java中經(jīng)常會用到get、set方法(.net的有些思想就是java的)。
屬性的真實(shí)作用不只是為了更改某個成員變量的值
比如form的size屬性在set的同時要重畫form,如果你不想讓用戶對color修改,就不要提供set方法
是面向?qū)ο缶哂械?BR>set and get
它的用途:一般是對類里面的變量進(jìn)行操作. 而不是直接對類的變量進(jìn)行操作.
有一個很大的作用就是:便于維護(hù).
因?yàn)?
如果一個類的一個變量int a ,在其它包或命名空間類中使用了1000次,但是過了許久,你想把a(bǔ)改為b,
如果直接對變量a操作的話,就得需求修改整個程序的1000處. 如果用屬性了,就不會了,只需改這個方法即可
復(fù)制代碼 代碼如下:
public int A
{
set
{
a = value;
}
get
{
return a;
}
}
放為:
public int B
{
set
{
b = value;
}
get
{
return b;
}
}
除去這個屬性之外的地方根本不需要改變
通過上面的講解。有一點(diǎn)點(diǎn)明白了。
是不是讓滿足一定條件讓GET和SET來改變類中的私有變量。而不能讓實(shí)例直接操作。像上面的代碼保證了color屬性的安全性。
既然如此可不可以寫成
復(fù)制代碼 代碼如下:
set
{color=value*20; //value是不是相當(dāng)于Color的值
}
我當(dāng)初和你有一樣的想法.但是現(xiàn)在改變了。
舉個例子說明一下吧.
復(fù)制代碼 代碼如下:
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.
不知道這樣解釋你滿意嗎?
相關(guān)文章
基于C#的音樂播放器主Form實(shí)現(xiàn)代碼
這篇文章主要介紹了基于C#的音樂播放器主Form實(shí)現(xiàn)代碼,很實(shí)用的功能,需要的朋友可以參考下2014-08-08
WinForm中實(shí)現(xiàn)數(shù)據(jù)的異步加載與進(jìn)度可視化
在開發(fā)WinForm應(yīng)用程序時,經(jīng)常會遇到需要加載大量數(shù)據(jù)的場景,比如讀取文件、查詢數(shù)據(jù)庫或調(diào)用遠(yuǎn)程接口,如果這些操作直接在主線程中執(zhí)行,UI界面就會出現(xiàn)假死現(xiàn)象,所以本文將介紹如何使用.NET提供的BackgroundWorker組件,實(shí)現(xiàn)數(shù)據(jù)的異步加載與進(jìn)度可視化2025-09-09
c#中object、var和dynamic的區(qū)別小結(jié)
這篇文章主要給大家介紹了關(guān)于c#中object、var和dynamic的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
WPF實(shí)現(xiàn)圖片合成或加水印的方法【2種方法】
這篇文章主要介紹了WPF實(shí)現(xiàn)圖片合成或加水印的方法,結(jié)合實(shí)例形式分析了2種比較實(shí)用的WPF圖片操作相關(guān)技巧,需要的朋友可以參考下2017-03-03
c#生成excel示例sql數(shù)據(jù)庫導(dǎo)出excel
這篇文章主要介紹了c#操作excel的示例,里面的方法可以直接導(dǎo)出數(shù)據(jù)到excel,大家參考使用吧2014-01-01

