加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 未按预期处理的只读违规

发布时间:2020-12-15 22:18:13 所属栏目:百科 来源:网络整理
导读:鉴于下面的代码,我很惊讶没有抛出异常,并且想知道为什么不.我有一个类,它具有在构造函数中初始化的只读字段.然后我使用反射来获取FieldInfo并调用SetValue方法.这导致否则只读字段是可写的.我的问题是为什么允许这种情况发生? 如果允许这种情况发生,这意味
鉴于下面的代码,我很惊讶没有抛出异常,并且想知道为什么不.我有一个类,它具有在构造函数中初始化的只读字段.然后我使用反射来获取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!
    }
}

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读