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

C#控制台程序关于静态字段实例化和使用的问题,c#,instantiation,output,C#,Instantiation,Output,这里是新手。我最近做了一个测试,问一些C代码的输出是什么。我没有确切的代码,但我已尝试从下面的内存中重新创建它。由于某种原因,这段代码没有编译(因为我对这里发生的事情有疑问,所以这段代码并不是很重要)。我最想记住的部分是创建所有类字段的行 以下是我的问题: 使用“new class1();”创建一个类的新实例而不将它赋给变量,这是实例化它的有效方法吗 每次实例化类时,静态字段是如何处理的 甚至可以通过调用构造函数来创建类字段吗 using System; using System.Collect

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

以下是我的问题:

  • 使用“new class1();”创建一个类的新实例而不将它赋给变量,这是实例化它的有效方法吗
  • 每次实例化类时,静态字段是如何处理的
  • 甚至可以通过调用构造函数来创建类字段吗

    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);
            }
    
        }
    }
    
  • 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);
            }
    
        }
    }
    
    对。类的字段通常在构造类时初始化

  • 对,;对于编译器或JITTER来说,一般来说,确定类构造函数中没有发生任何副作用是一个非常复杂的问题,因此无法对其进行优化
  • 在运行任何实例构造函数之前,必须完全且成功地初始化该类型。静态构造函数和字段初始值设定项的确切顺序是可配置的,并且在不同版本的dotnet框架中具有不同的默认顺序
  • 当任何构造函数完成时,将返回类对象的有效实例;然而,这并不意味着实例必须“准备好采取行动”。例如,e-serialization通常依赖于运行默认构造函数,然后设置所有非默认属性来创建真正“可供使用”的实例

  • 当显式定义静态构造函数时,第二点是正确的,但是当没有静态构造函数(如OP的示例中所示)时,静态字段的初始化可能会被运行时推迟到第一次访问它们时。见: