gpt4 book ai didi

c# - 初始化优先级——const vs readonly vs static readonly

转载 作者:太空狗 更新时间:2023-10-29 22:01:25 38 4
gpt4 key购买 nike

例子1

private const string _DefaultIconPath = _IconsPath + "default.ico";
private const string _IconsPath = "Icons/";

这些字符串在运行时的值:

  • _DefaultIconPath: "图标/default.ico"
  • _IconsPath: "图标/"

例子2

private readonly string _DefaultIconPath = _IconsPath + "default.ico";
private readonly string _IconsPath = "Icons/";

编译时错误:

A field initializer cannot reference the non-static field, method, or property '_IconsPath'

示例 3

private static readonly string _DefaultIconPath = _IconsPath + "default.ico";
private static readonly string _IconsPath = "Icons/";

这些字符串在运行时的值:

  • _DefaultIconPath:“default.ico”(_IconsPath 评估为 null)
  • _IconsPath: "图标/"

问题

为什么编译器不会在示例 3 中抛出类似于示例 2 的编译错误?

声明的顺序在 static readonly 字段定义的情况下很重要,但在 const 字段定义的情况下不重要。

编辑:

我理解为什么将字符串初始化为这些特定值。我不明白的是为什么示例 2 会抛出编译错误,强制在构造函数中而不是在变量声明中进行初始化(这非常有道理),但示例 3 的行为方式不同。抛出相同的编译错误并强制在静态构造函数中进行初始化是否有意义?


另一个例子

private static string test = test2;
private static string test2 = test;

这个例子演示了我要解释的内容。编译器可以在静态构造函数中强制初始化静态状态(就像实例变量一样)。为什么编译器允许它(或者为什么编译器不允许实例变量这样做)?

最佳答案

示例 3 使用 static 变量,因此它是允许的。

示例 2 失败,因为 C# 不允许变量初始值设定项引用正在创建的实例。引用 Jon Skeet 的解释 here .

你可以这样做:

public class YourClass {
private readonly string _IconsPath;
private readonly string _DefaultIconsPath;

public YourClass() {
_IconsPath = "Icons/";
_DefaultIconPath = _IconsPath + "default.ico";
}
}

关于c# - 初始化优先级——const vs readonly vs static readonly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11890579/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com