在 C# 中得到什么

本文关键字:什么 | 更新日期: 2023-09-27 17:55:55

我从其他地方获取了这段代码,以便有效地显示和隐藏表单。虽然我理解其中的大部分内容,但我不明白 get 在这种情况下和一般情况下做了什么。这能解释吗?赢形

public class FormProvider
{
    public static Form1 frm1
    {
        get
        {
            if (_frm1 == null)
            {
                _frm1 = new Form1();
            }
            return _frm1;
        }
    }

在 C# 中得到什么

它只不过是自动生成函数的语法包装器

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
}