我很好奇为什么 C#.NET 设计器中不允许使用以下代码的解释:
const foo f = new foo();
它给出以下错误消息:
“f”的类型为“ConsoleApplication1.foo”。字符串以外的引用类型的 const 字段只能用 null 初始化。
问题是:为什么?有人可以解释这个const
要求吗?
提前致谢。
因为 aconst
必须是可以在编译时解决的问题。
new foo();
将在运行时执行。
您可能希望使用readonly
关键字来确保它不能在构造函数之外初始化:
private readonly foo f = new foo();
因为const
C# 中的 a 必须是编译时常量。因此,唯一有效的const
选项(对于大多数引用类型)是null
.
一个例外是string
您可以将其分配给字符串文字。
// allowed because string literals are compile-time
private const string Message = "Hello World";
您可以拥有一个readonly
字段,这将允许该字段仅在初始化程序或构造函数中设置。本质上,这类似于 a ,const
只是它是在运行时确定的,并且可以是static
或实例(所有const
字段都是static
自动的)。
但是,应该注意,readonly
引用只是意味着该引用是只读的,这并不意味着它所引用的对象也是只读的(当然,除非该对象在设计上是不可变的,例如string
)。
例如:
private readonly List<string> validStrings = new List<string> { "Apple", "Orange", "Pear" };
即使validStrings
上面是readonly
,它仅意味着您不能通过validStrings
将其分配给新参考来进行更改。 但是如果对象是可变的,您可以修改它所指的内容:
// allowed, you can change what it refers to
validStrings.Clear();
// disallowed, cannot change what the reference refers to outside of constructor
validStrings = new List<string> { "Other", "Stuff" };
希望这可以帮助...
const 表示该值在编译时是已知的。因为 new 分配一个对象(如果程序没有运行,这是不可能的),你不能将 const 设置为一个新对象。你可以实现一些类似这样的东西:
static readonly Foo foo = new Foo()
实际上,错误文本令人困惑,因为它是您拥有的局部变量(在方法内部声明),而不是字段(在方法外部声明,属于类(或结构))。
您必须删除const
,因为正如其他人所说,它对于除string
.