C# 属性如何提供封装?

C# 属性如何提供封装?,c#,c#-4.0,c#-3.0,c#-2.0,C#,C# 4.0,C# 3.0,C# 2.0,我开始学习C#,但我不明白当set方法不进行任何操作、验证等时,属性如何提供封装。我的代码: class SitePage { private string _specialString; public string SpecialString { get { return _specialString; } set { _specialString = value; } }} 这里,我们不使用字段_specialString,而是使用属性specialString。基本上,我们不是暴露字段,

我开始学习C#,但我不明白当set方法不进行任何操作、验证等时,属性如何提供封装。我的代码:

class SitePage {
private string _specialString;
public string SpecialString
{
get { return _specialString; }
set { _specialString = value; }
}}

这里,我们不使用字段_specialString,而是使用属性specialString。基本上,我们不是暴露字段,而是暴露属性。为什么要隐藏字段而将属性公开给客户机类?

基本上,您希望返回一个副本。当您处理税务信息等敏感数据时,这一点变得非常重要。你不希望任何人或任何东西能够直接访问某人的税务信息。很多程序不需要这样的系统,但仍然被认为是良好的实践,因为它让你养成了这样的习惯

通过这样一个中介,可以确保所有操作都是有意完成的,并且允许您执行一些错误检查,只更改它,而不强制它在文件中本地运行。例如,如果您有一个永远不应该为负数的数字,那么可以在set方法中包含该数字的错误检查,而不必在使用变量的任何地方都这样做


如果你需要更多的细节或例子,请告诉我。我觉得我解释得不是很好,但我希望解释得足够好,让您大致了解为什么要这样编码。

通常,属性构成公共接口,字段是支持数据。您还可以通过如下方式编写自动实现的属性:

public string SpecialString { get; set; }
private string _specialString;
public string SpecialString{
    get;
    set{
        if(value.Length < 5)
        {
            throw new Exception();
        }
        else
        {
            this._specialstring = value;
        }
}
这样,编译器将自动构建备份字段

将公共属性用作私有支持字段的接口还有其他好处,例如,当您希望查看值是否已更改并引发事件时

private string _specialString;

public string SpecialString
{
  get
  {
    return _specialString;
  }
  set
  {
    if (_specialString != value)
    {
      _specialString = value;
      OnValueChanged();
    }
  }
}
使用c#属性时,编译器会在后台自动创建字段。因此,无论何时获取属性,它都使用一个方法来检索存储在基础字段中的值。设置属性时,它正在设置基础字段

当需要简单的实现时,使用{get;set;}语法本质上是一种快捷方式

真正的好处是当您需要控制它如何获取或设置这些值时

例如,您可以使用以下语法:

public SpecialString{get;private set;}
这将使您可以从类外部检索属性的值,但只能使用类自己的内部逻辑在内部设置值

或者你可以这样做:

public string SpecialString { get; set; }
private string _specialString;
public string SpecialString{
    get;
    set{
        if(value.Length < 5)
        {
            throw new Exception();
        }
        else
        {
            this._specialstring = value;
        }
}
private string\u specialString;
公共字符串特殊字符串{
得到;
设置{
如果(值。长度<5)
{
抛出新异常();
}
其他的
{
此项。_specialstring=值;
}
}
或者,当您获取或设置某个属性时,您可以触发其他方法。将属性视为网关守护者。您可以设置任何规则,以便让数据传入或传出