只读违规未按预期处理



给出下面的代码,我很惊讶居然没有抛出异常,我想知道为什么没有。我有一个类,它有一个在构造函数中初始化的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!
    }
}

一个只读字段告诉编译器阻止您编写会改变该值的代码。如果你使用反射,你可以绕过这些检查,做任何你想做的事情。

注意,这与const字段不同,const字段是编译时常量。

相关内容

  • 没有找到相关文章