Rei*_*167 55 c# coding-style accessor automatic-properties
我最近学到了c#,所以当我学会写属性时,我被教会这样做:
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
汽车房产很棒!但是现在我正在尝试做一些更复杂的事情,所以我需要编写一对自定义访问器.
private string _Name;
public string Name {
get { return _Name; }
set { _Name = value }
}
Run Code Online (Sandbox Code Playgroud)
我知道当一个人使用autos时,编译器会将私有实例变量放在它的黑暗深处,但是我被宠坏了并且不希望那个私有变量看起来毫无意义.
有没有办法在没有私有变量的情况下使用自定义访问器?
jha*_*ldt 41
属性根本不需要支持变量(字段).虽然它们可用于封装简单字段,但您也可以使用它们来访问其他数据.
public Decimal GrandTotal { get { return FreightTotal + TaxTotal + LineTotal; } }
Run Code Online (Sandbox Code Playgroud)
要么
public string SomeStatus { get { return SomeMethodCall(); } }
Run Code Online (Sandbox Code Playgroud)
如果目标是简单地用属性封装某个字段,那么如果不使用自动属性,则需要某种支持字段.
tik*_*ika 13
答案是否定的,你不能这样做.这是因为递归.(见第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 : }
Run Code Online (Sandbox Code Playgroud)
Dav*_*vid 10
不,我不敢.编译器非常聪明,可以在自动生成的属性上实现这一点,但是对于标准属性,我想象这样的逻辑最终会妨碍并且弊大于利.
例如,如果我创建这样的属性怎么办...
public int SomeValue
{
get
{
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器(具有您正在寻找的功能)是否会创建支持私有变量?为什么?它不需要一个.
另外,如果在编译时才创建私有值,那么您将在代码中引用什么:
public string Name {
get { return _Name; }
set { _Name = value }
}
Run Code Online (Sandbox Code Playgroud)
什么是_Name?如果你在其他地方叫另一个值_Name怎么办?那么编译器会为此属性调用后备值?如果我需要两个支持值怎么办?编译器是否足够聪明?
public string Name
{
get
{
return string.Format("{0} {1}", _FirstName, _LastName);
}
set
{
// some parsing magic
}
}
Run Code Online (Sandbox Code Playgroud)
之前有人问过,但我想在可预见的未来,答案将继续"不".
自动属性是简单直接成员访问的语法简写.(我认为其驱动力之一就是试图让人们不再public直接创造价值.)属性的复杂程度可以超越非常容易,我个人不希望编译器试图弄清楚我能做什么告诉它要做.
| 归档时间: |
|
| 查看次数: |
61537 次 |
| 最近记录: |