C#中的Getter和Setter

时间:2015-06-19 12:49:00

标签: c# setter getter

我只是在玩C#,我正在自言自语,Getter和Setter的正确方法是什么。我用google找到了类似的东西:

class MyClass
{
    Button btnMyButton;

    // some code...

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

有一种'正确'的方式吗?或者这也没关系:

class MyClass
{
    Button btnMyButton;

    // some code...

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

区别是什么?

8 个答案:

答案 0 :(得分:9)

正如托马斯所说,这些都是一样的。您可能想知道gettersetter在这种情况下的重点是什么,它主要是语法糖。但是,这也意味着您不必创建显式字段,因为在后台为您创建了一个字段。因此,你可以简单地做到

public Button MyButton { get; private set; }

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

答案 1 :(得分:2)

您通常不向属性添加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的属性听起来不那么重,我不会缓存它 (也许在找到表演高峰后我会改变主意)

答案 2 :(得分:1)

您应该多考虑一下属性的命名,因为一个属性可以同时具有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;
    }

当您实现属性getter和setter时,请不要在名称前添加'get'并设置'。 (对于许多开发人员来说,方法或函数中的“获取”和“设置”一词意味着代码必须完成并完成获取或设置的一些工作,而不是简单地返回或分配已经存在的值手。)

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

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#中的属性非常棒。明智地使用它们,它将帮助您创建更好的结构化,更易于维护的代码。

答案 3 :(得分:0)

实际上,getter / setter只不过是返回/提供内部值的方法。所以在写作时

public Button getBtnMyButton
{
    get
    {
        return btnMyButton;
    }
}

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

public Button getBtnMyButton
{
     return this.btnMyButton;
}

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

答案 4 :(得分:0)

这是相同的,this调用是隐含的。

你可以做的越短:

class MyClass
{
    // some code...

    public Button getBtnMyButton { get; private set; }
}

我建议你阅读一下:Auto-Implemented Properties (C# Programming Guide)

答案 5 :(得分:0)

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

关于this指针的一个有趣的事情是它允许你编写set函数,如

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

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

答案 6 :(得分:0)

区别在于目的。你应该使用属性,当代码只返回一些逻辑很少的值或没有它时。如果没有调用setter,通常值也应该相同。当创建(未存储)值或逻辑很复杂时,您应该使用方法。创建自我记录的代码是一种很好的做法。

答案 7 :(得分:0)

区别在于:

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

方法,它可以接受输入参数并返回输出参数。

另一个:

public Button getBtnMyButton
{
    get
    {
        return btnMyButton;
    }
}

属性。你可以看到一个属性作为变量的“包装器”,它允许你验证变量值并执行其他类型的东西。

示例:

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

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

        btnMyButton = value;
    }
}