【问题标题】:Property/Accessor ambiguity when using Expression Body operators使用表达式主体运算符时的属性/访问器歧义
【发布时间】:2020-08-01 15:42:15
【问题描述】:

使用 C# (.Net 4.6),假设以下代码:

public class test
{
    private bool _a = true;

    public test() { }

    public bool a => _a;
}

public bool a => _a; 的实现是否与:

public bool a { get => _a; }

或:

public bool a
{
    get => _a;
    set => _a = value;
}

?

也就是说,如果在属性/访问器上使用单个表达式主体声明(而不是分别声明 getset)是读取的结果功能/write,还是只读的?

我尝试查看 Microsoft 的帮助(此处:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties),但它只在一句话中提到了表达式主体,并不清楚其中的差异。 ??????????

【问题讨论】:

  • 如果你想要一个只读属性,为什么不使用public bool a { get; }
  • @vc74 我不一定想要只是一个只读属性;这里的例子是故意高度简化的。我想知道的是,可以肯定, 是编译器管理此语法的方式,因此我可以在需要它提供的功能时使用它,而 使用它不正确。
  • 好吧,public bool a => _a; 使您能够在内部(在类的代码中)修改a,但它对外部是只读的,所以它相当于public bool a { get { return a; } }(没有设置访问器)
  • 如果它“使您能够在内部(在类的代码中)修改一个,但它对外部是只读的”,那不是public bool a { get => _a; private set => _a = value; } 吗?
  • 不,public bool a => _a 即使在您的班级内,您也无法使用a = false(您当然可以使用_a = false

标签: c# .net properties operators


【解决方案1】:
public bool a => _a;

实现同:

public bool a { get => _a; }

还有:

static bool _a = true;
public bool a { get; set; } = _a;

实现同:

public bool a
{
    get => _a;
    set => _a = value;
}

【讨论】:

    【解决方案2】:

    您只需要get 访问器。所以这个:

    public bool a => _a;
    

    将被评估为:

    public bool a
    {
        get
        {
            return _a;
        }
    }
    

    你可以在SharpLap这里找到你的代码编译的中间步骤和结果

    【讨论】:

    • 好的,但我不知道 "sharplab" 是什么——我之前确实从未听说过它。它只是一个代码清理器吗?它提供的解释是真正权威的,还是仅仅是推测性的/暗示性的? ?
    • @NetXpert 是的,这绝对是无价之宝!这是一个方便的资源!否则我没有参考,您可以搜索一下以了解更多信息,它是一个 C#/VB/F# 编译器游乐场,您可以在其中找到代码编译的中间步骤和结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多