[英]Initialization in a parameterless constructor should be avoided?
我的一些同事要求避免無參數構造函數,並且完全初始化。 因為他們告訴我,例如字符串屬性的默認初始化會快速隱藏找出錯誤來源的能力。
但是對象的標准初始化會提前防止引發 NullReferenceException。 單元測試難道不能防止那些“難以發現”的錯誤嗎?
那么在 C# 中這樣做的最佳實踐是什么?
如果我有一個包含 10 個屬性的類怎么辦? 如果我想避免使用無參數構造函數,屬性是否也應該通過構造函數的參數進行初始化? 是不是很啰嗦?
例如我有這個類,所以人們告訴我我不應該以這種方式進行默認初始化:
public class UserForCreationDto
{
public UserForCreationDto()
{
Username = "";
Email = "";
}
[Required]
[MaxLength(100)]
public string Username { get; set; }
[Required]
[MaxLength(100)]
public string Email { get; set; }
}
如果要將屬性初始化為默認值以外的其他內容,可以直接在定義中執行此操作:
public class UserForCreationDto
{
[Required]
[MaxLength(100)]
public string Username { get; set; } = "";
[Required]
[MaxLength(100)]
public string Email { get; set; } = "";
}
但是如果您想防止NullReferenceExceptions
,您還應該將 setter 設為私有。 鑒於您當前的實現,這兩個屬性仍然可以顯式設置為null
。
這就是為什么您應該始終 - 作為預防措施 - 在嘗試訪問其任何屬性之前驗證引用類型變量是否已初始化:
if (!string.IsNullOrEmpty(dto.Username) { ... }
應該避免在無參數構造函數中初始化嗎?
另一種提問方式是
應該避免副作用嗎?
避免副作用是有好處的,這可能是您的同事在不說這么多話的情況下談論的內容。 這與不變性和依賴注入的好處密切相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.