【问题标题】:Declaring instances differences [duplicate]声明实例差异[重复]
【发布时间】:2013-05-23 04:29:41
【问题描述】:

以下代码片段有什么区别?

Form1 form1 = new Form1();

Form1 form1;

public Class1()
{
    form1 = new Form1();
}

【问题讨论】:

标签: c# winforms


【解决方案1】:

在您的具体示例中,没有区别。两者都将编译为相同的 IL。 这只是偏好/风格的问题。

总的来说,区别如下:

第一个版本不能访问这个类的其他实例成员,第二个版本可以。

【讨论】:

    【解决方案2】:

    不同之处在于,在第二种情况下,您可以准确控制初始化发生的时间。

    使用内联初始化,您不能依赖一个来初始化另一个:

    int a = 42;
    int b = a; // not definitely known to have a value yet
    

    当您在构造函数中初始化它们时,您可以控制它们的运行顺序:

    int a, b;
    
    public Class1() {
      a = 42;
      b = a;
    }
    

    除此之外,没有任何真正的区别。内联初始化将由编译器放置在构造函数中,因为这是唯一可以进行此类初始化的地方。

    【讨论】:

      【解决方案3】:

      在第一个中,您只是在类中初始化变量,在第二个中,您在构造函数中初始化变量。

      两者几乎没有任何性能权衡。 除了语义上的简单性,它是你的选择,你继续前进。

      阅读更多here

      【讨论】:

        【解决方案4】:

        在第二个选项中,您声明类型为Form1 的引用,它不包含任何内容(无对象),直到您在构造函数中使用new 关键字对其进行初始化。在第一个选项中,您立即声明和初始化。

        【讨论】:

          【解决方案5】:

          第一个片段的结果是 form1 将包含 Form1 类的一个新实例。

          第二个片段没有创建一个新的实例,只是一个未初始化的变量(好吧它会被初始化为null)。

          综合起来就是:

          Form1 form1;
          
          public Class1()
          {
              form1 = new Form1();
          }           
          

          现在上面的代码片段是类的一部分,当您创建此类的实例时,它将调用 Class1,从而将 form1 分配给 Form1 的新实例。例如:

          class Class1
          {
              Form1 form1;
          
              public Class1()
              {
                  form1 = new Form1();
              }           
          }
          
          c = Class1();
          

          c会调用Class1的构造函数,它调用new Form1()并赋值给form1。

          【讨论】:

            【解决方案6】:

            根据 C# 特定语言规范 10.11.3

            变量初始化器被转换为赋值语句,这些赋值语句在基类实例构造函数调用之前执行。这种排序确保所有实例字段在执行任何有权访问该实例的语句之前由其变量初始化程序初始化。

            在您的具体示例中,没有示例。但是,如果我们在这里运行本规范中的示例:

            using System;
            
            class A {
               int x = 1;
               int y;
               public A() {
                   y = -1;
               } 
            }
            

            当 new A() 被调用时,x = 1 和 y = 0(默认值)的输出,直到构造函数被执行。

            【讨论】:

              猜你喜欢
              • 2013-05-28
              • 2017-11-26
              • 1970-01-01
              • 2015-05-25
              • 2020-06-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多