c# - 为什么可以将静态类的公共静态字段设置为等于不同静态类的公共静态字段?
问题描述
我在同一个 C# 源代码文件中有两个不同的类。顶部是一个名为:
static class Persist : object
与领域:
public static List<Weapon> AllWeapons = new List<Weapon>() {
new Weapon("King's Spatha", 10, 20),
new Weapon("Nofoot Claw", 7, 11)
};
将源文件进一步放在不同的类中(不嵌套在第一类中):
public static class King
我在该课程中尝试做的事情如下:
public static Weapon UsedWeapon = Persist.AllWeapons[0];
我遇到的问题不在于找出是否King.UsedWeapon.ID = "King's Spatha"
. 事实上,这段代码确实按预期工作。
问题是我不完全了解幕后发生的事情。类Persist
在类之前存在King
吗?在源代码中哪个类放在另一个之上有关系吗?
解决方案
定义的顺序没有任何影响。当首先访问类时,静态类和字段被“初始化”。
关于循环依赖的问题:如果依赖是循环的,就会开始初始化一个静态字段,但是如果依赖循环回到那个字段,在初始化完成之前,这个字段会被未初始化的使用!
例子:
public class X
{
public X y = Y.x;
}
public static class Y
{
public static X x = new X();
}
void Test()
{
X x = new X();
}
- 对象 x 已创建。
- xy 尝试用 Yx 初始化
- Yx 用 X 的新实例初始化
- 创建 X 的第二个实例
- 尝试用 Yx 初始化 Yxy
- Yx 的初始化已经开始,但是 Yx 仍然为空,所以...
- Yxy 初始化为 null。
- Yx 已准备好 X 的(不完整)实例
- xy 从 Yx 获取 X 的(不完整)实例
- x 的实例化完成(xy == null)
推荐阅读
- c# - 超过执行时间限制 c#,同时在递归中使用 Math.Pow()
- java - 在 Spring Boot 中创建用户时,角色存储库 findAll 方法返回 null
- sql - 是否可以强制 Oracle 在使用用户定义的视图和函数的查询中应用视图合并?
- javascript - React-Select - 替换自定义选项内容的组件
- apache - Apache 多个 VirtualHost 具有相同的服务器名称、相同的 IP 和端口但不同的 DocumentRoot,可能吗?
- javascript - 从层次结构javascript创建数组
- c - 尝试接收字符并删除空格
- peoplesoft - 应用程序引擎程序 - 发生 NULL 插入错误
- jquery - 仅在选中复选框时克隆单击的 div
- c# - 如何将 C++ 回调函数传递给 C# COM 方法