假設_property只由Property的setter設置,這是否是 代碼冗餘?
確切地說,它是多餘的。這是Properties的實際目的。我們不應該直接訪問類的字段。我們應該使用Property來訪問它們。所以在相應的setter中,我們可以嵌入任何邏輯,我們可以保證每次我們嘗試設置一個值時,這個邏輯都會再次被驗證。這個論證甚至適用於一個類的方法。在一個方法中,我們必須使用屬性而不是實際的字段。而且,當我們想要讀取一個字段的值時,我們應該使用相應的getter。
通常,屬性增強了封裝的概念,封裝是面向對象編程OOP的支柱之一。
很多時候,當我們想要設置一個值時,沒有任何邏輯應該應用。舉例如下例:
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
我們已經聲明瞭一個代表客戶的類。客戶對象應具有三個屬性Id
,FirstName
和LastName
。
一個直接的問題,當有人讀這個類時,爲什麼有人應該使用這裏的屬性?
答案也是一樣的,它們提供了封裝機制。但是讓我們考慮一下,從長遠來看,這對我們有什麼幫助。比方說,有一天,有人決定一個客戶的名字應該是長度小於20的字符串,如果上面的類被聲明如下:
public class Customer
{
public int Id;
public string FirstName;
public string LastName;
}
那麼我們就應該檢查的FirstName
長度在我們創建的每個實例中!否則,如果我們有所回升與性能的聲明,我們可以很容易地只利用Data Annotations
public class Customer
{
public int Id { get; set; }
[StringLength(20)]
public string FirstName { get; set; }
public string LastName { get; set; }
}
,就是這樣。另一種方法可能是以下幾點:
public class Customer
{
public int Id { get; set; }
private string firstName;
public string FirstName
{
get { return firstName }
set
{
if(value!=null && value.length<20)
{
firstName = value;
}
else
{
throw new ArgumentException("The first name must have at maxium 20 characters", "value");
}
}
}
public string LastName { get; set; }
}
具有重溫所有你的代碼,使該檢查考慮上述兩種方法的。物業贏得的結果很清楚。
宇宙射線和硬件錯誤總是會導致該值爲空。當我看到像這樣的東西時,我把它歸因於「小心謹慎」。內部字段可能有很多種方式(例如輸入的序列化),但是大多數方法都是非常特殊的,並且應該從上下文中清楚。 –