对于某些人来说,这个问题可能看起来很愚蠢,但我想理解背后的概念,我在TestNumber
内有一个属性(即TestClass
)。
public class TestClass
{
private uint testNumber=0;
public uint TestNumber
{
get { return testNumber; }
set { testNumber = value; }
}
public TestClass ()
{
TestNumber = 0;
// or
testNumber = 0;
}
}
现在,如果我想要set
或get
类外的属性值,我可以简单地执行以下操作,
TestClass tc = new TestClass ();
tc.TestNumber = 10;
但我的问题是,如果我想在同一个类中访问此属性,我也有两个选项 我可以用
testNumber = 0;
或
TestNumber = 0; ,哪一个是正确的&为什么呢?
谢谢!
答案 0 :(得分:2)
取决于你想做什么......
目前的制定者并没有做任何特别的事情:
set { testNumber = value; }
但有一天 可能。如果类中包含任何大量逻辑,则可能需要更新该逻辑以在该时间到来时使用setter而不是变量。然而,相反,类的内部逻辑的某些可能明确不想要使用setter的逻辑,并且可能希望继续直接设置变量。
封装很有趣,因为类中的任何东西都可以选择同时执行这两种操作,其中的不同逻辑可能会尝试实现非常不同的东西。
作为个人喜好,我经常喜欢使用命名约定,暗示变量是我不想直接设置的。我见过的最常见的约定是用下划线加上前缀:
private uint _testNumber = 0;
根据团队惯例,我们将其视为指示此变量不是直接设置,因此 需要直接设置的任何内容都是明确的,显然是这样做的即使只是偶然看一下代码。 (它也有助于智能感知,因为如果一个人试图设置"测试号码"那么当一个类型的名称时,智能感知将默认为属性,而不是变量。)
答案 1 :(得分:1)
虽然两者都有效但后者更好,因为你可以使用setter / getters逻辑(如果它更多则只返回/设置后场的值)。因此,您的成员只有一个访问点,而不是许多可能的访问点。
答案 2 :(得分:1)
您有99%的时间想要使用这些属性。为什么呢?
它的简单属性使您可以在代码继续工作的同时在场景中添加逻辑
通过使用该属性,您可以省去在更新其他部分时遗漏某些部分的麻烦,在您使用该类字段的任何地方传播逻辑。
你有没有想过为什么在c#中引入了自动属性?
其中一个原因是,它允许您使用属性,根据需要公开它,并继续编写应用程序的其余部分,然后如果您需要将一些逻辑放入其中,您可以在不破坏现有代码的情况下有效地执行此操作!这感觉就像普通的田野。你只是在第一时间写下这个属性,然后按你的意愿去做。
Have a look at here too.它可能会有所帮助。