C#中類的屬性訪問器--get和set分析
解釋一:
屬性的訪問器包含與獲取(讀取或計算)或設定(寫)屬性有關的可執行語句。訪問器宣告可以包含 get 訪問器或 set 訪問器,或者兩者均包含。宣告採用下列形式之一:
get
{
...
}
set
{
...
}
get 訪問器
get 訪問器體與方法體相似。它必須返回屬性型別的值。執行 get 訪問器相當於讀取欄位的值。以下是返回私有欄位 name 的值的 get 訪問器:
class Employee
{
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 屬性:
class Employee
{
private string name; //私有成員變數,the name field
public string Name //成員屬性(即對外公開的成員變數),the Name property
{
get
{
return name;
}
set
{
name = value;
}
}
}
當對屬性賦值時,用提供新值的引數呼叫 set 訪問器。例如:
e1.Name = "Joe"; // The set accessor is invoked here
在 set 訪問器中不能再宣告或者定義一個名為value的區域性變數,因為隱式引數名稱已經使用了value這一標識名稱。
備註:
屬性按如下方式,根據所使用的訪問器進行分類:
只帶有 get 訪問器的屬性稱為只讀屬性。無法對只讀屬性賦值。
只帶有 set 訪問器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標外,無法對其進行引用。
同時帶有 get 和 set 訪問器的屬性為讀寫屬性。
在屬性宣告中,get 和 set 訪問器都必須在屬性體的內部宣告。
使用 get 訪問器更改物件的狀態是一種錯誤的程式設計樣式。例如,以下訪問器在每次訪問 number 欄位時都產生更改物件狀態的副作用。
public int Number
{
get
{
return number++; //錯誤,在get訪問器中不能修改number的值
}
}
可以將 get 訪問器用於返回欄位值,或用於計算欄位值並將其返回。例如:
public string Name
{
get
{
return name != null ? name : "NA";
}
}
在上述程式碼段中,如果沒有對 Name 屬性賦值,它將返回值 NA。
如何訪問基類中被派生類中具有同一名稱的另一個屬性隱藏的屬性,舉例說明:
// property_hiding.cs
// Property hiding
using System;
public class BaseClass
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value; //value為隱形引數
}
}
}
public class DerivedClass : BaseClass
{
private string name;
public new string Name // 派生類中定義一個與基類中同名的屬性,注意使用了new修飾符
{
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處。 如果用屬性了就不會了,屬性名稱可以不變只須修改get和set訪問器程式碼即可。
public int A
{
set
{
a = value;
}
get
{
return a;
}
}
修改為:
public int A
{
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。
相關文章
- JavaScript get set 訪問器屬性JavaScript
- 原型鏈上的get與set訪問器屬性原型
- 私有屬性的Get Set 與 Public
- C#訪問或修改私有類、函式、變數、屬性C#函式變數
- vue3計算屬性的可寫屬性 set 與 getVue
- C# Get SetC#
- JavaScript物件的資料屬性與訪問器屬性JavaScript物件
- JavaScript訪問物件的屬性和方法JavaScript物件
- Python中訪問私有屬性和私有方法Python
- 深入理解物件的資料屬性與訪問器屬性物件
- Vue之computed(計算屬性)詳解get()、set()Vue
- 一、訪問物件屬性和方法的操作物件
- java反射呼叫set和get方法的通用類Java反射
- Python 訪問和設定私有屬性Python
- 子類擁有父類物件所有的屬性和方法,但無法訪問物件
- C#中屬性的解析C#
- Set size 屬性
- python:get和setPython
- C# 類相同屬性賦值C#賦值
- C#屬性和lamdaC#
- 淺談對屬性描述符__get__、__set__、__delete__的理解delete
- AWS身份和訪問管理模組新增標籤和基於屬性的訪問控制能力
- js訪問物件屬性的2個方法JS物件
- Bean類自動生成判斷null值的Set()和Get()方法BeanNull
- lombok get/set 與 JavaBean get/setLombokJavaBean
- 類的靜態屬性和方法
- 014、Vue3+TypeScript基礎,computed計算屬性中使用get和set方法來讀取和修改VueTypeScript
- 初學 PHP __set ( ) 和 __ get ( )PHP
- C# 隨機給一個全部資訊都未知的類型別,如何獲取該類的類名、屬性個數、屬性名、屬性的資料型別、屬性值?C#隨機資料型別
- C# RESTful API 訪問輔助類C#RESTAPI
- C#反射設定屬性值和獲取屬性值C#反射
- SQL Server 生成C#公共實體屬性和私有屬性SQLServerC#
- 使用CloseableHttpClient 訪問 http 和https 的get請求HTTPclient
- python中類物件及類屬性的介紹Python物件
- C#裡面標籤的屬性和事件C#事件
- 客戶端 post ,get 訪問伺服器客戶端伺服器
- 深入理解JavaScript類與物件:揭秘類欄位和靜態屬性的妙用,js靜態屬性和例項屬性JavaScript物件JS
- 如何獲取 C# 類中發生資料變化的屬性資訊C#