C#自定义getter/setter没有私有变量

Rei*_*167 55 c# coding-style accessor automatic-properties

我最近学到了c#,所以当我学会写属性时,我被教会这样做:

public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

汽车房产很棒!但是现在我正在尝试做一些更复杂的事情,所以我需要编写一对自定义访问器.

private string _Name;
public string Name {
    get { return _Name; }
    set { _Name = value }
}
Run Code Online (Sandbox Code Playgroud)

我知道当一个人使用autos时,编译器会将私有实例变量放在它的黑暗深处,但是我被宠坏了并且不希望那个私有变量看起来毫无意义.

有没有办法在没有私有变量的情况下使用自定义访问器?

jha*_*ldt 41

属性根本不需要支持变量(字段).虽然它们可用于封装简单字段,但您也可以使用它们来访问其他数据.

public Decimal GrandTotal { get { return FreightTotal + TaxTotal + LineTotal; } }
Run Code Online (Sandbox Code Playgroud)

要么

public string SomeStatus { get { return SomeMethodCall(); } }
Run Code Online (Sandbox Code Playgroud)

如果目标是简单地用属性封装某个字段,那么如果不使用自动属性,则需要某种支持字段.


tik*_*ika 13

答案是否定的,你不能这样做.这是因为递归.(见第9和第7行):

Line 1  :   public string Name
Line 2  :   {
Line 3  :     get
Line 4  :     {
Line 5  :         return FirstName + " "  + LastName;
Line 6  :     }
Line 7  :     set
Line 8  :     {
Line 9  :         Name = value; // <-- Goes back to Line 7
Line 10 :     }
Line 11 :   }
Run Code Online (Sandbox Code Playgroud)

  • 是的,如果你在其内部调用 getter/setter 则会导致无限递归。C# 编译器在内部为属性创建一个支持字段。在其他语言中,这有时称为实例变量。例如,在 Objective-C 中,通过声明“name”,您还可以获得“_name”。 (3认同)

Dav*_*vid 10

不,我不敢.编译器非常聪明,可以在自动生成的属性上实现这一点,但是对于标准属性,我想象这样的逻辑最终会妨碍并且弊大于利.

例如,如果我创建这样的属性怎么办...

public int SomeValue
{
  get
  {
    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

编译器(具有您正在寻找的功能)是否会创建支持私有变量?为什么?它不需要一个.

另外,如果在编译时才创建私有值,那么您将在代码中引用什么:

public string Name {
  get { return _Name; }
  set { _Name = value }
}
Run Code Online (Sandbox Code Playgroud)

什么是_Name?如果你在其他地方叫另一个值_Name怎么办?那么编译器会为此属性调用后备值?如果我需要两个支持值怎么办?编译器是否足够聪明?

public string Name
{
  get
  {
    return string.Format("{0} {1}", _FirstName, _LastName);
  }
  set
  {
    // some parsing magic
  }
}
Run Code Online (Sandbox Code Playgroud)

之前有人问过,但我想在可预见的未来,答案将继续"不".

自动属性是简单直接成员访问的语法简写.(我认为其驱动力之一就是试图让人们不再public直接创造价值.)属性的复杂程度可以超越非常容易,我个人不希望编译器试图弄清楚我能做什么告诉它要做.

  • 通过发明一个新的关键词(就像"价值",但反之亦然),可以很容易地将其添加到语言中(从理论上讲)......"自我"也许.自我价值; (9认同)
  • 此处跟踪了解决此问题的更好方法:https://github.com/dotnet/csharplang/issues/133 (2认同)