【設計原則和建議】 屬性
基本
1.在.NET中屬性的本質實現是方法
- 雖然本質是方法,不過當作互斥變量來使用還是挺方便的,(如Hashtable.SyncRoot)
2.屬性應該表現出相對靜態的特征
- 在沒有其他代碼干擾的時候,訪問一個屬性無論多少次 應該返回同樣的結果 (DateTime.Now就是一個錯誤的設計)
3.屬性get方法一般不拋出異常
- 現在很多地方使用到了延遲加載的設計,所以某些時候還是會拋出異常的
4.謹慎使用集合類型的屬性
- 如直接返回List<T> 此類的元素可能,可能導致內部成員在外部被修改
- 盡量把集合類型的屬性設計為只讀的(沒有set)
- 遍歷集合類型的屬性可能導致性能問題
輸出結果如下,Users的get方法被調用了6次 (注意 這個例子中如果使用foreach而不是for 就沒有重復調用的問題)
public static List<string> Users
{
get
{
Console.WriteLine("Call");
return new List<string>() { "1", "2", "3" };
}
}
public static void Main()
{
for (int i = 0; i < Users.Count; i++)
{
Console.WriteLine(Users[i]);//屬性本質上還是方法 這里又去調用Users的get方法了
}
}

5.如果某個屬性是必須賦值的,把它放到構造函數里面去
//看到這種代碼真的想殺人啊
UserService service = new UserService();
service.UserId = 123435; //不賦值居然按照UserId=0來處理
service.Method1(parameter1);
service.Method2(parameter2);
6.屬性設計的初始目的是為了封裝對私有字段的訪問
7.推薦Pascal命名規則
8.一般情況下,字段名不需要包括類名
public class Company
{
public Guid Id { get; set; }
public string Name { get; set; }
public Guid CompanyId { get; set; }//Company的意思重復了
public string CompanyName { get; set; }//需要多打字
//代碼智能提示的時候不夠快速定位
}
對比
1.和字段對比
- 屬性提供了更為強大的,靈活的功能來操作字段
- 出于面向對象的封裝性,字段一般不設計為Public
- 屬性允許在set和get中編寫代碼
- 屬性允許控制set和get的可訪問性,從而提供只讀或者可讀寫的功能 (邏輯上只寫是沒有意義的)
- 屬性可以使用override 和 new
- 同樣的,可以在接口中聲明屬性
- 由于內聯的存在,簡單的屬性和字符的性能差不多
2.和方法對比
- 屬性使用方便
- 設計方向的不一樣,屬性偏向靜態,方法偏向動態
- 適當的時候,使用屬性 如 (Class.User 和 Class.GetUser())
部分內容引用自MSDN,FxCop 和其他第三方文章..
因為本人水平有限,如有遺漏或謬誤,還請各位高手指正
浙公網安備 33010602011771號