簡體   English   中英

靜態構造方法與構造函數

[英]static construction method vs constructor

在.NET框架中,我經常看到一個習慣用法,其中構造函數被靜態函數替換以構造新對象。

例如,對於BigInteger,沒有構造函數采用字符串,因此這是不可能的:

BigInteger i = new BigInteger("1000000103453543897");

但是有一個靜態Parse函數。

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;  
}

可能有很多原因 - 研究Factory方法模式

在您的示例中 - 許多人認為從構造函數中獲取/調用重要邏輯是一種不好的做法(我不想從構造函數中拋出異常,除非它是缺少的參數)。 使用工廠方法允許實現保證在對象構造中運行但不在構造函數中運行。

沒有構造函數接受字符串

你不能沒有技術上的原因。 設計人員只是選擇不復制已經存在的代碼並且不添加實用價值 - 它仍然是一行代碼,它更清楚你要做的事情,通過傳入錯誤的類型減少錯誤的數量等。

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

底線是 - 這種構造函數中的需要超過實現,測試,記錄和發布新功能的成本

請參閱@Moho獲取答案,工廠方法模式。

我個人認為BigInteger.Parse更好地覆蓋它。 在這種情況下,您有一些值是字符串,並且您希望它將其轉換為BigNumber。 具有字符串參數的構造函數不會告訴wat將要發生。 對於你所知道的只是用一個字符串代替不同的東西來做一個Console.WriteLine。 Parse告訴你更多......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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