我继续反复弹跳,想要最好的标准化:
private MyOtherClass mc = new MyOtherClass(); // up here OK?
public MyClass()
{
// or down here?, mc = new MyOtherClass();
}
声明初始化的时间是什么时候?程序首次启动时?
答案 0 :(得分:2)
真正的差别很小。他们都编译成几乎相同的东西。主要取决于你的编码风格。您应该知道在调用超级构造函数之前已经初始化了字段,但依赖于这个事实将是不好的做法。
我更喜欢在构造函数中初始化我的所有字段,这样我就可以更好地控制它们的初始化顺序。
答案 1 :(得分:1)
要么是好的:这实际上是一个偏好问题,或者你想如何组织构造逻辑。
请注意,在构造函数运行之前,首先设置内联值。即,以下输出bar
:
public class MyClass
{
private string _member = "foo";
public string Member { get { return _member; } }
public MyClass()
{
_member = "bar";
}
}
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
Console.WriteLine(myClass.Member);
Console.ReadLine();
}
}
答案 2 :(得分:0)
在你的帖子中,你问“声明初始化的时间是什么时候?程序首次启动时?”。
其他答案都是正确的,但我只想强调一点:
private MyOtherClass mc = new MyOtherClass();
声明一个实例字段,并在实例化实例时初始化,而不是在程序启动时初始化。
如果您声明了静态字段:
private static MyOtherClass mc = new MyOtherClass();
这将在类型构造函数运行时初始化,这在第一次访问类的任何成员时发生(以Jon Skeet和Eric Lippert为例,比我更好地解释一些复杂的模块)。
在两种情况下都不会在程序启动时初始化字段。
答案 3 :(得分:0)
我想说的是:如果这只是一个独立的类,那么初始化的地方并不重要。当这个类成为基类时,那个时候可能很重要。具体来说,我说的是执行顺序。如果您希望首先使用基本init,请将该初始化移至构造函数。根据构造函数的声明方式,可能存在执行链的不同变体等等。所以答案是,它可能是重要的,也可能无关紧要。绝对没关系,如果密封的课程。但是一旦涉及继承,答案就是不稳定的。
答案 4 :(得分:0)
两种方式都没关系。对我来说,我提出了以下规则:
如果一个属性总是以相同的方式被启动,无论使用哪个构造函数,我都会在声明时启动它,所以我只有一次。让构造者保持清洁。
如果有不同的方法来初始化它,具体取决于我在构造函数体中初始化的所选构造函数。
public class SomeClass
{
private List<String> content = new List<String>();
private String searchKey;
public SomeClass()
{
searchKey = String.Empty;
}
public SomeClass(String searchKey)
{
this.seachKey = searchKey;
}
// some more code
}
最后回答你关于时间点的问题,当事情开始时:
在构造类的第一个实例时,将初始化静态字段。
构造此类的实例时,将初始化所有非静态字段,从声明中具有值的字段开始,然后执行构造函数体以初始化其余字段。
< / LI> 醇>