Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态施工方法与施工方法_C#_.net_Class Design - Fatal编程技术网

C# 静态施工方法与施工方法

C# 静态施工方法与施工方法,c#,.net,class-design,C#,.net,Class Design,在.NET framework中,我经常看到这样一种习惯用法,即用静态函数替换构造函数来构造新对象 例如,对于BigInteger,没有构造函数接受字符串,因此这是不可能的: BigInteger i = new BigInteger("1000000103453543897"); 但是有一个静态解析函数 BigInteger i = BigInteger.Parse("1000000103453543897"); 为什么经常选择这样的课堂设计 我能想到的唯一一件事就是少了一个要创建的对象,

在.NET framework中,我经常看到这样一种习惯用法,即用静态函数替换构造函数来构造新对象

例如,对于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;  
}
BigInteger(字符串值)
{
BigInteger结果=新的BigInteger();//这个结果刚刚在解析函数中返回
//计算bigint
//将结果复制到此
数据=新uint[maxLength];
for(int i=0;i
可能有很多原因-研究工厂方法模式


在你的例子中,很多人认为从构造函数中调用(或不想从构造函数中抛出异常,除非它是一个缺失的参数)是一个坏的做法。使用工厂方法可以保证实现在对象构造时运行,但不能在构造函数中运行。

请参见@Moho以获取答案,工厂方法模式

我个人认为,
biginger.Parse
可以更好地涵盖它。在本例中,您有一个字符串值,并希望它将其转换为BigNumber。带有字符串参数的构造函数不会告诉wat将要发生。据您所知,它只是使用字符串而不是其他内容来执行Console.WriteLine<代码>解析告诉您更多

没有构造函数接受字符串

没有技术上的原因可以解释为什么你不能。设计人员只是选择不复制已经存在的代码,并且不增加任何实用价值——它仍然是一行代码,更清楚地知道您要做什么,通过传递错误的类型来减少错误的数量,等等

它还使它与其他没有非默认构造函数的数值类型一致(不能说
inti=newint(4)


底线是——这种构造函数的价值需要超过实现、测试、记录和发布新功能的成本。

但是你可以说
newint()
,所以看起来
int
有一个构造函数。(虽然它不是一个真正的构造函数,但它只是将一个值类型初始化为其默认值。)@svick true-我在回答中已经澄清了这一点。我认为构造函数的隐含语义非常清楚:以某种方式根据给定的参数创建给定类型的值。这当然不包括对参数执行
WriteLine()
。虽然
Parse()
更清楚,因为它解释了参数的实际含义。