声明 C# 属性
Declaring C# properties
我曾经按如下方式设置 C# class 成员:
public class MyClass
{
private string member1;
public string Member1{ get; set; }
}
使用 Visual Studio 2017 和 .NET Framework 4.6.1,当我按照 VS2017 的建议重构我的代码时,相同的代码工作得很好,但看起来像这样:
public class MyClass
{
private string member1;
public string Member1 { get => member1; set => member1 = value; }
}
我想了解更多 get
和 set
属性的变化意味着什么。
您提供的代码示例的主要区别在于,旧示例中的 member1
字段实际上并未被 Member1
属性.
修改
否则,新语法只是 getter 和 setter 的内联实现的另一种选择。
在重构方面,它只是语法糖,允许您使用表达式来定义某些东西(包括 getter and/or setter),重要的区别是它仅支持单个表达式。目标是使代码更简洁,它是 C# 6 中引入的增强功能的一部分。
考虑一下:
public string Description { get { return string.Format("{0} {1} {2}", Year, Make, Model); } }
与此对比:
public string Description => $"{Year} {Make} {Model}";
更容易阅读,不是吗?
您在此示例中看到的是 Expression-Bodied Members 和 String Interpolation.
正如其他人所指出的,您的原始代码根本没有使用该变量。您可以删除 private string member1;
并且代码仍会像以前一样工作。
来源:
Expression-bodied members (C# programming guide)
C# 6.0 Gets More Concise with Expression Bodied Properties, Dictionary initializer
属性-初始化语法是 C# 语言的一部分,因此不依赖于 .NET Framework 版本。您使用的 Visual Studio 版本确实会影响您可用的 C# 版本,但请注意,例如,可以使用编写最新 C# 版本时的版本 - 7.x - .
说完这些,让我们看一些 属性 声明。
一个传统的、沼泽标准的字段支持的 C# 属性 声明看起来像这样,尽管理想情况下具有更具描述性的命名:
public class MyClass
{
private string member1;
public string Member1
{
get { return member1; }
set { member1 = value; }
}
}
我们有一个 public getter,其中 returns 我们的私有支持字段 member1
;和一个 public setter 来设置我们的私有支持字段。
以上代码很可能是您认为您前世使用的代码。这是您提供的代码:
public class MyClass
{
private string member1;
public string Member1 { get; set; }
}
...但是没有。 private string member1;
未被 Member1
属性 引用。事实上,在这个例子中,member1
根本没有被引用 并且很可能被编译器优化掉了!你真正写的是:
public class MyClass
{
public string Member1 { get; set; }
}
以上是 C# 3.0 中引入的 auto-implemented property。请注意 get
和 set
关键字后面没有正文。
In C# 3.0 and later, auto-implemented properties make
property-declaration more concise when no additional logic is required
in the property accessors... When you declare a property [this way], the compiler creates a private, anonymous backing field that
can only be accessed through the property's get and set accessors.
因此,就像在我们的 "traditional, bog-standard field-backed property" 示例中一样,我们得到了一个字段支持的 属性,除了这次我们没有在代码中定义字段并且它对我们来说是匿名的。在我们信任的编译器中!
我们快完成了。让我们看看您的新代码:
public class MyClass
{
private string member1;
public string Member1 { get => member1; set => member1 = value; }
}
get => member1
- 这是 C# 6 中引入的 属性 get 访问器和 expression body definition。它只是等同于 get { return member1; }
.[= 的语法糖30=]
set => member1 = value;
是具有表达式主体定义的 属性 集合访问器。此语法是在 C# 7 中为 setter 引入的。它是 set { member1 = value; }
.
的语法糖
为了结束这个总结,C# 6 还引入了 initializers for auto-properties。初始化程序直接初始化支持字段。考虑这个优雅的轻量级代码来声明和初始化一个简单的、(隐藏的、匿名的)字段支持的可读和可写 属性:
public string Member1 { get; set; } = "I am Member 1!"
我曾经按如下方式设置 C# class 成员:
public class MyClass
{
private string member1;
public string Member1{ get; set; }
}
使用 Visual Studio 2017 和 .NET Framework 4.6.1,当我按照 VS2017 的建议重构我的代码时,相同的代码工作得很好,但看起来像这样:
public class MyClass
{
private string member1;
public string Member1 { get => member1; set => member1 = value; }
}
我想了解更多 get
和 set
属性的变化意味着什么。
您提供的代码示例的主要区别在于,旧示例中的 member1
字段实际上并未被 Member1
属性.
否则,新语法只是 getter 和 setter 的内联实现的另一种选择。
在重构方面,它只是语法糖,允许您使用表达式来定义某些东西(包括 getter and/or setter),重要的区别是它仅支持单个表达式。目标是使代码更简洁,它是 C# 6 中引入的增强功能的一部分。
考虑一下:
public string Description { get { return string.Format("{0} {1} {2}", Year, Make, Model); } }
与此对比:
public string Description => $"{Year} {Make} {Model}";
更容易阅读,不是吗?
您在此示例中看到的是 Expression-Bodied Members 和 String Interpolation.
正如其他人所指出的,您的原始代码根本没有使用该变量。您可以删除 private string member1;
并且代码仍会像以前一样工作。
来源:
Expression-bodied members (C# programming guide)
C# 6.0 Gets More Concise with Expression Bodied Properties, Dictionary initializer
属性-初始化语法是 C# 语言的一部分,因此不依赖于 .NET Framework 版本。您使用的 Visual Studio 版本确实会影响您可用的 C# 版本,但请注意,例如,可以使用编写最新 C# 版本时的版本 - 7.x -
说完这些,让我们看一些 属性 声明。
一个传统的、沼泽标准的字段支持的 C# 属性 声明看起来像这样,尽管理想情况下具有更具描述性的命名:
public class MyClass
{
private string member1;
public string Member1
{
get { return member1; }
set { member1 = value; }
}
}
我们有一个 public getter,其中 returns 我们的私有支持字段 member1
;和一个 public setter 来设置我们的私有支持字段。
以上代码很可能是您认为您前世使用的代码。这是您提供的代码:
public class MyClass
{
private string member1;
public string Member1 { get; set; }
}
...但是没有。 private string member1;
未被 Member1
属性 引用。事实上,在这个例子中,member1
根本没有被引用 并且很可能被编译器优化掉了!你真正写的是:
public class MyClass
{
public string Member1 { get; set; }
}
以上是 C# 3.0 中引入的 auto-implemented property。请注意 get
和 set
关键字后面没有正文。
In C# 3.0 and later, auto-implemented properties make property-declaration more concise when no additional logic is required in the property accessors... When you declare a property [this way], the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors.
因此,就像在我们的 "traditional, bog-standard field-backed property" 示例中一样,我们得到了一个字段支持的 属性,除了这次我们没有在代码中定义字段并且它对我们来说是匿名的。在我们信任的编译器中!
我们快完成了。让我们看看您的新代码:
public class MyClass
{
private string member1;
public string Member1 { get => member1; set => member1 = value; }
}
get => member1
- 这是 C# 6 中引入的 属性 get 访问器和 expression body definition。它只是等同于 get { return member1; }
.[= 的语法糖30=]
set => member1 = value;
是具有表达式主体定义的 属性 集合访问器。此语法是在 C# 7 中为 setter 引入的。它是 set { member1 = value; }
.
为了结束这个总结,C# 6 还引入了 initializers for auto-properties。初始化程序直接初始化支持字段。考虑这个优雅的轻量级代码来声明和初始化一个简单的、(隐藏的、匿名的)字段支持的可读和可写 属性:
public string Member1 { get; set; } = "I am Member 1!"