C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: インスタンス生成時におけるnullチェックの必要性について


(過去ログ 57 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■32706 / inTopicNo.1)  インスタンス生成時におけるnullチェックの必要性について
  
□投稿者/ toroneko (1回)-(2009/02/13(Fri) 09:35:04)

分類:[C#] 

開発環境:VisualStudio 2008 & .NET Framework 2.0

C#でプロジェクトを進めていくうちにコードの可読性が悪化しており、
製品レベルの品質を向上させるため、C#のガイドラインやベストプラクティスを模索しております。
宜しくお願い致します。


【質問】
下記のような一般的なインスタンスの生成時、nullチェックが必要かどうか教えて下さい。
必要な場合、どういう時に通過するのか知りたいです(出来れば情報源も知りたいです!)
ArrayList list = new ArrayList();
if (list == null)
{
  // エラー時のフロー(ログでも出す?)
}
else
{
  // 正常時のフロー
}

【制約】
アンマネージなリソースなど、問題発生時に開放すべきものは無い前提でお願いします。

【補足】
当方はC++からC#に移行したのでnullチェックする癖が付いていたのですが、
●C#ではガベージコレクションがある点
●new がメモリの割り当てに失敗するとOutOfMemoryException例外がスローされる点
を考えるとnullチェックのフローを通る事は無いように感じます。
(今思えばC++も設定次第で例外がスローされるから、nullチェックとは違うアプローチで
 メモリの開放を行うべきでしたね…)


C#におけるインスタンス生成時の良いコーディング方法を是非ご教授下さい!!
「nullチェックせずにバンバンnewするのが普通」とか「意味がなくてもやる」とか…理由も♪
(もちろん最高や絶対というものは無いのでしょうが、お勧めでも構いません)

以上、宜しくお願い致します。


引用返信 編集キー/
■32707 / inTopicNo.2)  Re[1]: インスタンス生成時におけるnullチェックの必要性について
□投稿者/ επιστημη (1713回)-(2009/02/13(Fri) 09:43:38)
επιστημη さんの Web サイト
あたしゃ「nullチェックせずにバンバンnew」します。
そじゃないとあちこちに null-check が割り込んでうざったくてしょうがない。
# だから"ご意見伺い"にいらっしゃったんでしょうけども

コードを汚し本筋の流れを乱すマネはしたくないすね。

引用返信 編集キー/
■32710 / inTopicNo.3)  Re[1]: インスタンス生成時におけるnullチェックの必要性について
□投稿者/ よねKEN (262回)-(2009/02/13(Fri) 10:03:37)
2009/02/13(Fri) 10:04:15 編集(投稿者)

> 下記のような一般的なインスタンスの生成時、nullチェックが必要かどうか教えて下さい。

不要です。

> ●new がメモリの割り当てに失敗するとOutOfMemoryException例外がスローされる点
> を考えるとnullチェックのフローを通る事は無いように感じます。

ご指摘のとおりです。
引用返信 編集キー/
■32712 / inTopicNo.4)  Re[1]: インスタンス生成時におけるnullチェックの必要性について
□投稿者/ みきぬ (377回)-(2009/02/13(Fri) 10:11:41)
No32706 (toroneko さん) に返信
> を考えるとnullチェックのフローを通る事は無いように感じます。

私もそう思うので、New した直後で null チェックなんてことはしません。
もし万が一 null だったりした場合は、NullReferenceException が投げられていいんじゃないですか?

そういったほんとに想定外のことが起こった場合のためにログを出力したいのであれば、
Application.ThreadException イベントなりを捕まえればいいと思います。

参考:
http://www.atmarkit.co.jp/fdotnet/dotnettips/320appexception/appexception.html
引用返信 編集キー/
■32742 / inTopicNo.5)  Re[2]: インスタンス生成時におけるnullチェックの必要性について
□投稿者/ toroneko (3回)-(2009/02/13(Fri) 14:12:00)
No32707 (επιστημη さん) に返信

