[解決済み] .NETのゲッター宣言とセッター宣言【重複】について
質問
これらのゲッターとセッターの宣言の違いは何なのか、また、好ましい方法はあるのか(そしてその理由)。最初のものはVisual Studioによって自動的に生成されます。他はどうですか?ありがとうございます。
第1回
string _myProperty { get; set; }
第2
string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
3位
string _myProperty;
public string getMyProperty()
{
return this._myProperty;
}
public void setMyProperty(string value)
{
this._myProperty = value;
}
解決方法は?
プロパティは、あるデータをカプセル化するために使用されます。プレーンなフィールドを使用することもできます。
public string MyField
しかし、このフィールドは、あなたのクラスの外部のすべてのユーザーがアクセスすることができます。不正な値を挿入されたり、予想外の方法で値を変更されたりすることがあります。
プロパティを使用することで、データへのアクセス方法をカプセル化することができます。C#には、フィールドをプロパティに変換するための優れた構文があります。
string MyProperty { get; set; }
これは 自動実装されたプロパティ . 必要があれば、プロパティを拡張することができます。
string _myProperty;
public string MyProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
の値を検証するコードを追加することができます。
setter
:
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentNullException();
_myProperty = value;
}
プロパティは、ゲッターとセッターに異なるアクセッサを持つこともできます。
public string MyProperty { get; private set; }
この方法では、誰でも読むことができるが、クラス自身によってのみ変更可能なプロパティを作成します。
また、完全にカスタム化した実装を
getter
:
public string MyProperty
{
get
{
return DateTime.Now.Second.ToString();
}
}
C#は、自動実装されたプロパティをコンパイルすると、中間言語(IL)を生成します。ILの中で、あなたは
get_MyProperty
と
set_MyProperty
メソッドを使用します。というバッキングフィールドも作成されます。
<MyProperty>k_BackingField
(通常、これはC#では不正な名前ですが、ILでは有効です。こうすれば、生成された型と自分のコードとの間に矛盾が生じることはありません)。ただし、C#では正式なプロパティ構文を使用する必要があります。そうすることで、C#でのエクスペリエンスが向上します(たとえば、IntelliSenseを使用した場合など)。
慣例として、時間がかかる操作にはプロパティを使うべきではない。
関連
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] .NETでC#オブジェクトをJSON文字列に変換するには?
-
[解決済み] .NETでフォーマット文字列のブレース(中括弧)をエスケープする方法
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] 2つのリストを結合する
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] C# 3.0自動プロパティ - 役に立つか否か?[クローズド]です。