詳解C#中的屬性和屬性的應用。本站提示廣大學習愛好者:(詳解C#中的屬性和屬性的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C#中的屬性和屬性的應用正文
屬性
屬性是一種成員,它供給靈巧的機制來讀取、寫入或盤算公有字段的值。屬性可用作公共數據成員,但它們現實上是稱為“拜訪器”的特別辦法。這使得可以輕松拜訪數據,還有助於進步辦法的平安性和靈巧性。
在此示例中,TimePeriod 類存儲時光段。該類在外部以秒為單元存儲時光,然則名為 Hours 的屬性許可客戶端以小時為單元指准時間。 Hours 屬性的拜訪器履行小時與秒之間的轉換。
class TimePeriod { private double seconds; public double Hours { get { return seconds / 3600; } set { seconds = value * 3600; } } } class Program { static void Main() { TimePeriod t = new TimePeriod(); // Assigning the Hours property causes the 'set' accessor to be called. t.Hours = 24; // Evaluating the Hours property causes the 'get' accessor to be called. System.Console.WriteLine("Time in hours: " + t.Hours); } }
輸入:
Time in hours: 24
表達式主體界說
直接只前往表達式成果的屬性很罕見。上面的語法快捷方法應用 => 來界說這些屬性:
public string Name => First + " " + Last;
屬性必需為只讀,而且你不克不及應用 get 拜訪器症結字。
應用屬性
屬性聯合了字段和辦法的多個方面。關於對象的用戶,屬性顯示為字段,拜訪該屬性須要雷同的語法。關於類的完成者,屬性是一個或兩個代碼塊,表現一個 get 拜訪器和/或一個 set 拜訪器。當讀取屬性時,履行 get 拜訪器的代碼塊;當向屬性分派一個新值時,履行 set 拜訪器的代碼塊。不具有 set 拜訪器的屬性被視為只讀屬性。不具有 get 拜訪器的屬性被視為只寫屬性。同時具有這兩個拜訪器的屬性是讀寫屬性。
屬性具有多種用法:它們可在許可更改前驗證數據;它們可通明地地下某個類上的數據,該類的數據現實上是從其他源(例如數據庫)檢索到的;當數據被更改時,它們可采用行為,例如激發事宜或更改其他字段的值。
屬性在類塊中是按以下方法來聲明的:指定字段的拜訪級別,接上去指定屬性的類型和稱號,然後跟上聲明 get 拜訪器和/或 set 拜訪器的代碼塊。例如:
public class Date { private int month = 7; // Backing store public int Month { get { return month; } set { if ((value > 0) && (value < 13)) { month = value; } } } }
在此示例中,Month 是作為屬性聲明的,如許 set 拜訪器可確保 Month 值設置為 1 和 12 之間。 Month 屬性應用公有字段來跟蹤該現實值。屬性的數據的真實地位常常稱為屬性的“後備存儲”。屬性應用作為後備存儲的公有字段是很罕見的。將字段標志為公有可確保該字段只能經由過程挪用屬性來更改。
。
get 拜訪器
get 拜訪器體與辦法體類似。它必需前往屬性類型的值。履行 get 拜訪器相當於讀取字段的值。例如,當正在從 get 拜訪器前往公有變量而且啟用了優化時,對 get 拜訪器辦法的挪用由編譯器停止內聯,是以不存在辦法挪用的體系開支。但是,因為在編譯時編譯器不曉得在運轉時現實挪用哪一個辦法,是以沒法內聯虛擬 get 拜訪器。以下是前往公有字段 name 的值的 get 拜訪器:
class Person { private string name; // the name field public string Name // the Name property { get { return name; } } }
當援用屬性時,除非該屬性為賦值目的,不然將挪用 get 拜訪器以讀取該屬性的值。例如:
Person person = new Person(); //... System.Console.Write(person.Name); // the get accessor is invoked here
get 拜訪器必需以 return 或 throw 語句終止,而且掌握權不克不及分開拜訪器體。
經由過程應用 get 拜訪器更改對象的狀況不是一種好的編程作風。例如,以下拜訪器在每次拜訪 number 字段時都邑發生更改對象狀況的反作用。
private int number; public int Number { get { return number++; // Don't do this } }
get 拜訪器可用於前往字段值,或用於盤算並前往字段值。例如:
class Employee { private string name; public string Name { get { return name != null ? name : "NA"; } } }
在上一個代碼段中,假如纰謬 Name 屬性賦值,它將前往值 NA。
set 拜訪器
set 拜訪器相似於前往類型為 void 的辦法。它應用稱為 value 的隱式參數,此參數的類型是屬性的類型。鄙人面的示例中,將 set 拜訪器添加到 Name 屬性:
class Person { private string name; // the name field public string Name // the Name property { get { return name; } set { name = value; } } }
當對屬性賦值時,用供給新值的參數挪用 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
在 set 拜訪器中,對部分變量聲明應用隱式參數稱號 value 是毛病的。
此例解釋了實例、靜態和只讀屬性。它從鍵盤接收雇員的姓名,按 1 遞增 NumberOfEmployees,並顯示雇員的姓名和編號。
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); } }
輸入:
Employee number: 108 Employee name: Claude Vige
此示例解釋若何拜訪基類中由派生類中具有統一稱號的另外一個屬性所隱蔽的屬性。
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); } }
輸入:
Name in the derived class is: John, Manager Name in the base class is: Mary
以下是上一個示例中的要點:
派生類中的屬性 Name 隱蔽基類中的屬性 Name。在這類情形下,派生類的屬性聲明中應用 new 潤飾符:
public new string Name
轉換 (Employee) 用於拜訪基類中的隱蔽屬性:
((Employee)m1).Name = "Mary";
在此例中,Cube 和 Square 這兩個類完成籠統類 Shape,偏重寫它的籠統 Area 屬性。留意屬性上 override 潤飾符的應用。法式接收輸出的邊長並盤算正方形和立方體的面積。它還接收輸出的面積並盤算正方形和立方體的響應邊長。
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); } }
輸入:
Enter the side: 4 Area of the square = 16.00 Area of the cube = 96.00 Enter the area: 24 Side of the square = 4.90 Side of the cube = 2.00