> あたしゃ「nullチェックせずにバンバンnew」します。
> そじゃないとあちこちに null-check が割り込んでうざったくてしょうがない。
> # だから"ご意見伺い"にいらっしゃったんでしょうけども

見透かされてしまって恥ずかしい限りですが、その通りです。
周りに流され、慣例として書いているだけのコードに参っていまして、
こういう形で"ご意見伺い"させて頂きました。

> コードを汚し本筋の流れを乱すマネはしたくないすね。

正にこの通りだと思います、少し自信が持てました。
有難うございます!



No32710 (よねKEN さん) に返信

やはり不要なんですね、きっぱり言って頂けると安心出来ます。
有難うございます!



No32712 (みきぬ さん) に返信

> 私もそう思うので、New した直後で null チェックなんてことはしません。
> もし万が一 null だったりした場合は、NullReferenceException が投げられていいんじゃないですか?

そうですね、万が一 null だった場合はその例外がスローされて当然ですね。
(その時になってから何故nullだったのか考え、必要に応じて対処ですかね。)

> そういったほんとに想定外のことが起こった場合のためにログを出力したいのであれば、
> Application.ThreadException イベントなりを捕まえればいいと思います。

はい、今まで起きた事は無いのですがログは欲しいのでイベント使いたいと思います。
有難うございます!



言語が変わると書き方が変わるのは当然なんですよね。(目的や動作が変わるから当然か…)
古い習慣や思考停止して既存のコードを繰り返すと、平和は訪れないのでしょうね…。

私の中では納得したのですが、
他にnullチェックが必要派の方が居たら是非ご意見をお聞かせ下さい!
(適当なタイミングで解決済みにします)

引用返信 編集キー/
■32743 / inTopicNo.6)  Re[3]: インスタンス生成時におけるnullチェックの必要性について
□投稿者/ επιστημη (1721回)-(2009/02/13(Fri) 14:19:32)
επιστημη さんの Web サイト
> 他にnullチェックが必要派の方が居たら是非ご意見をお聞かせ下さい!

new の null-checkはやらんけど、

void f(object x) {
  SomeClass sc = x as SomeClass;
  if ( sc != null ) { // こんなのはやりますよ。
    sc.SomeMethod();
  } else { 
    // 絶対にcast失敗しないなら別だけど、
    // 失敗しないならハナっから SomeClass sc = (SomeClass)x;
    // って書くでしょし、引数で f(SomeClass x) するだろし。 
  }
}
 

引用返信 編集キー/
■32744 / inTopicNo.7)  Re[4]: インスタンス生成時におけるnullチェックの必要性について
□投稿者/ toroneko (4回)-(2009/02/13(Fri) 14:40:26)
2009/02/13(Fri) 14:42:12 編集(投稿者)

No32743 (επιστημη さん) に返信
> new の null-checkはやらんけど、
>
> void f(object x) {
> SomeClass sc = x as SomeClass;
> if ( sc != null ) { // こんなのはやりますよ。

はい、これは大丈夫です。(^^)
C#の便利な機能の一つですね。

(若干本題とは反れますが)
今思うとεπιστημηさんのelse内のコメントが胸に刺さります…。
絶対に失敗しないなら as は使わないべきですね。
無駄にtryをcatchした割に何もしないコードを書く可能性(バグの隠蔽)と同じ状態が起こりかねない…。
もちろん、必要がある as キャストでの null チェックであれば構わないですけど。
別件ながら反省です(泣)

引用返信 編集キー/
■32757 / inTopicNo.8)  Re[5]: インスタンス生成時におけるnullチェックの必要性について
□投稿者/ επιστημη (1723回)-(2009/02/13(Fri) 19:47:08)
επιστημη さんの Web サイト
> 絶対に失敗しないなら as は使わないべきですね。

でも使っちゃうこともあるのは内緒です。

((SomeClass)x).SomeMethod(); だとカッコがふたっつ重なるのがきしょくて
(x as SomeClass).SomeMethod(); って書くます ^^;

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -