在班级中调用属性的正确方法是什么?

时间:2014-10-07 12:27:05

标签: c# properties

对于某些人来说,这个问题可能看起来很愚蠢,但我想理解背后的概念,我在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;
    }
}

现在,如果我想要setget类外的属性值,我可以简单地执行以下操作,

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

但我的问题是,如果我想在同一个类中访问此属性,我也有两个选项 我可以用

testNumber = 0;

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

目前的制定者并没有做任何特别的事情:

set { testNumber = value; }

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

封装很有趣,因为类中的任何东西都可以选择同时执行这两种操作,其中的不同逻辑可能会尝试实现非常不同的东西。

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

private uint _testNumber = 0;

根据团队惯例,我们将其视为指示此变量不是直接设置,因此 需要直接设置的任何内容都是明确的,显然是这样做的即使只是偶然看一下代码。 (它也有助于智能感知,因为如果一个人试图设置"测试号码"那么当一个类型的名称时,智能感知将默认为属性,而不是变量。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您有99%的时间想要使用这些属性。为什么呢?
它的简单属性使您可以在代码继续工作的同时在场景中添加逻辑 通过使用该属性,您可以省去在更新其他部分时遗漏某些部分的麻烦,在您使用该类字段的任何地方传播逻辑。
你有没有想过为什么在c#中引入了自动属性? 其中一个原因是,它允许您使用属性,根据需要公开它,并继续编写应用程序的其余部分,然后如果您需要将一些逻辑放入其中,您可以在不破坏现有代码的情况下有效地执行此操作!这感觉就像普通的田野。你只是在第一时间写下这个属性,然后按你的意愿去做。

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