Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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# 为什么可以通过ref参数修改只读字段?_C#_.net_Ref - Fatal编程技术网

C# 为什么可以通过ref参数修改只读字段?

C# 为什么可以通过ref参数修改只读字段?,c#,.net,ref,C#,.net,Ref,考虑: class Foo { private readonly string _value; public Foo() { Bar(ref _value); } private void Bar(ref string value) { value = "hello world"; } public string Value { get { return _value;

考虑:

class Foo
{
    private readonly string _value;

    public Foo()
    {
        Bar(ref _value);
    }

    private void Bar(ref string value)
    {
        value = "hello world";
    }

    public string Value
    {
        get { return _value; }
    }
}

// ...

var foo = new Foo();
Console.WriteLine(foo.Value); // "hello world"
尽管如此,这是如何编译的?我不能将不同的值分配给构造函数外部的
\u value
字段,因为它标记为
只读
。但是,通过
ref
将其传递给一个方法,它确实可以被操纵


这危险吗?为什么?我觉得它不对,但我不能完全指出它。

它是编译的,因为您只将值作为构造函数中的
ref
参数传递(其中允许设置
readonly
字段)。如果将对
Bar()
的调用移动到其他方法中,则会失败

class Foo
{
    private readonly string _value;

    public Foo()
    {
        Bar(ref _value);
    }

    public void Baz()
    {
        Bar(ref _value);
    }

    private void Bar(ref string value)
    {
        value = "hello world";
    }

    public string Value
    {
        get { return _value; }
    }
}
上面的代码提供了一个非常明显的编译器错误:

只读字段不能传递ref或out(构造函数中除外)


差不多。不危险,因为_值在构造后不能修改,也不会暴露在外部(除了get访问器),谢谢。不知怎的,那东西从我身边溜走了。:)因为已经存在一个永远无法写入的只读值,所以它是
default
。有用的
只读
变量必须至少写入一次。不太明显的细节是字段初始化实际上发生在构造函数中,C#编译器移动代码。