2013-11-26 136 views
4

在.NET框架中,我經常看到構造函數被靜態函數替換爲構造新對象的成語。靜態構造方法vs構造函數

例如與BigInteger的有沒有構造函數取一個字符串,所以這是不可能的:

BigInteger i = new BigInteger("1000000103453543897"); 

但有一個靜態解析功能。

BigInteger i = BigInteger.Parse("1000000103453543897"); 

爲什麼這樣的類設計經常被選中?

我能想到的唯一的一件事就是創建一個對象,然後拋棄。這是真的,這是主要原因嗎?或者還有其他原因?

BigInteger(string value) 
{ 
    BigInteger result = new BigInteger(); // this one just returned in a Parse function 

    // compute bigint 

    // copy result to this 
    data = new uint[maxLength]; 
    for (int i = 0; i < result.Length; i++) 
    data[i] = result.data[i]; 

    Length = result.dataLength; 
} 

回答

3

可能有很多原因 - 考證工廠方法模式

用你的例子 - 許多人認爲從構造函數中調用重要的邏輯是不好的做法(我不想從構造函數中拋出異常,除非它是缺少的參數)。使用工廠方法可以保證在對象構造時運行,但不在構造器中運行。

1

請參閱@Moho for answer,工廠方法模式。

我個人認爲BigInteger.Parse涵蓋了它更好。在這種情況下,你有一些值是一個字符串,並且你希望它將它轉換爲一個BigNumber。一個帶有字符串參數的構造函數不會告訴wat將會發生。對於你所知道的只是用字符串做一個Console.WriteLine而不是其他的東西。 Parse告訴你更多的東西......

+0

我認爲構造函數的隱含語義非常清晰:根據給定的參數以某種方式創建給定類型的值。這當然不包括使用參數來執行WriteLine()。雖然'Parse()'更清晰,因爲它解釋了參數實際意味着什麼。 – svick

2

沒有構造採取串

有沒有技術理由,你爲什麼不能。設計者只是選擇不復制已存在的代碼,並且沒有增加實用價值 - 它仍然是一行代碼,它是更清晰你正在嘗試做什麼,通過傳遞錯誤類型來減少錯誤的數量,等等。

它也使它與沒有非默認構造函數的其他數字類型一致(不能說int i = new int(4));

的底線是 - 在這樣的構造函數中的需要大於成本實施,測試,文檔和船舶的新功能。

+0

但你*可以*說'新的int()',所以它*看起來像'int'有一個構造函數。 (雖然它不是一個真正的構造函數,但它只是將一個值類型初始化爲其默認值。) – svick

+0

@svick true - 我已經在我的答案中闡明瞭這一點。 –