C#中的屬性(get、set、value) - IT閱讀
文章推薦指數: 80 %
value 關鍵字用於定義由set 取值函式分配的值。
不實現set 取值函式的屬性是隻讀的。
不實現set 取值函式的屬性是隻讀的。
C#中的屬性(get、set、value)
首頁
最新
HTML
CSS
JavaScript
jQuery
Python3
Python2
Java
C
C++
Go
SQL
首頁
最新
Search
C#中的屬性(get、set、value)
2019-02-07254
C#語言在面向物件設計和程式設計中對資料安全提出了嚴格的要求,其中一個重要的原則就是資料封裝。
根據這一原則,C#程式設計中要求開發人員對特定類的資料欄位儘量不以公有方式提供給外界。
因此在類內部多數字段的訪問許可權被限定為private或是public,而這些欄位與外界的交流經常採用屬性來進行。
屬性使類能夠以一種公開的方法獲取和設定值,同時隱藏實現或驗證程式碼。
屬性是這樣的成員:它們提供靈活的機制來讀取、編寫或計算私有欄位的值。
可以像使用公共資料成員一樣使用屬性,但實際上它們是稱作“訪問器”的特殊方法。
這使得可以輕鬆訪問資料,此外還有助於提高方法的安全性和靈活性。
屬性使類能夠以一種公開的方法獲取和設定值,同時隱藏實現或驗證程式碼。
get屬性訪問器用於返回屬性值,而set訪問器用於分配新值。
這些訪問器可以有不同的訪問級別。
get訪問器體與方法體相似。
它必須返回屬性型別的值。
執行get訪問器相當於讀取欄位的值
get訪問器必須以return或throw語句終止,並且控制權不能離開訪問器體。
value關鍵字用於定義由set取值函式分配的值。
不實現set取值函式的屬性是隻讀的。
不實現set取值函式的屬性是隻讀的。
屬性的定義通常由以下兩部分組成:
1需要封裝的專用資料成員
privateint_nValue=1;
privatedouble_dValue=10.101;
privatechar_chValue='a';
2向外界提供訪問的公共屬性:
//讀寫屬性nValue:
publicintnValue
{
get
{
return_nValue;
}
set
{
_nValue=value;
}
}
//只讀屬性dValue:
publicdoubledValue
{
get
{
return_dValue;
}
}
//只寫屬性chValue:
publiccharchValue
{
set
{
_chValue=value;
}
}
當屬性的訪問器中不需要其他邏輯時,自動實現的屬性可使屬性宣告更加簡潔。
客戶端還可以通過這些屬性建立物件,例如下面的程式碼,編譯器將建立一個私有的匿名支援欄位,該欄位只能通過屬性的get和set訪問器進行訪問。
classCustomer
{//Auto-ImplPropertiesfortrivialgetandset
publicdoubleTotalPurchases{get;set;}
publicstringName{get;set;}
publicintCustomerID{get;set;}
//Constructor
publicCustomer(doublepurchases,stringname,intID)
{
TotalPurchases=purchases;
Name=name;
CustomerID=ID;
}
//Methods
publicstringGetContactInfo(){return"ContactInfo";}
publicstringGetTransactionHistory(){return"History";}
//..Additionalmethods,events,etc.
}
classProgram
{
staticvoidMain()
{
//Intializeanewobject.
Customercust1=newCustomer(4987.63,"Northwind",90108);
//Modifyaproperty
cust1.TotalPurchases+=499.99;
}
}
下面講一個如何使用自動實現的屬性實現輕量類:
此示例演示如何建立一個不可變輕量類,用於僅封裝一組自動實現的屬性。
當您必須使用引用型別語義時,請使用此種構造而不是結構。
請注意:對於自動實現的屬性,需要get和set訪問器。
要使該類不可變,請將set訪問器宣告為private。
但是,宣告私有set訪問器時,不能使用物件初始值來初始化屬性。
下面的示例演示兩種方法來實現具有自動實現屬性的不可變類。
第一個類使用建構函式初始化屬性,第二個類使用靜態工廠方法。
classContact
{
//Read-onlyproperties.
publicstringName{get;privateset;}
publicstringAddress{get;privateset;}
//Publicconstructor.
publicContact(stringcontactName,stringcontactAddress)
{
Name=contactName;
Address=contactAddress;
}
}
//Thisclassisimmutable.Afteranobjectiscreated,
//itcannotbemodifiedfromoutsidetheclass.Itusesa
//staticmethodandprivateconstructortoinitializeitsproperties.
publicclassContact2
{
//Read-onlyproperties.
publicstringName{get;privateset;}
publicstringAddress{get;privateset;}
//Privateconstructor.
privateContact2(stringcontactName,stringcontactAddress)
{
Name=contactName;
Address=contactAddress;
}
//Publicfactorymethod.
publicstaticContact2CreateContact(stringname,stringaddress)
{
returnnewContact2(name,address);
}
}
publicclassProgram
{
staticvoidMain()
{
//Somesimpledatasources.
string[]names={"TerryAdams","FadiFakhouri","HanyingFeng",
"CesarGarcia","DebraGarcia"};
string[]addresses={"123MainSt.","345CypressAve.","6781stAve",
"12108thSt.","89E.42ndSt."};
//Simplequerytodemonstrateobjectcreationinselectclause.
//CreateContactobjectsbyusingaconstructor.
varquery1=fromiinEnumerable.Range(0,5)
selectnewContact(names[i],addresses[i]);
//Listelementscannotbemodifiedbyclientcode.
varlist=query1.ToList();
foreach(varcontactinlist)
{
Console.WriteLine("{0},{1}",contact.Name,contact.Address);
}
//CreateContact2objectsbyusingastaticfactorymethod.
varquery2=fromiinEnumerable.Range(0,5)
selectContact2.CreateContact(names[i],addresses[i]);
//Consoleoutputisidenticaltoquery1.
varlist2=query2.ToList();
//Listelementscannotbemodifiedbyclientcode.
//CS0272:
//list2[0].Name="EugeneZabokritski";
//Keeptheconsoleopenindebugmode.
Console.WriteLine("Pressanykeytoexit.");
Console.ReadKey();
}
}
/*Output:
TerryAdams,123MainSt.
FadiFakhouri,345CypressAve.
HanyingFeng,6781stAve
CesarGarcia,12108thSt.
DebraGarcia,89E.42ndSt.
*/
上訴中,通過get存取器和set存取器將封裝好的專有資料成員和共同屬性關聯起來。
此時,value關鍵字是時候出場了。
在普通的C#程式中,一般不能通過常用的除錯手段獲得value值傳遞的詳細過程,不能像C++中一樣跟蹤指標的變化情況。
當使用如下語句給屬性賦值:
ClassValueCollector{...};
ValueCollectornewValue=newValueCollector();
newValue.nValue=10;
新物件newValue的私有資料成員_nValue通過屬性nValue的set方法由原來的1改變為10;
賦值語句的右值通過隱式引數value進入屬性set方法內,成功改變整型私有變數的值。
在這一過程中,value引數的型別是整型,與屬性的型別是一致的。
當屬性的型別改變為char,value引數的屬性也相應的改變為字元型。
這種引數型別的自動轉換時基於.NETFramework提供的型別轉換器而實現的,CLR將C#原始碼編譯成中間語言IL,在這種類彙編的高階機器語言中可以發現value引數的傳遞機制。
相關文章
C#中的屬性(get、set、value)
《隨筆四》——C#中的“屬性和索引器中的get和set訪問器的訪問修飾符”
spring提供讀取配置檔案中的屬性註解@Value
C#中的屬性,欄位,變數
C#中的屬性-Property
《隨筆七》——C#中的“屬性、靜態屬性”
C#中的屬性
Java中對類中的屬性使用set/get方法的意義和用法
java對類中的屬性使用set/get方法的作用
C#反射(Reflection)對類的屬性get或set值
C#如何訪問Lua中的屬性(1)
C#中FlagsAttribute屬性在enum中的應用
Springboot@Value註解讀取application.properties配置檔案中的屬性值
QML與C++混合程式設計(二):QML獲得C++類中的屬性
C#反射修改私有靜態成員變數反射獲取修改類中的屬性值
分類導航
HTML/CSS
HTML教程
HTML5教程
CSS教程
CSS3教程
JavaScript
JavaScript教程
jQuery教程
Node.js教程
服務端
Python教程
Python3教程
Linux教程
Docker教程
Ruby教程
Java教程
JSP教程
C教程
C++教程
Perl教程
Go教程
PHP教程
正則表達式
資料庫
SQL教程
MySQL教程
PostgreSQL教程
SQLite教程
MongoDB教程
Redis教程
Memcached教程
行動端
IOS教程
Swift教程
Advertisement
三度辭典
Copyright©2016-2021IT閱讀
Itread01.comAllRightsReserved.
0.001291036605835
延伸文章資訊
- 1Using set to change property value in a constructor, C# - Stack ...
Your understanding of the program flow is wrong. In your constructor when you call your propertie...
- 2PropertyInfo.SetValue 方法(System.Reflection) | Microsoft Docs
Type examType = typeof(Example); // Change the static property value. PropertyInfo piShared = exa...
- 3[C#] 利用反射動態設定物件屬性Property SetValue in Reflection
SetValue(model, value); //縮寫成一行 model.GetType().GetProperty(propertyName).SetValue(model, value);...
- 4C# Properties (Get and Set) - W3Schools
The set method assigns a value to the name variable. The value keyword represents the value we as...
- 5C# set 與get 用法與範例| 高清水_黑白講 - - 點部落
C# set 與get 用法與範例 ... //set 存取子"設定",用於處理計算及邏輯處理. 範例一數字運算 ... 透過公用屬性set { salary = value; }