C#自定义getter / setter没有私有variables

我最近学习了c#,所以当我学会编写属性的时候,我被教导要这样做:

public string Name { get; set; } 

汽车性能是伟大的! 但是现在我试图做一些更复杂的事情,所以我需要编写一个自定义的访问器对。

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

我知道编译器在使用汽车的时候使得一个私有的实例variables在黑暗的深处变暗,但是我被宠坏了,并且不希望这个私有variables看起来毫无意义。

有没有办法使用自定义访问没有私有variables?

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

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

要么

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

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

不,我恐怕没有。 编译器足够聪明,可以让你在自动生成的属性上发生这种情况,但是对于标准的属性,我想象这样的逻辑最终会阻碍你的发展,造成更多的伤害。

例如,如果我创build一个像这样的属性…

 public int SomeValue { get { return 0; } } 

编译器(你正在寻找的function)会创build一个后备私有variables? 为什么? 它不需要一个。

另外,如果在编译时间之前没有创build私有值,那么你要在代码中引用什么:

 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价值。)属性的复杂性可能会变得非常容易,我个人不希望编译器试图弄清楚我能做什么轻松地告诉它做。

答案是否定的。你不能用set来明确地设置属性。 这个想法是recursion集 。 (见行号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 : } 

它进行recursion(理论上)。 为我崩溃(实际上)。