[解決済み] ゲッター、セッター、プロパティのベストプラクティス。JavaとC#の比較
質問
私は今C#のクラスを取っていて、物事を行うための最良の方法を見つけようとしています。私は Java のバックグラウンドを持っているので、Java のベストプラクティスのみを知っています。
Javaでは、もし私がプライベートプロパティを持っているならば、私はこれを行います。
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
C#では、いろいろなやり方があるようですね。
Javaみたいにできるんだ。
private string name;
public void setName(string name) {
this.name = name;
}
public string getName() {
return this.name;
}
あるいは、このようにすることもできます。
private string name;
public string Name {
get { return name; }
set { name = value; }
}
または
public string Name { get; set; }
どれを使うべきか、またそれぞれのアプローチに関わる注意点や微妙な点は何でしょうか?クラスを作成するとき、私はJavaから知っている一般的なベストプラクティスに従います(特にEffective Javaを読んで)。例えば、私は不変性(必要なときだけセッターを提供する)を好んでいます。これらのプラクティスが C# でセッターとゲッターを提供するさまざまな方法とどのように適合するのか、基本的に、Java の世界でのベストプラクティスを C# にどのように翻訳すればよいのでしょうか。
EDIT
Jon Skeetさんの回答へのコメントとして投稿していたのですが、長くなってしまったので。
非自明なプロパティ(すなわち、おそらく重要な処理と検証を伴う)についてはどうでしょうか? パブリック プロパティを通じて公開することは可能ですが、ロジックを
get
と
set
? なぜ、専用のセッターとゲッターメソッド(関連する処理と検証ロジック付き)を持つことよりも、これを行う必要があるのでしょうか?
どのように解決するのですか?
プレC# 6
このうち最後のものは、些細なプロパティのために使うことにします。なお、私はこれを パブリック プロパティと呼ぶことにします。
不変性は自動実装されたプロパティでは少し厄介です。ゲッターだけを持つ自動プロパティは書けません。最も近いのは
public string Foo { get; private set; }
は 本当に というのは、クラスの外では不変であるからです。そのため 本当の の読み取り専用プロパティを使用するとよいでしょう。
private readonly string foo;
public string Foo { get { return foo; } }
を書くのは絶対にやめましょう。
getName()
と
setName()
. で
いくつかの
の場合、プロパティを使用するよりも Get/Set メソッドを書く方が理にかなっています。特に、プロパティが高価である可能性があり、それを強調したい場合です。しかし、メソッドについては .NET の命名規則である PascalCase に従いたいでしょうし、このような些細なプロパティは通常のメソッドで実装されたくはないでしょう - ここではプロパティがより一般的です。
C# 6
万歳!ついに適切な読み取り専用の自動実装プロパティを手に入れました。
// This can only be assigned to within the constructor
public string Foo { get; }
同様に、読み取り専用のプロパティで を行う が必要な読み取り専用のプロパティには、メンバーボディプロパティを使用することができます。
public double Area => height * width;
関連
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] プロパティとゲッターとセッターの使い分け
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み] 関数を終了するには?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。