未按预期处理只读违规
Read-only Violation Not Handled as Expected
给出下面的代码,我很惊讶没有抛出异常并且想知道为什么不抛出。我有一个 class,它有一个在构造函数中初始化的 readonly
字段。然后我使用反射获取 FieldInfo
并调用 SetValue
方法。这导致其他只读字段可写。我的问题是 为什么允许这种情况发生?
如果允许这种情况发生,那意味着 readonly
关键字纯粹用于编译时检查,对实际指令生成的影响很小,我认为。预先感谢您的见解。
public class SomeType
{
public readonly int RONumber;
public int LocalMember;
public SomeType()
{
RONumber = 32;
}
}
class Program
{
static void Main(string[] args)
{
var st = new SomeType
{
LocalMember = 8
};
var ron1 = st.RONumber;
var type = typeof(SomeType);
var ronField = type.GetField("RONumber");
ronField.SetValue(st, 405);
var ron2 = st.RONumber; // ron2 is 405!
}
}
只读字段告诉编译器防止您编写会改变该值的代码。如果你使用反射,你可以绕过这些检查,基本上可以做任何你想做的事。
请注意,这与常量字段不同,常量字段是编译时常量。
给出下面的代码,我很惊讶没有抛出异常并且想知道为什么不抛出。我有一个 class,它有一个在构造函数中初始化的 readonly
字段。然后我使用反射获取 FieldInfo
并调用 SetValue
方法。这导致其他只读字段可写。我的问题是 为什么允许这种情况发生?
如果允许这种情况发生,那意味着 readonly
关键字纯粹用于编译时检查,对实际指令生成的影响很小,我认为。预先感谢您的见解。
public class SomeType
{
public readonly int RONumber;
public int LocalMember;
public SomeType()
{
RONumber = 32;
}
}
class Program
{
static void Main(string[] args)
{
var st = new SomeType
{
LocalMember = 8
};
var ron1 = st.RONumber;
var type = typeof(SomeType);
var ronField = type.GetField("RONumber");
ronField.SetValue(st, 405);
var ron2 = st.RONumber; // ron2 is 405!
}
}
只读字段告诉编译器防止您编写会改变该值的代码。如果你使用反射,你可以绕过这些检查,基本上可以做任何你想做的事。
请注意,这与常量字段不同,常量字段是编译时常量。