0

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);
            }
    
        }
    }
    
4

2 回答 2

1

1) 正在使用“new class1();”创建一个类的新实例;没有将其分配给变量的有效方法来实例化它?

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

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

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

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

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

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