2009-08-19 82 views
3

注意,下面的代码是在一个单独的类使用私人或使用属性? C#

private string _fee; 
private string _receipt; 

public string Fee 
{ 
    get { return _fee; } 
    private set { _fee = value; } 
} 

public string Receipt 
{ 
    get { return _receipt; } 
    private set { _receipt = value;} 
} 

public MyValue(string fee, string receipt) : this() 
{ 
    _fee = int.Parse(receipt).ToString(); 
    _receipt = receipt; 
} 

正如你可以看到我的财产什么也不做,所以我应该使用

_fee = int.Parse(fee).ToString(); 
_receipt = receipt; 

Fee = int.Parse(fee).ToString(); 
Receipt = receipt; 
+0

哦,这是我与ReSharper的使用的第一个脚本。我就喜欢! – 2009-08-19 15:52:19

回答

16

使用属性,如果你在C#3你应该使用自动实现的属性是这样的:

public string Fee 
{ 
    get; private set; 
} 

public string Receipt 
{ 
    get; private set; 
} 

public MyValue(string fee, string receipt) : this() 
{ 
    this.Fee = int.Parse(fee).ToString(); 
    this.Receipt = receipt; 
} 
10

我总是使用属性 - 它给你更多的灵活性:

  • 你以后可以创建更复杂的getter和setter方法,如果需要的话
  • 你可以在getter和setter
  • 指定不同的可见性,您可以定义虚拟性和覆盖在派生类中,如果需要的话
  • 您可以使用数据绑定对性能,而不是场

而且,似乎.NET反射表现略有不同的性质与领域,所以如果你有属性和字段的组合,你需要知道这些细微的差异 - 如果你只使用属性,y ou're好去:-)

虽然类中,你可以使用后备存储领域要么,或财产 - 如果你使用的财产,任何副作用的制定者可能有(更新等领域,记录您的通话等)将被使用 - 如果您直接访问后备存储区域,则可以解决这些问题。这可能是一个好的或坏的事情 - 取决于你的情况。只要注意你在做什么! :-)

马克

+0

+1,但我会添加“不破坏二进制兼容性”到您的第一点和反思评论。否则,你仍然可以重新考虑私人领域。 – 2009-08-19 15:57:26

+0

我开始想知道如果c#编译器甚至应该允许公共字段。似乎没有理由使用它们。 – 2009-08-19 16:38:14

4

在这种情况下,它并不重要,因为只要你在你的代码中保持一致。

但是,如果你的属性标记为virtual,那么它不会访问它们在构造函数是个好主意,这将是不如直接使用的字段。这是因为你的属性的行为可能被覆盖,你的基类可能会调用破坏代码。


编辑:只是为了澄清,我只是参照了OP的例子中,方法上的差异。 marc_s给出了一些很好的观点,说明为什么在大多数情况下,特性可能是有利的。

0

我总是会直接使用成员。

这是因为你可以在不能因为一些其他领域不被设定成从构造方法中正常运行的setter执行代码。

如果作为womp提到的特性是虚拟的,有可能成为更糟。