初始化实例变量

时间:2012-04-11 17:38:20

标签: c#

我想知道以下内容之间有什么区别,哪种方式最好:

public class ClassA
{
    public ClassB myClass = new ClassB();

    public void MethodA()
    {
         myClass.SomeMethod();
    }
}

或者这个:

public class ClassA
{
    public ClassB myClass = null;

    public ClassA()
    {
        myClass = new ClassB();
    }        

    public void MethodA()
    {
         myClass.SomeMethod();
    }
}

修改

我删除了IDisposable,请记住这只是一个例子,我的观点是看看哪种方式更好地实例化实例变量

3 个答案:

答案 0 :(得分:4)

都不是。

除非您有实际处置资源,否则不应实施IDisposable 只需在null中将字段设置为Dispose()几乎总是无用的。

回答这个问题,没关系 您应该使用更简单,更简单的第一版。

答案 1 :(得分:1)

ClassB是否是一次性的?如果是这样,那么你应该处理它而不是将其设置为nullClassA是否有其他一次性资源?如果是这样,他们应该被处置。如果没有任何可处理的内容,则无需实施IDisposable

仅仅因为ClassA实施处置并不意味着在这种情况下可以处理任何事情。事情也必须实现它。此外,如果您实际实施IDisposable,则会有recognised pattern for doing so

答案 2 :(得分:1)

第一个示例中的代码将由编译器转换为第二个示例中的代码。当你初始化定义它们的实例变量时,它实际上将初始化移动到构造函数的顶部(或者在构造函数之前的其他方法,这实际上是同样的事情)。

有些时候你不能做第一种情况(你所分配的东西太复杂,或依赖于尚不存在的数据)。但除此之外,这只是个人偏好。通常最好避免将这两种技术混合在同一个类中,因为对于读者而言,这有点难以理解。