c#控制台程序中关于实例化和使用静态字段的问题
本文关键字:静态 字段 问题 实例化 程序 控制台 | 更新日期: 2023-09-27 18:10:17
c#新手。我最近做了一个测试,问一些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)甚至可以通过调用构造函数来创建类字段吗?
是的。类的字段通常在构造类时初始化。
- 是的;对于编译器或JITTER来说,一般来说,确定类构造函数中没有副作用是一个太复杂而无法考虑的问题,因此无法进行优化。
- 在任何实例构造函数运行之前,类型必须完全且成功地初始化。静态构造函数和字段初始化项的确切顺序是可配置的,并且在不同版本的DOT . NET框架中具有不同的默认顺序。
- 当任何构造函数完成时,返回类对象的一个有效实例;然而,这并不意味着实例必须"准备好采取行动"。例如,e-序列化通常依赖于运行默认构造函数,然后设置所有非默认属性来创建一个真正"准备使用"的实例。