只读违规未按预期处理

时间:2015-08-11 17:21:15

标签: c# reflection readonly

鉴于下面的代码,我很惊讶不会抛出异常,并且想知道为什么不这样做。我有一个类,它在构造函数中初始化了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!
    }
}

1 个答案:

答案 0 :(得分:1)

readonly字段告诉编译器阻止您编写将改变该值的代码。如果你使用反射,你可以绕过这些检查,基本上做任何你想做的事。

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