C#中的屬性(get、set、value) - IT閱讀

文章推薦指數: 80 %
投票人數:10人

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



請為這篇文章評分?