C#学习基本概念之属性使用
屬性結(jié)合了字段和方法的多個(gè)方面。 ?對于對象的用戶,屬性顯示為字段,訪問該屬性需要相同的語法。 ?對于類的實(shí)現(xiàn)者,屬性是一個(gè)或兩個(gè)代碼塊,表示一個(gè) get 訪問器和/或一個(gè) set 訪問器。 ?當(dāng)讀取屬性時(shí),執(zhí)行 get 訪問器的代碼塊;當(dāng)向?qū)傩苑峙湟粋€(gè)新值時(shí),執(zhí)行 set 訪問器的代碼塊。 ?不具有 set 訪問器的屬性被視為只讀屬性。 ?不具有 get 訪問器的屬性被視為只寫屬性。 ?同時(shí)具有這兩個(gè)訪問器的屬性是讀寫屬性。
與字段不同,屬性不作為變量來分類。 ?因此,不能將屬性作為 ref參數(shù)或 out參數(shù)傳遞。
屬性具有多種用法:它們可在允許更改前驗(yàn)證數(shù)據(jù);它們可透明地公開某個(gè)類上的數(shù)據(jù),該類的數(shù)據(jù)實(shí)際上是從其他源(例如數(shù)據(jù)庫)檢索到的;當(dāng)數(shù)據(jù)被更改時(shí),它們可采取行動(dòng),例如引發(fā)事件或更改其他字段的值。
屬性在類塊中是按以下方式來聲明的:指定字段的訪問級(jí)別,接下來指定屬性的類型和名稱,然后跟上聲明 get 訪問器和/或 set 訪問器的代碼塊。 ?
?public?class?Date{????????????private?int?month?=?7;??//?Backing?storepublic?int?Month{????????????????get{????????????????????return?month;}????????????????set{????????????????????if?((value?>?0)?&&?(value?<?13)){month?=?value;}}}}在此示例中,Month 是作為屬性聲明的,這樣 set 訪問器可確保 Month 值設(shè)置為 1 和 12 之間。 ?Month 屬性使用私有字段來跟蹤該實(shí)際值。 ?屬性的數(shù)據(jù)的真實(shí)位置經(jīng)常稱為屬性的“后備存儲(chǔ)”。屬性使用作為后備存儲(chǔ)的私有字段是很常見的。 ?將字段標(biāo)記為私有可確保該字段只能通過調(diào)用屬性來更改。 ?有關(guān)公共和私有訪問限制的更多信息,請參見訪問修飾符。
自動(dòng)實(shí)現(xiàn)的屬性提供用于簡單屬性聲明的簡化語法。 ?有關(guān)更多信息,請參見自動(dòng)實(shí)現(xiàn)的屬性。
get 訪問器
get 訪問器體與方法體相似。 ?它必須返回屬性類型的值。 ?執(zhí)行 get 訪問器相當(dāng)于讀取字段的值。 ?例如,當(dāng)正在從 get 訪問器返回私有變量并且啟用了優(yōu)化時(shí),對 get 訪問器方法的調(diào)用由編譯器進(jìn)行內(nèi)聯(lián),因此不存在方法調(diào)用的系統(tǒng)開銷。 ?然而,由于在編譯時(shí)編譯器不知道在運(yùn)行時(shí)實(shí)際調(diào)用哪個(gè)方法,因此無法內(nèi)聯(lián)虛擬 get 訪問器。 ?以下是返回私有字段 name 的值的 get 訪問器:
?class?Person{????????????private?string?name;??//?the?name?fieldpublic?string?Name????//?the?Name?property{????????????????get{????????????????????return?name;}}}當(dāng)引用屬性時(shí),除非該屬性為賦值目標(biāo),否則將調(diào)用 get 訪問器以讀取該屬性的值。 ?例如:
get 訪問器必須以 return 或 throw 語句終止,并且控制權(quán)不能離開訪問器體。
通過使用 get 訪問器更改對象的狀態(tài)不是一種好的編程風(fēng)格。 ?例如,以下訪問器在每次訪問 number 字段時(shí)都會(huì)產(chǎn)生更改對象狀態(tài)的副作用
private?int?number;????????public?int?Number{????????????get{????????????????return?number++;??}}get 訪問器可用于返回字段值,或用于計(jì)算并返回字段值。 ?例如:
class?Employee{????????????private?string?name;???????????public?string?Name{????????????????get{?return?name?!=?null???name?:?"NA";}}}在上一個(gè)代碼段中,如果不對 Name 屬性賦值,它將返回值 NA
set 訪問器
set 訪問器類似于返回類型為 void 的方法。 ?它使用稱為 value 的隱式參數(shù),此參數(shù)的類型是屬性的類型。 ?在下面的示例中,將 set 訪問器添加到 Name 屬性:
?class?Person{????????????private?string?name;??//?the?name?fieldpublic?string?Name????//?the?Name?property{????????????????get{?????????????????return?name;}???????????????set{name?=?value;}}}當(dāng)對屬性賦值時(shí),用提供新值的參數(shù)調(diào)用 set 訪問器。 ?例如:
???Person?person?=?new?Person();person.Name?=?"Joe";??//?the?set?accessor?is?invoked?here????????????????System.Console.Write(person.Name);??//?the?get?accessor?is?invoked?here可將屬性標(biāo)記為 public、private、protected、internal 或 protected internal。 ?這些訪問修飾符定義類的用戶如何才能訪問屬性。 ?同一屬性的 get 和 set 訪問器可能具有不同的訪問修飾符。 ?例如,get 可能是 public 以允許來自類型外的只讀訪問;set 可能是 private 或 protected。 ?有關(guān)更多信息,請參見 訪問修飾符。
可以使用 static 關(guān)鍵字將屬性聲明為靜態(tài)屬性。 ?這使得調(diào)用方隨時(shí)可使用該屬性,即使不存在類的實(shí)例。 ?有關(guān)更多信息,請參見 靜態(tài)類和靜態(tài)類成員。
可以使用 virtual 關(guān)鍵字將屬性標(biāo)記為虛屬性。 ?這樣,派生類就可以通過使用 override 關(guān)鍵字來重寫事件行為。 ?有關(guān)這些選項(xiàng)的更多信息,請參見 繼承。
重寫虛屬性的屬性還可以是 sealed 的,這表示它對派生類不再是虛擬的。 ?最后,可以將屬性聲明為 abstract。 ?這意味著類中沒有任何實(shí)現(xiàn),派生類必須編寫自己的實(shí)現(xiàn)。 ?有關(guān)這些選項(xiàng)的更多信息,請參見 抽象類、密封類及類成員。
對 static 屬性的訪問器使用 virtual、abstract或 重寫修飾符是錯(cuò)誤的。
此例說明了實(shí)例、靜態(tài)和只讀屬性。 ?它從鍵盤接受雇員的姓名,按 1 遞增 NumberOfEmployees,并顯示雇員的姓名和編號(hào)
???public?class?Employee{????????????public?static?int?NumberOfEmployees;???????private?static?int?counter;?????????private?string?name;????????????//?A?read-write?instance?property:public?string?Name{????????????????get?{?return?name;?}????????????????set?{?name?=?value;?}}????????????//?A?read-only?static?property:public?static?int?Counter{????????????????get?{?return?counter;?}}????????????//?A?Constructor:public?Employee(){????????????????//?Calculate?the?employee's?number:counter?=?++counter?+?NumberOfEmployees;}}????????class?TestEmployee{????????????static?void?Main(){Employee.NumberOfEmployees?=?107;Employee?e1?=?new?Employee();e1.Name?=?"Claude?Vige";System.Console.WriteLine("Employee?number:?{0}",?Employee.Counter);System.Console.WriteLine("Employee?name:?{0}",?e1.Name);}}????????/*?Output:Employee?number:?108Employee?name:?Claude?Vige*/此示例說明如何訪問基類中由派生類中具有同一名稱的另一個(gè)屬性所隱藏的屬性。
??public?class?Employee{????????????private?string?name;?????public?string?Name{????????????????get?{?return?name;?}????????set?{?name?=?value;?}}}????????public?class?Manager?:?Employee{????????????private?string?name;????????//?Notice?the?use?of?the?new?modifier:public?new?string?Name{????????????????get?{?return?name;?}????????????set?{?name?=?value?+?",?Manager";?}}}????????class?TestHiding{????????????static?void?Main(){Manager?m1?=?new?Manager();????????????????//?Derived?class?property.m1.Name?=?"John";????????????????//?Base?class?property.((Employee)m1).Name?=?"Mary";System.Console.WriteLine("Name?in?the?derived?class?is:?{0}",?m1.Name);System.Console.WriteLine("Name?in?the?base?class?is:?{0}",?((Employee)m1).Name);}}????????/*?Output:Name?in?the?derived?class?is:?John,?ManagerName?in?the?base?class?is:?Mary*/以下是上一個(gè)示例中的要點(diǎn):
派生類中的屬性 Name 隱藏基類中的屬性 Name。 ?在這種情況下,派生類的屬性聲明中使用 new 修飾符:
??public?new?string?Name轉(zhuǎn)換 (Employee) 用于訪問基類中的隱藏屬性:
??((Employee)m1).Name?=?"Mary";在此例中,Cube 和 Square 這兩個(gè)類實(shí)現(xiàn)抽象類 Shape,并重寫它的抽象 Area 屬性。 ?注意屬性上 override 修飾符的使用。 ?程序接受輸入的邊長并計(jì)算正方形和立方體的面積。 ?它還接受輸入的面積并計(jì)算正方形和立方體的相應(yīng)邊長。
??abstract?class?Shape{????????????public?abstract?double?Area{????????????????get;????????????????set;}}????????class?Square?:?Shape{????????????public?double?side;????????????public?Square(double?s)??//constructor{side?=?s;}????????????public?override?double?Area{????????????????get{????????????????????return?side?*?side;}????????????????set{side?=?System.Math.Sqrt(value);}}}????????class?Cube?:?Shape{????????????public?double?side;????????????public?Cube(double?s){side?=?s;}????????????public?override?double?Area{????????????????get{????????????????????return?6?*?side?*?side;}????????????????set{side?=?System.Math.Sqrt(value?/?6);}}}????????class?TestShapes{????????????static?void?Main(){????????????????//?Input?the?side:System.Console.Write("Enter?the?side:?");double?side?=?double.Parse(System.Console.ReadLine());????????//?Compute?the?areas:Square?s?=?new?Square(side);Cube?c?=?new?Cube(side);????????????????//?Display?the?results:System.Console.WriteLine("Area?of?the?square?=?{0:F2}",?s.Area);System.Console.WriteLine("Area?of?the?cube?=?{0:F2}",?c.Area);System.Console.WriteLine();????????????????//?Input?the?area:System.Console.Write("Enter?the?area:?");????????????????double?area?=?double.Parse(System.Console.ReadLine());//?Compute?the?sides:s.Area?=?area;c.Area?=?area;????????????????//?Display?the?results:System.Console.WriteLine("Side?of?the?square?=?{0:F2}",?s.side);System.Console.WriteLine("Side?of?the?cube?=?{0:F2}",?c.side);}}????????/*?Example?Output:Enter?the?side:?4Area?of?the?square?=?16.00Area?of?the?cube?=?96.00Enter?the?area:?24Side?of?the?square?=?4.90Side?of?the?cube?=?2.00備注:摘自https://msdn.microsoft.com/zh-cn/library/w86s7x04.aspx
轉(zhuǎn)載于:https://blog.51cto.com/jiaojusuimu/1876547
總結(jié)
以上是生活随笔為你收集整理的C#学习基本概念之属性使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bootstrap3 表格-带边框的表格
- 下一篇: 在spring boot 配置actua