Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改私有只读成员变量?_C#_Readonly_Private Members - Fatal编程技术网

C# 修改私有只读成员变量?

C# 修改私有只读成员变量?,c#,readonly,private-members,C#,Readonly,Private Members,我有以下代码: public class MyClass { private readonly string name; public string Name { get { return name; } } public MyClass(string name) { this.name = name; } } class Program { s

我有以下代码:

public class MyClass
{
    private readonly string name;
    public string Name
    {
        get
        {
            return name;
        }
    }
    public MyClass(string name)
    {
        this.name = name;
    }
}
class Program
{
    static void Main(string[] args)
    {
        MyClass mc = new MyClass("SomeName");
    }
}

有没有办法在不修改类的情况下更改mc.name的值?

我希望没有。反思可能会让你做到这一点——我一时记不起它是否遵循了只读性


但你真的不应该这么做。。。如果某个内容是只读的,那么代码的其他部分很可能依赖于它不会更改。

With,yes(),但是变量设置为
private readonly
可能有一个很好的原因,您只能使用反射

typeof(MyClass)
   .GetField("name",BindingFlags.Instance|BindingFlags.NonPublic)
   .SetValue(myclassInstance, 123);

根据MSDN规范,您只能使用反射检索公共字段/成员,因此不可能使用该路径。但是,您可以指定自己的绑定标志来解决此问题。不过我还没试过


我不确定这在C#中是否可行,但您可以不受管理地直接操作内存。但是我猜这将以例外告终,因为Windows很可能不允许这样做。

在当前的.net实现中,您可以使用私有反射来修改它。首先需要使用
BindingFlags.NonPublic | BindingFlags.Instance
获取
FieldInfo
,并使用它更改值

但我认为另一个/未来的实现允许实际执行
只读
。例如,抖动可能会将值嵌入已编译代码中。这意味着您的代码可能会在将来的.net版本中中断。所以我建议不要依赖这种行为


示例代码:

void Main()
{
   this.GetType()
     .GetField("name", BindingFlags.NonPublic | BindingFlags.Instance)
     .SetValue(this, "Yes");

   Name.Dump();
}

private readonly string name="No";

public string Name{get{return name;}}

您可以使用反射来实现这一点。我可以发布一个例子,但这里已经有一个非常好的例子:

但我真的要花很长时间,认真地研究一下逻辑,你认为你需要这样做。关于类是如何设计的,您正在“切中要害”,一旦您开始修补私有字段,可能会出现许多意想不到的行为。开发人员/架构师有理由将它们设置为只读,并且可能依赖于它们在实例化后是不可变的

“仅仅因为我们能做一件事,并不意味着我们应该做一件事。”-罗登贝里


这个问题的另一个版本似乎回答了这个问题。如果你真的邪恶,你甚至可以更改
字符串。空的
。但是不要期望在那之后任何事情都能起作用。只是测试了它,当前的实现允许这样做。但据我记忆所及,该规范允许
readonly
永远不会改变的实现。@JonSkeet显然是这样做的。但这只是出于好奇。我意识到可能不应该修改这样的东西。@AdamFlanagan这只是出于好奇。我意识到这可能是一个很好的理由,它是私人只读的。