1. ホーム
  2. c#

[解決済み] C#の略記法ゲッターとセッター

2022-03-08 19:45:43

質問

C#のセッターとゲッターはどのようにカプセル化を実装しているのでしょうか?私はプログラミングの経験があり、特にJavaでは、次のようにセッターとゲッターを使用します。

public class Person {
    private String fName;

    public void setName(String someName) {
        fName = someName;
    }

    public String getName() {
        return fName;
    }
}

public class Test {

    public static void main(String[] args) {
        Person p = new Person();

        p.setName("Bob");
        System.out.println(p.getName());
    }
}

そして、C#ではショートハンドレッドを使って

public class Person {
    public string fName{ get; set;}
}

C#の略記法ゲッターとセッターはどのようにカプセル化を実装するのですか? どのように私は上記のJavaコードと同じようにそのC#コードを実装するのですか? それに関する制限はありますか? そして私の観察からベース、私はそれがpublicに設定されている場合のみ、その "fName" 、特に "public string fName{ get; set; }" が使用できます。

どうすればいいですか?

カプセル化の動作を指定することはできません。 しかし、フィールドではなく、クラスのパブリックインターフェイスのプロパティとして指定することができます。

ここでの違いは、Javaではゲッターとセッターは単に一定の規則(getXXX, setXXX)に従ったメソッドであるということです。 C#では、プロパティはファーストクラスの構成要素です(裏では基本的にゲッターとセッターであるにもかかわらず)。 つまり、C#は、後でカプセル化を実装するかもしれないが(例えば、ゲッターやセッターに動作を追加する)、クラスの消費者を壊したくないので、前もってプロパティとして宣言しておくという省略表現として、これらを提供しているのです。

Javaでは

public class Foo {
    private String fooName;
    public String BarName;
    public String getFooName() { return fooName; }
    public String setFooName(String fooName) { this.fooName = fooName; }

}

C#の場合。

public class Foo {
    public String FooName { get; set; }
    public String BarName;
}

Fooアセンブリを参照する別のアセンブリにコンシューマ・クラスFooReaderが定義されていると仮定しましょう。

public class FooReader {
    public String ReadFoo(Foo foo) {
        // This returns the Foo **property**
        return foo.FooName;
    }

    public String ReadBar(Foo foo) {
        // This returns the Bar **field**
        return foo.BarName;
    }
}

ここで、Fooを次のように変更します。 ではありません。 はFooReaderを壊します。

public class Foo {
    private String _fooName;
    public String FooName { get { return _fooName.ToUpper(); } set { _fooName = value; } }
    public String BarName;
}

しかし、Fooをこのように変更することで WILL FooReaderが壊れるので、再コンパイルが必要です。

public class Foo {
    private String _fooName;
    private String _barName;
    public String FooName { get { return _fooName.ToUpper(); } set { _fooName = value; } }

    // This breaks FooReader because you changed a field to a property
    public String BarName { get { return _barName.ToUpper(); } set { _barName = value; } }
}