【发布时间】:2022-12-24 19:30:13
【问题描述】:
我很难理解属性是如何“连接”到支持字段的。我已经建立了一个常见的例子。我经常看到 get 和 set 简化为 {get;放;}。这是否仅在存在一个字段时才适用,或者它仍然可以与两个相同类型的字段一起使用。如果它确实有效,那么此代码中的名称属性是否代表名称或地址或两者?如果将存储在那里的信息在公共财产中存储/访问,我很难理解私有字段的重要性。这有意义吗?
using System;
namespace MyApplication
{
class Program
{
static void Main(string[] args)
{
Person myObj = new Person();
myObj.Name = "Liam";
Console.WriteLine(myObj.Name);
}
}
class Person
{
private string name;
private string address;
public string Name {get; set;}
}
}
【问题讨论】:
-
属性本身不一定与支持字段“连接”。对于自动实现的属性(那些只有
{get;}或{ get; set; }声明的属性),编译器会生成一个支持字段,而不是你。如果您好奇的话,可以通过反射发现支持字段。对于具有显式实现的其他属性(即,不是自动实现的),它们是否由支持字段支持取决于编写的 getter/setter 代码...... -
当前示例中的内容是 auto property。基本上,当您像那样简化
get和set时,编译器实际上会自行为它创建一个支持字段。get返回字段值,set设置。您添加自己的私有字段而不将属性连接到它仍然会使该属性成为自动属性,因此您的私有字段根本没有被使用。 -
在您的情况下,属性
Name与字段name完全无关。 20 年前,当 .NET 首次发布时,您将实现一个像这样的简单属性:public string Name { get { return name; } set { name = value; } }。然后语言得到了自动属性带有隐藏的支持字段。于是public string Name { get; set; }诞生了,不需要明确的支持字段 -
属性的目的是访问控制。具有私有支持字段的公共属性为内部类提供了不受限制的读取和更改私有字段的访问权限,而公共属性可以包含逻辑,该逻辑对当前类之外的哪些代码可以
get来自该字段或@ 987654335@外地来。
标签: c# properties get set accessor