[解決済み] C#の略記法ゲッターとセッター
質問
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; } }
}
関連
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] プロパティとゲッターとセッターの使い分け
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] 関数を終了するには?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015