C#VS2017中的吸气剂制定者

时间:2017-03-09 11:30:21

标签: oop encapsulation getter-setter visual-studio-2017

我一直在使用VS2017社区。这让我感到困惑:

以下是VS之前的普通吸气剂设定器:

public string Name
    {
        get{ return _name;}
        set{ _name = value;}
    }

这是新的getter setter:

public string Name { get => _name; set => _name = value; }

任何人都可以向我解释为什么语法会改变?

4 个答案:

答案 0 :(得分:2)

我不会说他们改变了它,我会说他们给了我们一些新的语法选项。您仍然可以使用“旧”方式来声明getter和setter,但现在还有一种更实用的编程风格。在C#6中,Microsoft已经为仅使用getter的属性引入了表达式:

public int SomeProp => someMethod(); 

C#7增强了这种支持,允许它用于getter和setter。这个的一个很好的功能是使用新的“throw表达式”功能,它允许我们制作一些简洁的语法。例如,在你必须这样做之前。

private string _name;
public string Name
{
    get
    {
        return _name;
    }
    set
    {
        if (value == null)
            throw new ArgumentNullException(nameof(Name));
        _name = value;
    }
}

我们现在可以将其简化为:

private string _name;
public string Name { 
    get => _name; 
    set => _name = value ?? throw new ArgumentNullException(nameof(Name)); 
}

当然,即使不将setter作为lambda也可以执行throw表达式,但正如您所看到的,对于简单的事情,它使语法非常简洁。

与任何内容一样,使用对您来说最有意义的语法,并且对于将对您的应用程序进行编码的人员来说最具可读性。微软一直在努力为C#添加越来越多的函数编程风格特性,这只是另一个例子。如果您发现它丑陋/混乱/不需要,您绝对可以使用现有方法完成所需的一切。另一个例子,为什么我们有whiledo while循环?老实说,我在职业生涯中使用了do while循环可能5次。 while循环可以执行do while只能使用不同语法的所有内容。但是,有时您会发现使用do while会使您的代码更具可读性,那么为什么不在使用它时更容易使用呢?

答案 1 :(得分:1)

语法没有改变:它已得到改进。 C#始终与以前版本的语法和语法向后兼容。

为什么属性getter / setter可以用lambda语法(表达式身体访问器)实现?可能没有科学理由这样做,但是在C#中引入有用的函数式编程结构已达成共识它将语言转变为更高效的工具。

从C#2.0开始,简化C#的演变:

  • 常规方法 提供的代表到匿名代表
  • LINQ,lambda-style delegates / expression trees。
  • 表情身体方法。
  • ...和表达身体的访问者!未来的C#版本可能会引入更多功能性的编程风格的语法和语法。

答案 2 :(得分:0)

您会注意到他们删除了“返回”字样。语法,这是完成的(从我已阅读的内容),以使它更清楚,他们不是功能(并且当反映不能被视为功能,并且不能被制作成代表们)而是这种伪功能' (如果你得到我想要的东西)。

所以基本上它更清楚地表明getter is linking this this variable和重复设定者。这也是因为在较新的版本中你可以做类似

的事情

public int MyInt => x ? y:z;

代表

public int MyInt
{
    get
    {
        return x ? y:z;
    }
}

这两种语法都应该有效,它只是一种新的语法,它们使它与上面的例子一致。

答案 3 :(得分:0)

我知道我将在一年后添加此详细信息,但只是了解到我的VS 2017在我的Web用户控件上生成了新语法,当我想为其设置值时,这不会反映在aspx文件上。 / p>

喜欢     私人布尔值_ShowBankDetailPanel = false; //在注册时显示“银行详细信息”部分     公共布尔ShowBankDetailPanel {get => _ShowBankDetailPanel;设置=> _ShowBankDetailPanel =值; }

在ASPX方面,您将没有像      

只能识别

旧式吸气塞装塞器。...(我遇到了,但是我错了)