在 C# 中得到什么
本文关键字:什么 | 更新日期: 2023-09-27 17:55:55
我从其他地方获取了这段代码,以便有效地显示和隐藏表单。虽然我理解其中的大部分内容,但我不明白 get 在这种情况下和一般情况下做了什么。这能解释吗?赢形
public class FormProvider
{
public static Form1 frm1
{
get
{
if (_frm1 == null)
{
_frm1 = new Form1();
}
return _frm1;
}
}
它只不过是自动生成函数的语法包装器
public static Form1 get_frm1()
{
return _frm1;
}
所以每次你提到FormProvider.frm1
,就像你在打电话FormProvider.get_frm1()
事实上,如果你尝试编写这样的代码:
public class A {
public string Name {get;}
public string get_Name() {
return "James Bond";
}
}
它将给出编译时错误,因为存在定义冲突。
在 C# 中称为属性
属性是一种封装字段的方法,可以使用这些所谓的"Getter"和"Setter"方法访问它们,这些方法可能包含所需的任何逻辑。
在这种情况下,"Getter"将返回Form1
的现有实例(如果有),如果未找到,则创建一个新实例,将其分配给_form1
字段并返回该实例。
我建议您研究上面的链接以进一步了解。
frm1
是一个属性。
属性通常具有吸气get
和可选的二传手set
。
这些用于在访问Property
时提供特殊实现
在这种情况下,如果属性的支持者_frm1
(这是一个字段)是null
,则 getter 负责将其设置为 Form1
的新实例。
它被用作属性的 getter 方法
来自 MSDN
<小时 />属性结合了字段和方法的各个方面。致用户一个对象,一个属性似乎是一个字段,访问该属性需要相同的语法。对于类的实现者来说,属性是一个或两个代码块,表示一个 get 访问器和/或一组访问。get 访问器的代码块在以下情况下执行读取属性;集合访问器的代码块在以下情况下执行将为该属性分配一个新值。没有集的属性访问器被视为只读。没有 get 访问器的属性是被视为只写。具有两个访问器的属性是读写。
与字段不同,属性不分类为变量。因此不能将属性作为引用(C# 引用)或传出 (C#引用)参数。
设置访问器
set 访问器类似于返回类型为 void 的方法。它使用一个名为 value 的隐式参数,其类型是财产。在下面的示例中,将 set 访问器添加到值属性:
**When you assign a value to the property, the set accessor is invoked by using an argument that provides the new value**
以此类为例
class DemoClass
{
private int value;
public Int32 Value
{
get
{
return value;
}
set
{
this.value = value;
}
}
}
如果查看反射器中的编译程序集,您会注意到像
.class private auto ansi beforefieldinit DemoClass
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: ret
}
.property instance int32 Value
{
.get instance int32 ConsoleApplication1.DemoClass::get_Value()
.set instance void ConsoleApplication1.DemoClass::set_Value(int32)
}
.field private int32 value
}