C# 从即时窗口修改只读字段值

C# 从即时窗口修改只读字段值,c#,.net,C#,.net,我正在尝试学习c#中的只读关键字行为。只能在构造函数中分配只读字段。但可以在运行时从即时窗口将数据分配给只读字段。这是错误还是行为 代码片段: public class Foo { public readonly string readOnlyField; public Foo(string parameter) { readOnlyField = parameter; } public string returnReadOnlyVal

我正在尝试学习c#中的
只读
关键字行为。只能在构造函数中分配
只读
字段。但可以在运行时从即时窗口将数据分配给
只读
字段。这是错误还是行为

代码片段:

public class Foo
{
    public readonly string readOnlyField;

    public Foo(string parameter)
    {
        readOnlyField = parameter;
    }

    public string returnReadOnlyValue()
    {
        return readOnlyField;
    }
}



class Program
    {
        static void Main(string[] args)
        {

            Foo foo = new Foo("Read Only - Init");
            Console.WriteLine(foo.returnReadOnlyValue());

            //Now Modify data from Immediate window
            Console.WriteLine(foo.returnReadOnlyValue());
            Console.ReadLine();
        }
这是一种行为


Readonly
仅在编译时强制执行

正如@MitchWheat所述,
Readonly
仅在编译时强制执行。如果您需要一个变量即使在调试时也不会更改,请改用
const


更多信息请访问。

readonly
仅做一件事:表明程序员的意图,即所涉及的字段永远不会更改

因此,程序中任何更改该字段的尝试都表明程序员的工作存在问题:要么在将字段标记为“只读”时错误,要么在尝试更改该字段时错误。编译器很有帮助地拒绝编译程序,直到以某种方式解决了这个问题

理论上,编译器可以将该字段放入某种只读或受保护的内存中(如果这些内存可用且有效的话)。但很可能不会,因为将其存储在与非只读字段相同的堆栈或堆上要简单得多

因为这意味着它在内存中的某个地方由一些1和0表示,所以没有什么可以阻止其他东西更改这些1和0,包括通过调试器。同样,您也可以通过.NET代码中的refection来更改该值

最终,为什么不呢?它完成了它的工作

考虑一个带有独立接地、带电和中性的三针电气插座。如果我试着把它插上,比如接地插针插进带电的洞里,它就不合适了,所以我就不会意外地做一些非常愚蠢的事情

如果我把插头拆开,重新接线,使地线连接到带电的插脚上,我就可以把它插入插座,使金属外壳带电

这不是插头和插座设计中的缺陷。要么我有很好的理由这么做(不管怎么说,在技术层面上,我能想到的唯一实际原因是企图杀人),要么我是故意装傻

同样,如果您更改了
只读
字段,要么您有很好的理由,要么您是在故意装傻。你只能保护人们远离自己


(当然,出于恶意,您可能希望在计算机上执行一些愚蠢的操作,但这是针对那些在没有足够信任的情况下防止反射的访问控制,或者是针对那些在没有管理员访问权限的情况下防止由其他帐户运行的调试进程的访问控制)。

我确认,以前可以在调试器中分配只读成员,但很明显,事情在某个时候发生了变化

今天在VS2015的
即时窗口
,我得到:

error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer)

这是一种行为。只读仅在编译时强制执行time@MitchWheat是的,谢谢你的信息!