gpt4 book ai didi

c# - 声明 C# 属性

转载 作者:行者123 更新时间:2023-11-30 20:26:29 30 4
gpt4 key购买 nike

我曾经按如下方式设置 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; }
}

我想进一步了解什么 getset 属性的变化意味着什么。

最佳答案

属性初始化语法是 C# 语言的一部分,因此不依赖于 .NET Framework 版本。您使用的 Visual Studio 版本确实会影响您可用的 C# 版本,但请注意,例如,可以使用编写最新 C# 版本时的版本 - 7.x - with the not-current Visual Studio 2015 .

说完这些,让我们看看一些属性声明。

传统的、沼泽标准的字段支持的 C# 属性声明看起来像这样,尽管理想情况下具有更具描述性的命名:

public class MyClass
{
private string member1;

public string Member1
{
get { return member1; }
set { member1 = value; }
}
}

我们有一个公共(public) getter,它返回我们的私有(private)支持字段 member1;和一个公共(public) setter ,用于设置我们的私有(private)支持字段。

上面的代码很可能是您认为您在前世使用的代码。这是您提供的代码:

public class MyClass
{
private string member1;

public string Member1 { get; set; }
}

...但是没有。 private string member1; 未被 Member1 属性引用。事实上,在这个例子中,member1 根本没有被引用,并且很可能被编译器优化掉了!你真正写的是:

public class MyClass
{
public string Member1 { get; set; }
}

上面是一个auto-implemented property ,如 C# 3.0 中引入的那样。请注意,getset 关键字后面没有主体。

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.

所以,就像在我们的“传统的、沼泽标准的字段支持属性”示例中一样,我们得到了一个字段支持的属性,除了这次我们没有在代码中定义字段并且它对我们来说是匿名的。在我们信任的编译器中!

我们快完成了。让我们看看您的新代码:

public class MyClass
{
private string member1;
public string Member1 { get => member1; set => member1 = value; }
}

get => member1 - 这是一个带有 expression body definition 的属性 get 访问器,如 C# 6 中引入的那样。它只是等同于 get { return member1; 的语法糖。

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# - 声明 C# 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49863614/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com