下面两种为类的变量赋值的方法有什么区别。
Class A{
Private Variable v = someValue;
}
与
Class A{
private Variable v;
//constructor
public A(){
this.v = someValue;
}
}
有人能解释一下吗?
从代码执行的角度来看,没有真正的区别。
正如前面的回答所说,我更喜欢在构造函数之外声明变量;例如:
public class A {
private int aValue = 100;
}
代替
public class A {
private int aValue;
public A() {
this.aValue = 100;
}
}
原因是,如果你有多个构造函数,你不必一直写this.aValue = 100;
,也不能"忘记"初始化构造函数中的变量。
然而,正如其他人所说,有时最好在构造函数中初始化变量。
如果它将根据通过构造函数传递给它的值进行更改,显然可以在那里初始化它。
如果您正在初始化的变量可能会引发错误,并且您需要使用
try
/catch
,那么在构造函数中初始化它显然更好如果你所在的团队使用特定的编码标准,并且他们要求你在构造函数中初始化变量,你应该这样做
如果没有上述任何一项,我仍然在顶部声明它——这使得在一个地方找到所有变量变得更容易(根据我的经验)。
请参阅此重复答案:https://stackoverflow.com/a/3919225/1274820
以下两种赋值方法之间有什么区别类的变量。
通常什么都没有,但。。。类构造函数是创建新实例时的一个入口点,因此为了可读性和可维护性,所有的赋值都应该在那里完成。
当您想要创建一个新的实例时,您可以开始在构造函数中读取源代码。下面是一个例子。关于新实例的所有信息都在一个适当的位置。
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;
}
}
如果您查看此类的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"
的赋值。
因此,一旦您的代码被编译,就没有什么区别了。然而,有很多很好的理由让你不应该这样做(用户1274820的回答中有一些)