类的变量赋值之间的差异



下面两种为类的变量赋值的方法有什么区别。

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的回答中有一些)

最新更新