C#不带私有变量的自定义getter/setter

C#不带私有变量的自定义getter/setter,c#,coding-style,accessor,automatic-properties,C#,Coding Style,Accessor,Automatic Properties,我最近学习了c#,所以当我学习写属性时,我被教导这样做: public string Name { get; set; } 汽车性能很好!但现在我正试图做一些更复杂的事情,所以我需要编写一对自定义访问器 private string _Name; public string Name { get { return _Name; } set { _Name = value } } 我知道当一个人使用autos时,编译器会使一个私有实例变量在它的黑暗深处,但是我被宠坏了,不希望这

我最近学习了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 int SomeValue
{
  get
  {
    return 0;
  }
}
编译器(使用您正在寻找的功能)会创建一个支持私有变量吗?为什么?它不需要一个

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

public string Name {
  get { return _Name; }
  set { _Name = value }
}
什么是
\u Name
?如果您在其他地方有另一个名为
\u Name
的值,该怎么办?那么编译器会调用此属性的支持值是什么?如果我需要两个支持值怎么办?编译器是否足够聪明

public string Name
{
  get
  {
    return string.Format("{0} {1}", _FirstName, _LastName);
  }
  set
  {
    // some parsing magic
  }
}
以前有人问过这个问题,但我想在可预见的未来答案将继续是“不”


auto属性是简单直接成员访问的语法缩写。(我想它的驱动力之一就是试图让人们停止直接创建<代码>公共<代码>值。)属性的复杂性可以很容易地增长到远远超过这一点,我个人不希望编译器试图弄明白我可以简单地告诉它做什么。

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

第1行:公共字符串名称
第2行:{
第三行:获取
第4行:{
第5行:返回FirstName+“”+LastName;
第6行:}
第7行:集合
第8行:{

第9行:Name=value;//不可能。是的!创建一个私有的自动属性!JK.你到底想做什么-你的“自定义访问器”会做什么而不需要私有属性?你说的“自定义访问器”到底是什么意思?它们的“自定义”是什么?@Oded我认为“自定义”是什么意思,他指的是所有非自动属性。这里跟踪了解决此问题的更好方法:+1如果将.NET属性实现与Java等语言进行比较,您会发现
get
set
只是创建两个不同方法的简写,这两个方法分别称为
get\u PropertyName
set\u PropertyName
>好的,从概念上来说是肯定的。从技术上讲,用这些名称定义两个方法(至少用C#)不会产生一个你可以通过反射看到的属性。希望我们可以满足我当前的愿望(只将setter标记为过时)。通过发明一个新的关键字(就像“value”一样),它可以很容易地添加到语言中(理论上讲)但反过来说)…自我maybe.self=value;这里跟踪了解决此问题的更好方法:对,如果在其内部调用getter/setter,将导致无限递归。C#编译器在内部为属性创建一个支持字段。这在其他语言中有时称为实例变量。例如,在objective-C中,通过声明
name
,您也会得到
\u name
。如果我先检查修改是否会发生这种情况?即设置{if(name!=value)name=value}
public string Name
{
  get
  {
    return string.Format("{0} {1}", _FirstName, _LastName);
  }
  set
  {
    // some parsing magic
  }
}
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 :   }