在链接构造函数中设置只读字段
本文关键字:读字段 设置 链接 构造函数 | 更新日期: 2023-09-27 18:25:42
我有一个类,它有两个只读字段,正在构造函数中设置。我有一个派生类,它希望在构造函数中将这些值设置为不同的值;然而,尝试这样做会导致CS1091(只读字段不能分配给(构造函数或变量初始值设定项除外)错误。
我不明白为什么-我正在分配给构造函数中的字段。只是不是定义它们的类中的一个。
是我遗漏了一些微妙的语法问题,还是这不可能?
(如果这不可能的话,有一些方法可以绕过它——可能是一个受保护的虚拟属性,没有setter和私有只读支持字段;然而,从语法上讲,它不会那么干净,所以我想尽可能避免它们。)
public class BaseClass
{
protected readonly ushort OffsetRoutine;
protected readonly ushort OffsetString;
public BaseClass()
{
this.OffsetRoutine = this.GetWord(Addresses.Header.OffsetRoutine);
this.OffsetString = this.GetWord(Addresses.Header.OffsetString);
}
protected ushort GetWord(byte address)
{
// Chosen by fair dice roll on a d100.
return 42;
}
}
public class DerivedClass : BaseClass
{
public DerivedClass()
: base()
{
this.OffsetRoutine = 0;
this.OffsetString = 0;
}
}
其他答案没有提供关键细节-只允许在声明或同一类的构造函数中设置readonly
字段。这只是readonly
和const
之间的区别之一。const
修饰符不允许在构造函数中设置字段,只允许在声明中设置字段。因此,在派生类中设置readonly
是不允许的,因为字段不在同一类中。我想你不需要变通办法,因为你似乎知道如何在必要时进行,还有其他答案在讨论。来自MSDN(http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx):
当字段声明包含只读修饰符时声明引入的字段只能作为声明或在同一类的构造函数中。
仅举几个例子:
public class A
{
protected const string constString = "Test"; //Allowed
protected readonly string readonlyString = "Test"; //Allowed
public A(){
constString = "Test"; //Not allowed
readonlyString = "Test"; //Allowed
}
}
public class B: A
{
public B(){
constString = "Test"; //Not allowed
readonlyString = "Test"; //Not allowed
}
}
这是不可能的,我认为readonly这个词的含义已经足够清楚了。
你的问题还不清楚,但你可能想要这样的东西:
private ushort _offsetRoutine;
private ushort _offsetString;
public BaseClass()
{
_offsetRoutine= this.GetWord(Addresses.Header.OffsetRoutine);
_offsetString= this.GetWord(Addresses.Header.OffsetString);
}
public ushort OffsetRoutine
{
get { return _offsetRoutine;}
}
public ushort OffsetString
{
get { return _offsetString;}
}
现在您可以访问OffsetRoutine
OffsetString
,但不能更改它们的值。
将值发送到构造函数中。设置只读时不能调用方法。
这种方式有效。
public class BaseClass
{
protected readonly ushort OffsetRoutine;
protected readonly ushort OffsetString;
public BaseClass(ushort value1, ushort value2)
{
OffsetRoutine = value1;
OffsetString = value2;
}
}
public class DerivedClass : BaseClass
{
public DerivedClass(ushort value1, ushort value2)
: base(value1, value2)
{
}
}