2014-10-07 200 views
0

这个问题可能看起来很愚蠢,但我想了解背后的概念,我在TestClass中有一个属性(即TestNumber)。什么是在课堂内调用属性的正确方法?

public class TestClass 
{ 
    private uint testNumber=0; 
    public uint TestNumber 
    { 
     get { return testNumber; } 
     set { testNumber = value; } 
    } 

    public TestClass() 
    { 
     TestNumber = 0; 
     // or 
     testNumber = 0; 
    } 
} 

现在,如果我想setget类的外部属性的值,我可以简单地做到以下几点,

TestClass tc = new TestClass(); 
tc.TestNumber = 10; 

但我的问题是,如果我想访问这个属性在同一个班级中,我有两个选项 我可以使用

testNumber = 0;

TestNumber = 0;,所以哪一个是正确的&为什么?

谢谢!

+2

两者都是合法的。但是如果你使用属性,那么* setter *代码将被执行。此问题(或类似问题)已经[问](http://stackoverflow.com/q/295104/1997232)。 – Sinatr 2014-10-07 12:28:31

回答

2

取决于你想要做什么......

  • 你想直接设置变量?
  • 你想调用setter逻辑吗?

的电流设定没有做什么特别的:

set { testNumber = value; } 

哪天威力。如果类中有任何大量的逻辑,那么可能需要更新该逻辑,以便在该时间到来时使用setter而不是变量。相反,然而,一些的类内部的逻辑可能明确而不是想要使用setter的逻辑,并可能想要继续直接设置变量。

封装很有趣,因为类中的任何东西都可以选择执行两者,而其中的不同逻辑可能试图实现非常不同的事情。

作为个人喜好的事情,我经常喜欢使用命名约定,暗示变量是我不想直接设置的变量。我见过的最常见的惯例是用下划线前缀:

private uint _testNumber = 0; 

按照惯例上,我们把它作为一个指标,这个变量并不意味着直接设置了球队,所以任何事情需要直接设置它是显而易见的,显然这样做,即使只是随便看一眼代码。 (这也有助于intellisense,因为如果有人试图设置“测试编号”,那么当一个类型名称的智能感知将默认为属性,而不是变量)

1

尽管两者都是有效的,后者是更好,因为你可以使用setter/getters逻辑(如果它更多,然后简单地返回/设置后场的值)。因此,对于您的会员,您只有一个访问点,而不是许多可能的访问点。

1

几乎99%的时间你想使用的属性。为什么?
它的简单性能使您可以在场景背后添加逻辑,而代码像以前一样继续工作。
通过使用该属性,您可以节省自己在更新其他部分时错过某些部分的头痛感,在您使用课程中的任何位置传播逻辑。
你有没有想过为什么在c#中引入自动属性?
其中一个原因是它允许您使用该属性,随意暴露它,并继续编写应用程序的其余部分,然后如果您需要在其中编写一些逻辑,则可以在不中断的情况下有效地执行该操作现有的代码!这只是感觉像普通的田野。你只需在第一个地方写下房产,然后按照你的意愿去做。

Have a look at here too.它可能有帮助。

相关问题