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

本文关键字:静态 字段 问题 实例化 程序 控制台 | 更新日期: 2023-09-27 18:10:17

c#新手。我最近做了一个测试,问一些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);
            }
        }
    }
    

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

1)使用"new class1()"创建一个类的新实例,而不将其分配给变量,这是实例化它的有效方法吗?

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

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

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

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

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

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