簡體   English   中英

應該避免在無參數構造函數中初始化嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM