在C#中声明或构造函数中初始化私有对象

时间:2013-04-12 21:46:12

标签: c# constructor

我继续反复弹跳,想要最好的标准化:

private MyOtherClass mc = new MyOtherClass(); // up here OK?

public MyClass()
{
  // or down here?, mc = new MyOtherClass();
}

声明初始化的时间是什么时候?程序首次启动时?

5 个答案:

答案 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
}

最后回答你关于时间点的问题,当事情开始时:

  1. 在构造类的第一个实例时,将初始化静态字段。

  2. 构造此类的实例时,将初始化所有非静态字段,从声明中具有值的字段开始,然后执行构造函数体以初始化其余字段。

    < / LI>