質問するログイン新規登録

Q&A

解決済

3回答

2747閲覧

C# null演算子について

piglet

総合スコア47

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/08/15 11:43

0

0

null (条件?合体?)演算子について知りたいです。

if( class1 != null) { class1.dispose(); class1 = null; }

このようなコードをよく書くのですが
null演算子で完結に書く方法はないでしょうか?

3行目までならば

class1?.dispose();

と一行で書けるのですが

4行目はどう書けばいいでしょうか?
class1 !?? null;
と書いてみましたがエラーが出ました。

if( *** != null)
でいいじゃないと思うのですが
リソースが多くなると、結構邪魔なのでいい方法がないか探しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答3

0

ベストアンサー

そんなに「よく書く」コードでしょうか?
null合体とかではなくusing構文を使うと改善できそうなコード片に見えますが、使っているところをもう少し大きなスコープでご提示いただけたらもう少し具体的なアドバイスができるかもしれません。

投稿2017/08/15 12:09

yuba

総合スコア5570

piglet

2017/08/16 07:30

確かにdispose()とかclose()の中でしか使わないですね 今回コードを見直していたら dispose()の中で5個くらいリソース開放をして 長くなっていたので、何とかならないかと思っていました ちなみに privateで宣言されいて使いまわすリソースなのでusing()はできません(´・ω・`)
yuba

2017/08/16 08:40

disposeかcloseの中でしか、ということは、IDisposableなリソースをラップしたIDisposableを書いているということですね。 それでしたら、 if (class1 != null) class1.Dispose(); の1行で十分ではないでしょうか。 nullでクリアしないとDispose()を2重呼び出ししてしまうおそれが? それはそうなのですが、こうも言えます。Dispose()を2重呼び出ししてはいけないという制約がラップ元からラップ先にも引き継がれただけ。 そしてこれは、そんなに厳密にケアする必要のある制約ではありませんよね。 最終的な使用者はusing使うのでDispose二重呼び出しをすることは故意にやらない限り起こり得ません。 IDisposableなリソースをラップしたIDisposableクラスを書くにあたってDisposeパターンのことをご案内しておきます(ご存じの上でしたらすみません)。 https://msdn.microsoft.com/ja-jp/library/b1yfkh5e(v=vs.110).aspx
piglet

2017/08/17 13:57

詳しい解説をありがとうございます おかげでdispose()に対する理解が深まりました。
guest

0

普通はこれだけで十分だと思います。

class1?.dispose();

どうしても null を代入したいなら、条件判断自体不要です。
そのままclass1 = null;でOKです。

投稿2017/08/16 04:34

hihijiji

総合スコア4152

piglet

2017/08/16 07:34

なるほど、たしかに無条件でnullを代入してもdispose()の後なら問題ないですね
guest

0

例えばある大きなクラスAの中に、メンバとして別のクラスBがあり、A のメソッドによって B を生成したり破棄したりする、という動きをさせる(親ウィンドウから子ウィンドウ、なんてのがそうですね)のであれば、破棄する際に「もうないこと」を明示するために B を表すメンバに null を代入する、というのはよくある手法です。

C# の場合(Java などでもですが)、null を代入することでそれまで存在していた B のインスタンスへの参照が外れ、ガベージコレクションの対象となります。つまり、いつか消えます。
これを嫌って明示的に dispose() するというのも、それはそれで正しいです。

以上を踏まえたうえで、dispose() して null にするならば、それを簡潔に書くのではなく、素直に2行書いたほうが良いと思います。そういう意図があるからだ、とソースを閲覧する人に明示することになるからです。

投稿2017/08/16 08:10

tacsheaven

総合スコア13707

piglet

2017/08/17 13:56

なるほど、いままで気持ち悪いからという感じでdispose()を呼んでいましたが いわれてみれば、まさにコレですね。参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問