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

问题描述 投票:49回答:3

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

public string Name { get; set; }

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

private string _Name;
public string Name {
    get { return _Name; }
    set { _Name = value }
}

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

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

c# coding-style accessor automatic-properties
3个回答
36
投票

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

public Decimal GrandTotal { get { return FreightTotal + TaxTotal + LineTotal; } }

要么

public string SomeStatus { get { return SomeMethodCall(); } }

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


11
投票

答案是否定的,你不能这样做。这是因为递归。 (见第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 :   }

10
投票

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

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

public int SomeValue
{
  get
  {
    return 0;
  }
}

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

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

public string Name {
  get { return _Name; }
  set { _Name = value }
}

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

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

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

自动属性是简单直接成员访问的语法简写。 (我想它的推动力之一就是试图让人们直接停止创建public值。)属性可以很容易地增加复杂性,我个人不希望编译器试图弄清楚我能做什么很容易告诉它做。

© www.soinside.com 2019 - 2024. All rights reserved.