[英]What is the difference between these two C# class constructors?
不是真正的2個構造函數,而是3個,但是其中2個是重載的。
這是我前一段時間觀看的一些教程的原始內容。
public Animal() { this.height=0; this.weight=0; this.name="No Name"; this.sound = "No Sound"; } public Animal(double height, double weight, string name, string sound) { this.height=height; this.weight=weight; this.name=name; this.sound = sound; }
我從軟件開發人員類中記住了這一點,所以我想知道以這種方式編寫它是否有意義,如果不是,那么如果在我的代碼中這會出錯嗎?
public Animal(double height=0, double weight=0, string name="No Name", string sound="No Sound") { this.height=height; this.weight=weight; this.name=name; this.sound = sound; }
因為我真的不知道是否可以將默認值放在這樣的類構造函數中。
我想說的主要是交流。 在第一種情況下,您要么提供所有值,要么不提供任何值(..並獲得默認值)。 編寫該代碼的人可能只有兩個選擇才有充分的理由。
在第二種情況下,您會更加靈活,例如,您可以選擇僅提供一個參數。這種情況可能會使此類對象變得無效。 和大多數事情一樣,這一切都取決於
你當然可以。 對於大多數代碼,您不會看到很大的區別(除了在第一種情況下,您將不必提供所有參數,也可以不提供任何參數)。
但是仍然存在細微的差異,以后可能會咬你。
請參閱,第一個代碼段聲明了一個所謂的默認構造函數和一個自定義構造函數,但是第二個代碼段僅聲明了一個自定義構造函數。
這是一個通用函數:
public static T Create<T>()
where T : new()
{
return new T();
}
如果調用Create<Animal>()
將得到以下內容:
錯誤CS0310:“
Animal
”必須是具有公共無參數構造函數的非抽象類型,才能在通用類型或方法“Program.Create<T>()
”中將其用作參數“ T”
因此,在預期的情況下,您的自定義構造函數不會替換默認的構造函數。
反思也是如此:
Activator.CreateInstance<Animal>();
將導致運行時異常:
未處理的異常:
System.MissingMethodException
:沒有為此對象定義無參數的構造函數。
因此,提供可訪問的默認構造函數也具有語義。 它告訴您的類實例在通過其默認構造函數創建時仍然有意義,並且不需要其他參數。 例如,它可用於涉及序列化的場景(某些序列化程序需要默認構造函數,而其他則不需要)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.