我曾经按如下方式设置C#类成员:
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
属性的更改意味着什么。
答案 0 :(得分:2)
就重构而言,它只是语法糖,允许您使用表达式来定义某些事物(包括getter和/或setter),其重要区别在于它仅支持单个表达式。目标是使代码更简洁,它是C#6中引入的增强功能的一部分。
考虑一下:
public string Description { get { return string.Format("{0} {1} {2}", Year, Make, Model); } }
对此:
public string Description => $"{Year} {Make} {Model}";
更容易阅读,不是吗?
您在此示例中看到的是表情身份成员和字符串插值。
正如其他人所指出的那样,您的原始代码根本没有使用该变量。您可以删除private string member1;
,代码仍然可以像以前一样工作。
来源:
Expression-bodied members (C# programming guide)
C# 6.0 Gets More Concise with Expression Bodied Properties, Dictionary initializer
答案 1 :(得分:2)
属性初始化语法是C#语言的一部分,因此不依赖于.NET Framework版本。您正在使用的Visual Studio版本确实会对您可用的C#版本产生影响,但请注意,例如,可以使用编写最新C#版本时的内容 - 7.x - {{3} }。
在此之后,让我们看一些属性声明。
传统的,沼泽标准的字段支持的C#属性声明看起来像这样,尽管理想情况下具有更具描述性的命名:
public class MyClass
{
private string member1;
public string Member1
{
get { return member1; }
set { member1 = value; }
}
}
我们有一个公共getter,它返回我们的私有支持字段member1
;和一个公共制定者,设置我们的私人支持领域。
以上代码可能就是您在以前的生活中使用的思想。这是您提供的代码:
public class MyClass
{
private string member1;
public string Member1 { get; set; }
}
......但没有。 private string member1;
属性未引用Member1
。实际上,在此示例中,member1
未在所有中引用,并且可能会被编译器优化掉!你真正写的是:
public class MyClass
{
public string Member1 { get; set; }
}
以上是with the not-current Visual Studio 2015,如C#3.0中所介绍的。请注意,get
和set
关键字后面没有正文。
在C#3.0及更高版本中,自动实现的属性生成 当不需要额外的逻辑时,属性声明更简洁 在属性访问器中...当您以[通过这种方式]声明属性时,编译器会创建一个私有的匿名支持字段 只能通过属性的get和set访问器访问。
所以,就像我们的传统的,沼泽标准的现场支持的财产一样#34;例如,我们获得了一个字段支持的属性,除了这次我们不在代码中定义字段,它对我们来说是匿名的。在我们信任的编译器中!
我们差不多完成了。让我们看看你的新代码:
public class MyClass
{
private string member1;
public string Member1 { get => member1; set => member1 = value; }
}
get => member1
- 这是一个带有auto-implemented property的属性获取访问器,如C#6中所介绍的那样。它只是等同于get { return member1; }
的语法糖。
set => member1 = value;
是一个带有表达式主体定义的属性集访问器。这个语法是为C#7中的setter引入的。它是set { member1 = value; }
的语法糖。
为了结束本摘要,C#6还引入了expression body definition。初始化程序直接初始化后备字段。考虑这个优雅的轻量级代码来声明和初始化一个简单的(隐藏的,匿名的)字段支持的可读写属性:
public string Member1 { get; set; } = "I am Member 1!"
答案 2 :(得分:0)
您提供的代码示例的主要区别在于,member1
属性实际上并未修改旧示例中的Member1
字段。
否则,新语法只是getter和setter的内联实现的另一种选择。