我只是在玩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;
}
}
区别是什么?
答案 0 :(得分:9)
正如托马斯所说,这些都是一样的。您可能想知道getter
和setter
在这种情况下的重点是什么,它主要是语法糖。但是,这也意味着您不必创建显式字段,因为在后台为您创建了一个字段。因此,你可以简单地做到
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; }
}
答案 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;
}
}