C#自定义getter / setter没有私有变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#自定义getter / setter没有私有变量相关的知识,希望对你有一定的参考价值。
我最近学到了c#,所以当我学会写属性时,我被教会这样做:
public string Name { get; set; }
汽车房产很棒!但现在我正在尝试做一些更复杂的事情,所以我需要编写一对自定义的访问器。
private string _Name;
public string Name {
get { return _Name; }
set { _Name = value }
}
我知道当一个人使用autos时,编译器会将私有实例变量放在它的黑暗深处,但是我被宠坏了并且不希望那个私有变量看起来毫无意义。
有没有办法在没有私有变量的情况下使用自定义访问器?
属性根本不需要支持变量(字段)。虽然它们可用于封装简单字段,但您也可以使用它们来访问其他数据。
public Decimal GrandTotal { get { return FreightTotal + TaxTotal + LineTotal; } }
要么
public string SomeStatus { get { return SomeMethodCall(); } }
如果目标是简单地用属性封装某个字段,那么如果不使用自动属性,则需要某种支持字段。
答案是否定的,你不能这样做。这是因为递归。 (见第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 : }
不,我不敢。编译器非常聪明,可以在自动生成的属性上实现这一点,但是对于标准属性,我想象这样的逻辑最终会妨碍并且弊大于利。
例如,如果我创建这样的属性怎么办...
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
值。)属性可以很容易地增加复杂性,我个人不希望编译器试图弄清楚我能做什么很容易告诉它做。
以上是关于C#自定义getter / setter没有私有变量的主要内容,如果未能解决你的问题,请参考以下文章
C ++:私有结构的每个单个成员的通用getter/setter