现代C# - 第一集:Properties

2019-05-27  本文已影响0人  elef

介绍

近年来,C#已经从一种只有一个特征来解决问题的语言发展成为一种对单一问题有许多潜在(语言)解决方案的语言。这既是好的,也是坏的。好的,因为它给了我们作为开发者的自由和权力(不损害向后兼容性),而坏的是由于与决策相关的认知负荷。
在本系列中,我们想探索存在哪些选项以及这些选项的不同之处。当然,在某些情况下,有些可能有利也有弊。我们将探索这些场景,并提出一个指南,让我们在翻新现有项目时更加轻松。

什么是属性(Properties)

属性的概念不是在C#中诞生的。事实上,关于字段的赋值方法(getter / setter)的想法和软件的出现一样古老,只是在面向对象编程语言中非常流行。

从Java到C#

在 类似JAVA的 C# 代码中, 不会为此类赋值方法包括任何特殊语法。相反, 人们会选择加入如下所示的代码:

class Sample
{
    private string _name;

    public string GetName()
    {
        return _name;
    }

    public void SetName(string value)
    {
        _name = value;
    }
}

按照惯例, 我们总是将 Get (getter 方法的前缀) 或 Set (setter 方法的前缀) 放在 "通常" 标识符前面。我们还可以在这里确定一个关于使用的签名的常见模式。

其实, 只有一个 getter-only 才有很大的意义。这是我们经常要试图完成的封装。在下面的示例中, 只有类本身可以决定_name 字段的值。任何 "外部调用者" 都不允许执行任何赋值, 这使得对属性方法非常有必要。

class Sample
{
    private string _name;

    public string GetName()
    {
        return _name;
    }
}

经典的方式

从 c# 语言的第一个版本开始, 我们就已经有了 (显式的、经典的) 编写属性的方式。

class Sample
{
    private string _name;

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

C# 中的属性看起来像一个方法, 但是省略括号 (即方法参数)。它还强制我们编写一个包含 get 方法、set 方法或两者的块。

现代方式

使用较新版本的 C# , 添加了一些新概念, 以提供更多的开发便利。在下面, 我们称之为称为 "现代方式"。

请考虑以下直接示例来替换我们以前的实现:

class Sample
{
    public string Name
    {
        get;
        set;
    }
}

是的, 出于性能原因, 我们可能不喜欢这样。原因是该字段实际上是 "隐藏的" (即, 从编译器层次添加,我们无法访问)。因此, 对该字段的唯一访问权限是通过该属性。

再来看看这个采用限制访问符控制外部赋值的示例

class Sample
{
    protected string Name
    {
        get;
        private set;
    }
}

被赋值的属性

很多时候我们考虑就是想要一个属性来展示一个字段的值,
我们不需要任何setter变量。不幸的是,使用前一种方法(现代方式),我们不能获取字段,也不能删除或省略setter。

class Sample
{
    private string _name = "Foo";

    public string Name
    {
        get { return _name; }
    }
}

只读属性

在c# 6中,语言设计团队采用了这个想法,并为这个问题提供了一个解决方案。c#现在提供只读属性。
实际上,这些属性可以像只读字段一样赋值,例如在构造函数中,或者在声明它们时直接赋值。

class Sample
{
    public string Name { get; } = "Foo";
}

C# 3的一大特色是引入了LINQ。伴随着它,一大堆新的语言特征被引入。一个伟大的特性是编写匿名函数的lambda语法。lambda语法是C# 7中的一个核心元素,它使C#对于函数式编程(FP)中的模式来说更加实用/友好。

这些增强之一是对C#属性的增强,现在可以使用“胖箭头”即lambda语法将其解析为表达式。
这看起来很简单,如下面的代码所示:

class Sample
{
    private readonly string _name = "Foo";
    
    public string Name => _name;
}

GET 和 SET表达式

class Sample
{
    private string _name = "Foo";

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

摘自:https://www.codeproject.com/Articles/1278754/Modernize-Your-Csharp-Code-Part-I-Properties

上一篇 下一篇

猜你喜欢

热点阅读