类的变量的赋值之间的差异

时间:2016-06-06 05:24:01

标签: class oop variables object constructor

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

Class A{
 Private Variable v = someValue;
}

VS

Class A{
    private Variable v;

    //constructor
    public A(){
        this.v = someValue;
    }
}

有人可以解释一下吗?

3 个答案:

答案 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 - 最好在构造函数中初始化它

  • 如果您正在使用使用特定编码标准的团队,并且他们要求您在构造函数中初始化变量,则应该这样做。

鉴于自由而且没有上述内容,我仍然将其声明在顶部 - 这样可以更容易地在一个地方找到所有变量(根据我的经验)。

请参阅此重复答案:https://stackoverflow.com/a/3919225/1274820

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