[解決済み] C#でnullでない場合のメソッド呼び出し
2022-07-28 13:19:34
質問
この文章を何とか短くできないでしょうか?
if (obj != null)
obj.SomeMethod();
というのは、たまたまこれを書くことが多くて、かなりめんどくさくなってしまうからです。唯一思いつくのは、実装として Nullオブジェクト パターンを実装することくらいしか思いつきませんが、それは毎回できることではありませんし、構文を短くするための解決策でないことは確かです。
また、イベントでも同様の問題があり、ここでは
public event Func<string> MyEvent;
を実行し
if (MyEvent != null)
MyEvent.Invoke();
どのように解決するのですか?
C# 6 以降は、そのまま使えます。
MyEvent?.Invoke();
または
obj?.SomeMethod();
は
?.
はnull-propagating演算子であり、これにより
.Invoke()
を短絡させ、オペランドが
null
. オペランドは一度しかアクセスされないので、quot;check と invoke" の間で値が変わるという問題が発生する危険はありません。
===
C# 6 より前のバージョンでは、NULL-SAFE のマジックはありません。
public static void SafeInvoke(this Action action) {
if(action != null) action();
}
はこれで有効です。
Action act = null;
act.SafeInvoke(); // does nothing
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke(); // writes "hi"
イベントの場合、これはレースコンディションを取り除くという利点もあります。つまり、一時的な変数が不要になるのです。つまり、通常は
var handler = SomeEvent;
if(handler != null) handler(this, EventArgs.Empty);
を持つが
public static void SafeInvoke(this EventHandler handler, object sender) {
if(handler != null) handler(sender, EventArgs.Empty);
}
はシンプルに使うことができます。
SomeEvent.SafeInvoke(this); // no race condition, no null risk
関連
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み] instanceofを呼び出す前にnullチェックは必要ですか?
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み] Pythonでnullオブジェクトを参照する
-
[解決済み] カラムの変更:NULLをNOT NULLに変更する
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] C#で同期メソッドから非同期メソッドを呼び出すには?
-
[解決済み] nullはなぜオブジェクトなのか、nullとundefinedの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】WebResource.axdとは何ですか?