C# 中的 Getter 和 Setter

Getter and Setter in C#

我只是在玩弄 C#,我在问自己哪种方法适合 Getter 和 Setter。我用 google:

找到了类似的东西
class MyClass
{
    Button btnMyButton;

    // some code...

    public Button getBtnMyButton
    {
        get
        {
            return btnMyButton;
        }
    }
}

有'proper'方法吗?或者这样也可以吗:

class MyClass
{
    Button btnMyButton;

    // some code...

    public Button getBtnMyButton()
    {
         return this.btnMyButton;
    }
}

有什么区别?

实际上 getter/setter 只是一个方法 returning/providing 内部值。所以在写

public Button getBtnMyButton
{
    get
    {
        return btnMyButton;
    }
}

你实际上写了一个类似于这个的getter方法:

public Button getBtnMyButton
{
     return this.btnMyButton;
}

因此 java 中的类似方法是使用方法。

同理,this调用是隐式的

你可以做的更短的是:

class MyClass
{
    // some code...

    public Button getBtnMyButton { get; private set; }
}

我建议您阅读一些内容:Auto-Implemented Properties (C# Programming Guide)

正如 Thomas 所提到的,这些是相同的东西。您可能想知道 gettersetter 在这种情况下的意义是什么,它主要是语法糖。但是,这也意味着您不必创建显式字段,因为它会在后台为您创建。因此,你可以简单地做

public Button MyButton { get; private set; }

private set; 确保只有 class 可以设置它的值,因此它在 class 之外基本上是只读的。删除 private 将允许外部 classes 也写入变量。

它们基本上是一回事。 this 指针指向调用方法的对象。

this 指针的一个有趣之处在于它允许您编写 set 函数,例如

public void setMyButton (Button myButton)
{
    this.myButton = myButton;
}

(不确定这是否是有效的 C#,因为我从未使用过它,但你明白了。这应该适用于 Java/C++)

您通常不向属性添加 get/set 前缀。 就这么写吧:

private Button myButton;

public Button MyButton{
   get{
      return myButton;
   }
   /*set{
      myButton = value;
   }*/
}

是的,在您的上下文中意思相同。在这种情况下需要 this.
(注意:这是一个 愚蠢的 示例,应该只向您展示想法)

private Button myButton;

public Button MyButton{
   get{
      Button myButton = null;
      return this.myButton; //<- this. is required or you would end up getting null all the time.
   }
   /*set{
      myButton = value;
   }*/
}

编辑:
添加 get/set 来自诸如 C++ 或 Java 之类的语言,在这些语言中您没有奢侈的属性。使用 get/set 表示一个(重)操作。并且开发人员可能会考虑缓存结果而不是多次调用它。
仅在要指定(重)操作的方法上使用 get/set。如果这是一个非常(简单)的操作,您甚至可能最终使用属性而不是方法。在 Intellisense (Visual Studio) 中,属性 就像一个字段一样呈现,因此我们可以假设没有任何操作正在进行。因此,我(通常)永远不会缓存 属性.

的结果

另一方面 - 如果我找到一个名为 GetResultOfImposible 的 属性。
然后我可能会决定缓存它。
名为 ResultOfImposible 的 属性 听起来不那么沉重,我不会缓存它。
(也许我会在找到性能峰值后改变主意)

您应该多考虑一下 属性 的命名,因为一个 属性 可以同时具有 getter 和 setter。考虑以下因素:

public class MyClass
{
    private Button btnMyButton;

    public Button getMyButton
    {
        get{ return btnMyButton; }
        set{ btnMyButton = value; }
    }
}

    // in some other class
    void ChangeActiveButton(Button newButton)
    {
        MyClass theThing = GetTheThing();

        // This doesn't read well...
        theThing.getMyButton = newButton;
    }

当您实施 属性 getters 和 setters 时,不要在名称前加上 'get' 和 set'。 (对于许多开发人员来说,方法或函数中的词 'get' 和 'set' 意味着代码必须停止并做一些工作才能完成获取或设置,而不是简单地 return或分配一个已经可用的值。)

public class MyClass
{
    private Button btnMyButton;

    // Note that the property just has a name, no prefix.
    public Button MyButton
    {
        get{ return btnMyButton; }
        set{ btnMyButton = value; }
    }
}

另请注意,您可以制作 属性 getter 和 setter private,即使 属性 本身暴露在 class.

public Button MyButton
{
    get{ return btnMyButton; }
    private set{ if(null == btnMyButton) btnMyButton = value; }
}

这为 MyClass 提供了对 setter 的特权访问,可用于实施任何 属性 特定的分配规则。

您也可以使用 Auto-Implemented Properties,无需额外的成员变量。

public Button MyButton { get; private set; }

C# 中的属性很棒。明智地使用它们,它将帮助您创建结构更好、更易于维护的代码。

区别在于目的。当代码只是 returns 一些逻辑很少或根本没有逻辑的值时,您应该使用 属性。同样,如果未调用 setter,通常该值应该相同。当值被创建(不是存储)或逻辑复杂时,你应该使用方法。创建自文档化代码是一种很好的做法。

区别在于:

public Button getBtnMyButton()
{
     return this.btnMyButton;
}

是一个方法,它可以接受输入参数和returns一个输出参数。

其他:

public Button getBtnMyButton
{
    get
    {
        return btnMyButton;
    }
}

是一个属性。您可以将 属性 视为围绕变量的 "wrapper",它允许您验证变量值并执行其他类型的操作。

示例:

public Button getBtnMyButton
{
    get
    {
        if (btnMyButton != null)
            return btnMyButton;

        throw new Exception("Button is null!");
    }
    set
    {
        if (value == null)
            return;

        btnMyButton = value;
    }
}