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 所提到的,这些是相同的东西。您可能想知道 getter
和 setter
在这种情况下的意义是什么,它主要是语法糖。但是,这也意味着您不必创建显式字段,因为它会在后台为您创建。因此,你可以简单地做
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;
}
}
我只是在玩弄 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 所提到的,这些是相同的东西。您可能想知道 getter
和 setter
在这种情况下的意义是什么,它主要是语法糖。但是,这也意味着您不必创建显式字段,因为它会在后台为您创建。因此,你可以简单地做
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;
}
}