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这只是出于好奇。我意识到这可能是一个很好的理由,它是私人只读的。