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(理论上)。 为我崩溃(实际上)。