oop - C# VS2017 中的 getter setter

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

我已经开始使用 VS2017 社区。这让我很烦恼:

下面是之前 VS 的普通 getter setter:

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

这是新的 getter setter:

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

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

最佳答案

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

public int SomeProp => someMethod(); 

C#7 增强了这种支持,允许它用于 getter 和 setter。它的一个很好的特性是新的“throw expressions”特性,它允许我们制作一些简洁的语法。例如,在您不得不做之前。

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 循环?老实说,在我的职业生涯中,我大概用过 5 次 do while 循环。 while 循环可以完成 while 可以做的所有事情,只是语法不同而已。但是,有时您会意识到使用 do while 会使您的代码更具可读性,那么如果它能让事情更容易理解,为什么不使用它呢?

关于oop - C# VS2017 中的 getter setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42694264/

相关文章:

java - 方法的模块化-方法调用时的堆栈操作-java

java - 该设计在多大程度上违反了封装性

javascript - Angular中的css封装

java - 数组的 getter 和 setter

doctrine-orm - Doctrine 2 ORM 使用可恶的 CamelCase 创建类

javascript - Javascript 构造函数中函数声明的差异

apache-flex - AS3/Flex : How to make mxml files loaded via ViewStack see their parent's variables, 等?

php - 我想在 PHP OOP 中的另一个方法中使用一个方法

python - Python中的非成员与成员函数

python - 相当于 python __getattr__/__setattr__ 的 scala