关于实例化和静态字段使用的C#控制台程序问题

时间:2013-04-20 04:32:35

标签: c# instantiation output

C#newbie here。我最近做了一个测试,询问一些C#代码的输出是什么。我没有确切的代码,但我试图从下面的内存中重新创建它。这段代码由于某种原因不能编译(因为我对这里发生的事情只有疑问,所以不是那么重要)。我试图记住的问题最多的部分是创建所有类字段的行。

以下是我的问题:

  1. 使用“new class1();”创建类的新实例没有将它赋给变量一个有效的实例化方法吗?
  2. 每次实例化类时,如何处理静态字段?
  3. 您是否可以通过调用构造函数来创建类字段?

    using System;
    using System.Collections.Generic;
    
    namespace CustomFunctionTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                new class1();
                new class1("E");
             }
        }
        public class class1
        {
    
            public static class1 test1 = new class1("A");
            private class1 b = new class1("B");
            public static class1 c = new class1("C");
    
            public class1()
            {
                Console.WriteLine("D");
            }
            public class1(string str)
            {
                Console.WriteLine(str);
            }
    
        }
    }
    

2 个答案:

答案 0 :(得分:1)

  

1)使用“new class1();”创建类的新实例没有将它赋给变量一个有效的实例化方法吗?

是。它的构造函数可以对静态对象执行某些操作,甚至可以某种方式保留。或者,它可能只是垃圾收集。高质量的代码?通常不会。

  

2)每次实例化类时,如何处理静态字段?

如果存在静态构造函数,则在初始化类型时静态构造函数之前初始化静态字段,并且仅初始化类型一次。在您的示例中,没有静态构造函数,因此如果静态字段被访问,运行时会推迟初始化。

  

3)你甚至可以通过调用构造函数创建类字段吗?

是。类的字段通常在构造类时初始化。

答案 1 :(得分:0)

  1. 是;一般来说,对于编译器或JITTER来说,确定类构造函数中没有出现副作用是一个太复杂的问题,因此无法进行优化。
  2. 在任何实例构造函数可以运行之前,必须完全且成功地初始化类型。静态构造函数和字段初始值设定项的确切顺序是可配置的,并且在不同版本的DOT NET框架中具有不同的默认顺序。
  3. 当任何构造函数完成后,返回类对象的有效实例;但是,这并不意味着实例必须准备好采取行动"。例如,电子序列化通常依赖于运行默认构造函数,然后设置所有非默认属性来创建一个真正准备好使用的实例"。