C#中的屬性解析(get、set、value)_第1頁
C#中的屬性解析(get、set、value)_第2頁
C#中的屬性解析(get、set、value)_第3頁
C#中的屬性解析(get、set、value)_第4頁
C#中的屬性解析(get、set、value)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第C#中的屬性解析(get、set、value)目錄C#中的屬性(get、set、value)C#中屬性的定義

C#中的屬性(get、set、value)

C#語言在面向?qū)ο笤O(shè)計(jì)和編程中對數(shù)據(jù)安全提出了嚴(yán)格的要求,其中一個(gè)重要的原則就是數(shù)據(jù)封裝。根據(jù)這一原則,C#程序設(shè)計(jì)中要求開發(fā)人員對特定類的數(shù)據(jù)字段盡量不以公有方式提供給外界。因此在類內(nèi)部多數(shù)字段的訪問權(quán)限被限定為private或是public,而這些字段與外界的交流經(jīng)常采用屬性來進(jìn)行。

屬性使類能夠以一種公開的方法獲取和設(shè)置值,同時(shí)隱藏實(shí)現(xiàn)或驗(yàn)證代碼。

屬性是這樣的成員:它們提供靈活的機(jī)制來讀取、編寫或計(jì)算私有字段的值。

可以像使用公共數(shù)據(jù)成員一樣使用屬性,但實(shí)際上它們是稱作訪問器的特殊方法。這使得可以輕松訪問數(shù)據(jù),此外還有助于提高方法的安全性和靈活性。

屬性使類能夠以一種公開的方法獲取和設(shè)置值,同時(shí)隱藏實(shí)現(xiàn)或驗(yàn)證代碼。

get屬性訪問器用于返回屬性值,而set訪問器用于分配新值。這些訪問器可以有不同的訪問級別。

get訪問器體與方法體相似。它必須返回屬性類型的值。執(zhí)行g(shù)et訪問器相當(dāng)于讀取字段的值

get訪問器必須以return或throw語句終止,并且控制權(quán)不能離開訪問器體。

value關(guān)鍵字用于定義由set取值函數(shù)分配的值。

不實(shí)現(xiàn)set取值函數(shù)的屬性是只讀的。

屬性的定義通常由以下兩部分組成:

1、需要封裝的專用數(shù)據(jù)成員

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;

}

}

當(dāng)屬性的訪問器中不需要其他邏輯時(shí),自動實(shí)現(xiàn)的屬性可使屬性聲明更加簡潔??蛻舳诉€可以通過這些屬性創(chuàng)建對象,例如下面的代碼,編譯器將創(chuàng)建一個(gè)私有的匿名支持字段,該字段只能通過屬性的get和set訪問器進(jìn)行訪問。

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;

}

}

下面講一個(gè)如何使用自動實(shí)現(xiàn)的屬性實(shí)現(xiàn)輕量類:

此示例演示如何創(chuàng)建一個(gè)不可變輕量類,用于僅封裝一組自動實(shí)現(xiàn)的屬性。當(dāng)您必須使用引用類型語義時(shí),請使用此種構(gòu)造而不是結(jié)構(gòu)。

請注意:對于自動實(shí)現(xiàn)的屬性,需要get和set訪問器。要使該類不可變,請將set訪問器聲明為private。但是,聲明私有set訪問器時(shí),不能使用對象初始值來初始化屬性。

下面的示例演示兩種方法來實(shí)現(xiàn)具有自動實(shí)現(xiàn)屬性的不可變類。第一個(gè)類使用構(gòu)造函數(shù)初始化屬性,第二個(gè)類使用靜態(tài)工廠方法。

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存取器將封裝好的專有數(shù)據(jù)成員和共同屬性關(guān)聯(lián)起來。

此時(shí),value關(guān)鍵字是時(shí)候出場了。

在普通的C#程序中,一般不能通過常用的調(diào)試手段獲得value值傳遞的詳細(xì)過程,不能像C++中一樣跟蹤指針的變化情況。當(dāng)使用如下語句給屬性賦值:

ClassValueCollector{...};

ValueCollectornewValue=newValueCollector();

newValue.nValue=10;

新對象newValue的私有數(shù)據(jù)成員_nValue通過屬性nValue的set方法由原來的1改變?yōu)?0;

賦值語句的右值通過隱式參數(shù)value進(jìn)入屬性set方法內(nèi),成功改變整型私有變量的值。

在這一過程中,value參數(shù)的類型是整型,與屬性的類型是一致的。當(dāng)屬性的類型改變?yōu)閏har,value參數(shù)的屬性也相應(yīng)的改變?yōu)樽址汀?/p>

這種參數(shù)類型的自動轉(zhuǎn)換時(shí)基于.NETFramework提供的類型轉(zhuǎn)換器而實(shí)現(xiàn)的,CLR將C#源代碼編譯成中間語言IL,在這種類匯編的高級機(jī)器語言中可以發(fā)現(xiàn)value參數(shù)的傳遞機(jī)制。

C#中屬性的定義

屬性的定義

定義結(jié)構(gòu):

publicintMyIntProp{

get{

//getcode

}

set{

//setcode

}

}

定義屬性需要名字和類型。屬性包含兩個(gè)塊:get塊和set塊。訪問屬性和訪問字段一樣,當(dāng)取得屬性的值得時(shí)候,就會調(diào)用屬性中的get塊,因此get塊需要返回值,其返回值類型就是屬性的類型;當(dāng)我們?nèi)ソo屬性設(shè)置值得時(shí)候,就會調(diào)用屬性中的set塊,以此可以在set塊中通過value訪問到我們所設(shè)置的值。

eg:

//跟訪問字段的方式一樣

v1.MyIntProperty=600;//對屬性設(shè)置值,自動調(diào)用set塊

inttemp=v1.MyIntProperty//對屬性取值,自動調(diào)用get塊

需要注意的是,set方法和get方法可以不同時(shí)存在。

但是如果沒有g(shù)et塊,就不可以獲得取值;如果沒有set塊,就不能進(jìn)行設(shè)置值。

通過屬性訪問字段

一般而言,習(xí)慣于將字段設(shè)置為private,這樣外界就不能修改字段的值。這是我們可以通過定義屬性來設(shè)置字段和獲取字段的值。

eg:

privateintage;

publicintAge{//習(xí)慣字段小寫,屬性大寫

set{

if(value0)return;

//通

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論