下面两种为类变量赋值的方法有什么区别。
Class A{
Private Variable v = someValue;
}
VS
Class A{
private Variable v;
//constructor
public A(){
this.v = someValue;
}
}
有人可以解释一下吗?
答案 0 :(得分:2)
从代码执行的角度来看,没有真正的区别。
如前所述,我更喜欢在构造函数之外声明变量;例如:
public class A {
private int aValue = 100;
}
而不是
public class A {
private int aValue;
public A() {
this.aValue = 100;
}
}
原因在于,如果您有多个构造函数,则不必继续编写this.aValue = 100;
并且您无法忘记"在构造函数中初始化变量。
正如其他人所说,有时候在构造函数中初始化变量会更好。
如果它会根据通过构造函数传递给它的值而改变,显然会在那里初始化它。
如果您正在初始化的变量可能会抛出错误而您需要使用try
/ catch
- 最好在构造函数中初始化它
如果您正在使用使用特定编码标准的团队,并且他们要求您在构造函数中初始化变量,则应该这样做。
鉴于自由而且没有上述内容,我仍然将其声明在顶部 - 这样可以更容易地在一个地方找到所有变量(根据我的经验)。
答案 1 :(得分:1)
以下2种分配值的方法有何区别? 一个类的变量。
一般没什么,但...... 类构造函数是创建新实例时的入口点,因此所有赋值都应该在那里进行,以提高可读性和可维护性。
如果要创建新实例,可以在构造函数中开始阅读源代码。这是一个例子。关于新实例的所有信息都在一个适当的位置。
public class C {
private int aValue;
private int bValue;
private int cValue;
private int dValue;
public C(int a, int b) {
this.aValue = a;
this.bValue = b;
this.cValue = a * b;
this.dValue = 1000;
}
}
答案 2 :(得分:0)
如果你看一下这堂课的MSIL:
namespace Demo
{
public class MyClass
{
private string str = "hello world";
private int b;
public MyClass(int b)
{
this.b = b;
}
}
}
.method public hidebysig specialname rtspecialname
instance void .ctor(int32 b) cil managed
{
// Code size 25 (0x19)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "hello world"
IL_0006: stfld string Demo.MyClass::str <---- RIGHT HERE
IL_000b: ldarg.0
IL_000c: call instance void [mscorlib]System.Object::.ctor()
IL_0011: ldarg.0
IL_0012: ldarg.1
IL_0013: stfld int32 Demo.MyClass::b
IL_0018: ret
} // end of method MyClass::.ctor
您可以看到构造函数已“注入”了this.str = "hello world"
。
因此,一旦编译完代码,就没有任何区别。然而,有很多很好的理由说明你不应该这样做(user1274820的答案有一些)