0

フォームを効果的に表示および非表示にするために、このコードを他の場所から取得しました。私はそのほとんどを理解していますが、このコンテキストで、そして一般的にgetが何をするのか理解していません。これは説明できますか?WinForms

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

4 に答える 4

5

自動生成された関数の構文ラッパーに他なりません。

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";
    }
}

定義の衝突があるため、コンパイル時エラーが発生します。

于 2013-01-25T15:21:36.890 に答える
1

これらはC#ではプロパティと呼ばれます

プロパティは、これらのいわゆる「Getter」および「Setter」メソッドでアクセスできるようにフィールドをカプセル化する方法であり、必要なロジックを含めることができます。

この場合、「Getter」は既存のインスタンスForm1(存在する場合)を返すか、見つからない場合は新しいインスタンスを作成し、それを_form1フィールドに割り当てて返します。

さらに理解を深めるために、上記のリンクを調べてみることをお勧めします。

于 2013-01-25T15:30:18.407 に答える
0

プロパティのゲッターメソッドとして使用されます

MSDNから


プロパティは、フィールドとメソッドの両方の側面を組み合わせたものです。オブジェクトのユーザーには、プロパティはフィールドのように見えます。プロパティにアクセスするには、同じ構文が必要です。クラスの実装者にとって、プロパティは1つまたは2つのコードブロックであり、getアクセサーおよび/またはsetアクセサーを表します。getアクセサーのコードブロックは、プロパティが読み取られるときに実行されます。プロパティに新しい値が割り当てられると、setアクセサーのコードブロックが実行されます。アクセサが設定されていないプロパティは、読み取り専用と見なされます。getアクセサーのないプロパティは、書き込み専用と見なされます。両方のアクセサーを持つプロパティは読み取り/書き込みです。

フィールドとは異なり、プロパティは変数として分類されません。したがって、プロパティをref(C#リファレンス)またはout(C#リファレンス)パラメーターとして渡すことはできません。


セットアクセサー

setアクセサーは、戻りタイプがvoidであるメソッドに似ています。これは、valueと呼ばれる暗黙のパラメーターを使用します。このパラメーターのタイプは、プロパティのタイプです。次の例では、setアクセサーがValueプロパティに追加されています。

**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;
        }
    }
}

リフレクターでコンパイルされたアセンブリを見ると、uは次のように気付くでしょう。

.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

}
于 2013-01-25T15:22:28.033 に答える
0

frm1プロパティです。

プロパティには通常、ゲッターgetとオプションのセッターがありsetます。

これらは、にアクセスするときに特別な実装を提供するために使用されますProperty

この場合、プロパティのバッカー_frm1(フィールド)がnullである場合、ゲッターはそれをの新しいインスタンスに設定する責任がありますForm1

于 2013-01-25T15:29:04.690 に答える