1

在构造函数内部或外部创建成员有什么区别(如果有)?

示例 1:

public class Person
{
List<Person> friends = new List<Person>();

public Person()
{

}

}

示例 2:

public class Person
{
List<Person> friends;

public Person()
{
friends = new List<Person>();
}

}

我以 C# 为例,但这适用于任何 oop 语言。

两者之间有实际区别吗?出于某种原因,我将示例 2 描述为一种更简洁的实现方式。

4

3 回答 3

1

在 C# 中,我认为这并不重要。在构造实例时,在声明时初始化的变量(如果有)将在构造函数运行之前被初始化。如果这些变量没有被访问,那么它们之间就没有功能差异

为了获得更好的参考,请检查以下内容:-最佳实践:在构造函数或声明中初始化类字段?

从上面的链接中引用非常重要的一行(Quibblesome 说)

就最佳实践而言,前者比后者更不容易出错,因为有人可以轻松添加另一个构造函数而忘记链接它。

于 2013-10-19T19:43:19.287 回答
1

在此处剽窃 Oracle Java 教程:http: //docs.oracle.com/javase/tutorial/java/javaOO/initial.html

如您所见,您通常可以在声明中为字段提供初始值:

public class BedAndBreakfast {
    private boolean full = false;
}

当初始化值可用并且初始化可以放在一行时,这很有效。但是,这种形式的初始化由于其简单性而具有局限性。如果初始化需要一些逻辑(例如,错误处理或填充复杂数组的 for 循环),简单的赋值是不够的。实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。

于 2013-10-19T19:46:26.723 回答
1

我将尝试从Java的角度来分析它。除非您的变量/成员是static一个,否则没关系。示例 2 有时被称为lazy initialization您将朋友列表的初始化推迟到调用构造函数的地方。但是因为朋友不是static编译器,所以编译器会以与示例 2 类似的方式对待您的示例 1。从这里

但是,字段声明不是任何方法的一部分,因此它们不能像语句一样执行。相反,Java 编译器会自动生成实例字段初始化代码并将其放入类的构造函数或构造函数中。初始化代码按照它在源代码中出现的顺序插入到构造函数中,这意味着字段初始化器可以使用在它之前声明的字段的初始值。

所以编译器只是将您的示例 1 代码转换为示例 2,以便可以以类似的方式对其进行初始化。

于 2013-10-19T19:53:52.037 回答