自动实现的属性(C# 编程指南)(摘自MSDN)
2012-06-09 12:33
489 查看
在 C# 3.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。客户端代码还可通过这些属性创建对象。如下面的示例所示声明属性时,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问。
示例
下面的示例演示了一个具有某些自动实现的属性的简单类:
前面示例中所示的类是可变的。客户端代码可在对象创建后更改对象中的值。在包含大量行为(方法)以及数据的复杂类中,通常需要有公共属性。但是,对于仅封装一组值(数据)且只有极少行为或没有行为的较小类或结构,建议将 set 访问器声明为 private 以使对象不可变。
要使该类不可变,请将 set 访问器声明为 private。 但是,声明私有 set 访问器时,不能使用对象初始值来初始化属性。 必须使用构造函数或工厂方法。当您必须使用引用类型语义时,请使用此种构造而不是结构。
示例
此示例演示如何创建一个不可变轻量类,用于仅封装一组自动实现的属性。第一个类使用构造函数初始化属性,第二个类使用静态工厂方法。
View Code
编译器为每个自动实现的属性创建了后备字段。这些字段无法直接从源代码进行访问。如果您必须在属性的后备字段上使用特性,则应该只创建常规属性。
示例
下面的示例演示了一个具有某些自动实现的属性的简单类:
// This class is mutable. Its data can be modified from // outside the class. class Customer { // Auto-Impl Properties for trivial get and set public double TotalPurchases { get; set; } public string Name { get; set; } public int CustomerID { get; set; } // Constructor public Customer(double purchases, string name, int ID) { TotalPurchases = purchases; Name = name; CustomerID = ID; } // Methods public string GetContactInfo() {return "ContactInfo";} public string GetTransactionHistory() {return "History";} // .. Additional methods, events, etc. } class Program { static void Main() { // Intialize a new object. Customer cust1 = new Customer ( 4987.63, "Northwind",90108 ); //Modify a property cust1.TotalPurchases += 499.99; } }
前面示例中所示的类是可变的。客户端代码可在对象创建后更改对象中的值。在包含大量行为(方法)以及数据的复杂类中,通常需要有公共属性。但是,对于仅封装一组值(数据)且只有极少行为或没有行为的较小类或结构,建议将 set 访问器声明为 private 以使对象不可变。
要使该类不可变,请将 set 访问器声明为 private。 但是,声明私有 set 访问器时,不能使用对象初始值来初始化属性。 必须使用构造函数或工厂方法。当您必须使用引用类型语义时,请使用此种构造而不是结构。
示例
此示例演示如何创建一个不可变轻量类,用于仅封装一组自动实现的属性。第一个类使用构造函数初始化属性,第二个类使用静态工厂方法。
View Code
// This class is immutable. After an object is created, // it cannot be modified from outside the class. It uses a // constructor to initialize its properties. class Contact { // Read-only properties. public string Name { get; private set; } public string Address { get; private set; } // Public constructor. public Contact(string contactName, string contactAddress) { Name = contactName; Address = contactAddress; } } // This class is immutable. After an object is created, // it cannot be modified from outside the class. It uses a // static method and private constructor to initialize its properties. public class Contact2 { // Read-only properties. public string Name { get; private set; } public string Address { get; private set; } // Private constructor. private Contact2(string contactName, string contactAddress) { Name = contactName; Address = contactAddress; } // Public factory method. public static Contact2 CreateContact(string name, string address) { return new Contact2(name, address); } } public class Program { static void Main() { // Some simple data sources. string[] names = {"Terry Adams","Fadi Fakhouri", "Hanying Feng", "Cesar Garcia", "Debra Garcia"}; string[] addresses = {"123 Main St.", "345 Cypress Ave.", "678 1st Ave", "12 108th St.", "89 E. 42nd St."}; // Simple query to demonstrate object creation in select clause. // Create Contact objects by using a constructor. var query1 = from i in Enumerable.Range(0, 5) select new Contact(names[i], addresses[i]); // List elements cannot be modified by client code. var list = query1.ToList(); foreach (var contact in list) { Console.WriteLine("{0}, {1}", contact.Name, contact.Address); } // Create Contact2 objects by using a static factory method. var query2 = from i in Enumerable.Range(0, 5) select Contact2.CreateContact(names[i], addresses[i]); // Console output is identical to query1. var list2 = query2.ToList(); // List elements cannot be modified by client code. // CS0272: // list2[0].Name = "Eugene Zabokritski"; // Keep the console open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } /* Output: Terry Adams, 123 Main St. Fadi Fakhouri, 345 Cypress Ave. Hanying Feng, 678 1st Ave Cesar Garcia, 12 108th St. Debra Garcia, 89 E. 42nd St. */
编译器为每个自动实现的属性创建了后备字段。这些字段无法直接从源代码进行访问。如果您必须在属性的后备字段上使用特性,则应该只创建常规属性。
相关文章推荐
- 属性和索引器之间的比较(C# 编程指南)【msdn】
- C#编程之自动实现的属性
- C#学习基本概念之自动实现的属性
- 属性和索引器之间的比较(C# 编程指南)
- 枚举类型(C# 编程指南)(摘抄msdn.备忘)
- 使用属性(C# 编程指南)
- MSDN精选:Lambda 表达式(C# 编程指南)
- 显式接口实现(C# 编程指南)
- 用C#编程实现在Word文档中搜索文本(摘自博客园)
- 如何:创建和终止线程(C# 编程指南--MSDN)
- 如何:对制造者线程和使用者线程进行同步(C# 编程指南)(转自msdn)
- 如何:实现和调用自定义扩展方法(C# 编程指南)
- 属性(C# 编程指南)
- MSDN(C# 编程指南)继承http://msdn.microsoft.com/zh-cn/library/ms173149(VS.80).aspx
- 创建符合 .NET Framework 准则的事件(C# 编程指南) msdn
- 发现MSDN里面一个好东西:C# 编程指南
- 初读MSDN C#编程指南有感
- 显式接口实现(C# 编程指南)
- 索引器和属性(C# 编程指南)
- 传递参数(C# 编程指南)(http://msdn.microsoft.com/zh-cn/library/0f66670z(VS.80).aspx)