当前位置:  开发笔记 > 编程语言 > 正文

为什么只能通过ref参数修改只读字段?

如何解决《为什么只能通过ref参数修改只读字段?》经验,为你挑选了1个好方法。

考虑:

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"

这甚至是如何编译的,但仍有效?我不应该_value为构造函数之外的字段分配不同的值,因为它标记为readonly.但是,将它传递ref给一个方法,它确实可以被操纵.

这有危险吗?为什么?我感觉不对,但我不能完全指责它.



1> StriplingWar..:

它编译是因为您只是将值作为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; }
    }
}

上面的代码提供了一个非常有说服力的编译错

readonly字段不能传递给ref或out(构造函数除外)

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有