我想知道这些getter和setter声明之间有什么区别,是否有首选方法(以及为什么).第一个可以由Visual Studio自动生成.其他人呢?谢谢

第一

string _myProperty { get; set; }

第二

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

第三位

string _myProperty;

public string getMyProperty()
{
  return this._myProperty;
}

public void setMyProperty(string value)
{
  this._myProperty = value;
}

推荐答案

属性用于封装一些数据.可以使用普通字段:

public string MyField

但是这个字段可以被你的类的所有外部用户访问.人们可以插入非法值,或者以你意想不到的方式更改值.

通过使用属性,可以封装访问数据的方式.C#有一个很好的语法,可以将字段转换为属性:

string MyProperty { get; set; }

这叫做auto-implemented property.当需要时,您可以将您的房产扩展到:

string _myProperty;

public string MyProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

现在,您可以添加代码来验证setter中的值:

set
{
    if (string.IsNullOrWhiteSpace(value))
        throw new ArgumentNullException();

    _myProperty = value;
}

属性还可以具有不同的getter和setter访问器:

public string MyProperty { get; private set; }

通过这种方式,您可以创建一个每个人都可以读取但只能由类本身修改的属性.

您还可以为您的getter个应用程序添加一个完全定制的实现:

public string MyProperty
{
    get
    {
        return DateTime.Now.Second.ToString();
    }
}

当C#编译自动实现的属性时,它会生成中间语言(IL).在您的IL中,您将看到一个get_MyPropertyset_MyProperty方法.它还创建了一个名为<MyProperty>k_BackingField的支持字段(通常这在C#中是非法名称,但在IL中是有效的.这样,生成的类型和您自己的代码之间不会有任何冲突).但是,您应该使用C#中的官方属性语法.这在C#中创建了更好的体验(例如,使用IntelliSense).

按照惯例,您不应该对需要很长时间的操作使用属性.

.net相关问答推荐

从Couchbase删除_txn文档的推荐方法?""

尽管有`disable`注释,但未 suppress Pylint语法错误

实体框架核心:Azure容器应用程序的执行超时已过期

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

从窗体中移除另一个控件中引用的控件时获取设计时通知

在 F# 中处理 Option - Some(null) 的好策略是什么

如何在 .net MAUI 中删除不需要编译的平台?

使用 MassTransit、.NET Core 和 RabbitMQ 的设计挑战

为什么 GetShortestDayName 返回的名称比预期的短?

out 和 ref 可以用作临时变量吗?

为什么 .net 对字符串使用 UTF16 编码,但默认使用 UTF-8 来保存文件?

Select 文件夹对话框 WPF

ReaderWriterLock 与锁{}

C# 中 try/finally 的开销?

如何对 LINQ to XML 中的元素进行深层复制?

如何使用 C# 创建自签名证书?

何时何地使用 GetType() 或 typeof()?

.NET 委托类型的正确命名约定?

找不到 System.Windows.Media 命名空间?

使用 C# vs F# 或 F# vs C# 有什么好处?