Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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#_Constructor_Field_Initializing - Fatal编程技术网

C#施工人员

C#施工人员,c#,constructor,field,initializing,C#,Constructor,Field,Initializing,有人能告诉我在编写C构造函数时应该采取什么方法吗 在其他语言中,比如C++,一切都很好-通常不会使内部字段可见,而是为它们提供getter/setter 这意味着,您可以为类提供构造函数,这些构造函数可以初始化所有/部分本地成员,您会很高兴 然而,C#具有属性,这允许我们编写如下内容: Class x = new Class { Field1 = new Field1 ...., Field2 = new Field2 } 这允许对对象构造进行链接,并且,正如我所假设的,可以删除很多构造函数

有人能告诉我在编写
C
构造函数时应该采取什么方法吗

在其他语言中,比如
C++
,一切都很好-通常不会使内部字段可见,而是为它们提供getter/setter

这意味着,您可以为类提供构造函数,这些构造函数可以初始化所有/部分本地成员,您会很高兴


然而,
C#
具有
属性
,这允许我们编写如下内容:

Class x = new Class { Field1 = new Field1 ...., Field2 = new Field2 }
这允许对对象构造进行链接,并且,正如我所假设的,可以删除很多构造函数,如果我们没有
属性
,这将是必需的

如我所假设的,将其与属性的默认值结合起来,我们可以完全摆脱非专门化构造函数,它们实际上可以做一些工作

现在-删除冗余构造函数并允许通过字段初始化进行对象构造可以吗?

这种方法的缺点是什么?有没有人能给出一些关于组合字段和构造函数的用法的一般性建议,一些经验法则


谢谢。

在我看来,拥有你所谓的冗余构造函数没有什么错。如果你想定义一个构造函数是有意义的,那可能是因为你确实需要这样做。

构造函数可以用来强迫使用者向类提供值

我的经验法则是字段用于可选数据,而构造函数可用于强制要求的数据

不过,这个问题有点像是一种错误的二分法。C++的行为与C’--“字段”(实际上是属性-字段是类级变量)相同,通常被用作GATTES/SETDER来设置内部值,而新语法允许您设置字段只是

的速记。
Class x = new Class();
x.Field1 = new Field1();
x.Field2 = new Field2();

我自己的经验法则很简单:如果需要某种东西来完全构造对象,那么它应该是一个ctor参数


一个很好的例子是流助手对象之一,如StreamReader或BinaryReader。如果没有关联的流对象,它们就无法运行,因此必须在构造函数中指定该流对象。

最佳做法是在可用状态下创建对象;尽量限制对财产设定者的依赖


它减少了创建不完整的对象并导致代码不那么脆弱的可能性。

您发布的代码使用的是所谓的对象初始值设定项,它们实际上只是最近引入的语法糖。使用对象初始值设定项只是调用构造函数和设置属性的一种简捷方法。您应该继续在C#中使用构造函数,就像在其他语言中使用它们一样——一般规则是,如果类需要一个对象或值才能正确初始化,那么该参数应该通过构造函数传递。如果不需要该值,则将其设置为可设置属性是合理的


一般来说,我尽可能避免使用setter(有很多不可能的情况)。

在XAML中使用公共无参数构造然后进行属性初始化的方法很流行(必需?),很多WPF玩具都这样做

您面临的唯一问题是部分初始化的对象,但是您可以在尝试使用字段之前验证对象状态


就我个人而言,我在构造函数中创建临界值参数,我从对象的副本和一系列可选参数中创建复制构造函数,我还没有创建需要XAML使用的东西。

可以吗?那要看情况了


为了使用对象初始值设定项,您需要将公共设置项公开给所有字段,您可能不需要这样做。如果你愿意公开它们,那么我会说,继续移除构造函数。然而,仅仅因为你能做一些事情并不意味着你应该做。我想说,如果您发现所有字段都是可公开设置的,那么删除构造函数应该是您应该做的事情,不要仅仅为了删除构造函数而设置字段。

对象初始值设定项语法只是一种语法糖。即使在C#1中,你也可以写作

Class c = new Class();
c.Property1 = value1;
c.Property2 = value2;
c.Property3 = value3;
....
C#3基本上将语法缩短为:

Class c = new Class 
{
   Property1 = value1, 
   Property2 = value2, 
   Property3 = value3
   ....
}

constructor的要点不仅仅是设置字段,构造函数应该根据参数逻辑构造对象,这样当构造函数返回时,您得到的是一个可以使用的对象。

我怀疑您在这里指的是域对象,但在服务的情况下,通过构造函数将服务的依赖项注入,使服务更加自我记录,而不是“更新”依赖项。此外,这使您可以更轻松地使用依赖项注入容器。

这些不是字段,而是属性。其他语言(特别是C++)也有字段。在您的示例中,
Field1
是一个属性。我认为最初的问题不是关于可选参数,而是关于对象初始值。当然,可选参数是这里的另一个选项!它属于摆脱专业构造函数的观点,但是是的,没有直接提到它。使我的答案与其他人略有不同:-)