SlideShare a Scribd company logo
null ヤバイのでなんとかする takeshik
事故紹介 廃ついったったー https://twitter.com/takeshik ジロリアン ホーム :  仙川 三田本店にはまだ行けてません Twitter  クライアント ? MetaTweet  制作中 http://www.metatweet.org/ 未だに未完成 永遠に開発中 おまけで  Tween  に手を出してみたり
流れとか 対象環境 : .NET   使用言語 : C# 3.0 null   の何たるかについて軽く解説   ↓ null   のいやらしさについて嘆く   ↓ null   に立ち向かう手段をいくつか取り上げる   ↓ 時間が余ったら二郎の素晴らしさを熱く語る
で、 null   ってなんぞ ? どのオブジェクトも参照していないことを 示す特別な値 (Visual Basic  では  Nothing ) メンバにアクセスしようとすると例外 NullReferenceException   を投げる 値型  ( struct ,  enum )  には代入できない 小難しい話は全部割愛  (← 重要 )
null   の周辺要素 Nullable<T>   型  ( T? ) 値型でも  null   を使えるようにする null   をそのまま設定可能。取得はちょっと面倒 null   結合演算子  ( ?? ) a ?? b   =   a != null ? a : b default   キーワード 参照型の場合  null 、値型の場合デフォルト値 Generics  向け機能 default(int?) == null
null   の恐怖 ちょっとのことで例外が飛ぶ プロパティとかにアクセスするだけでアウト チェックとか面倒 if (a == null)   とか苦痛 面倒なのに結構   null   を返すメソッドが多い 「無」を表すのにもっと適切な値が存在する 場合がある   (ex.  Stream.Null ) … できれば見なかったことにしたい!
null   への対処方法   (1) 真面目に条件分岐 if (a == null) ...; 単体だとそうでもないがちょっと面倒 null   結合演算子の利用 a = a ?? new T(...); 初期化みたいな用途とかだと使えるかも 使い所が広く存在するか微妙
null   への対処方法   (2) ちょっとしたメソッドを作る TResult GetOrNull<TSource, TResult>(   TSource obj,   Func<TSource, TResult> func) {   return obj != default(TSource)   ? default(TResult)   : func(obj); } FileInfo file = ...; GetOrNull(file, f => f.FullName); file   が非   null   ならファイルのフルパスが取得できる file   が   null   ならそのまま   null   が返る ->  チェック省けて幸せ!
null   への対処方法   (3) 静的メソッドは何かと面倒 だったら拡張メソッドにすればいいじゃないか 拡張メソッドはただの構文糖どころじゃない 内部的には静的メソッドなので   this   値が   null   に なり得る!   ->   null   でも呼べるメソッド さっきのメソッドも TResult GetOrNull<TSource, TResult>(   this  TSource obj,   Func<TSource, TResult> func) file.GetOrNull(f => f.FullName); 行儀が悪いのでご利用は計画的に
null   への対処方法   (4) Nullable<T>   が あるなら逆があってもいいよね! public struct NonNull<T> where T : class  {   // operator ==, operator !=  は省略   private readonly T _value;   public NonNull(T obj) : this() {   if (obj == null)   throw new ArgumentNullException(&quot;obj&quot;);   this._value = obj;   }   public static implicit operator NonNull<T>(T obj) {   return new NonNull<T>(obj);   }   public static implicit operator T(NonNull<T> obj) {   return obj._value;   } }
実際に使ってみる NonNull< s tring> s tr  = &quot;test&quot;; str = null; //  ArgumentNullException 代入時に   null   を検知可能 Stream.Null  のような「無」を表すオブジェクトを もっと積極的に使うようにしてみる ※  String.Empty   のように   null   と比較するのが   相応しくないような事例もあるので時と場合によるかも とりあえず作ってみる null   への対処方法   (5)
null   への対処方法   (6) public struct Defa ult <T> where T : class  {   // NonNull<T>  と同じメンバ、  operator ==, operator !=  は省略   public Default(T obj) : this()  {   if (obj == null) this._value = GetDefault()   else this._value = obj;   if (this._value == null)   throw new ArgumentNullException(&quot;obj&quot;);   }   private static T GetDefault()   {   var member = typeof (T).GetMembers(BindingFlags.Public |   BindingFlags.Static)   .Where(m => m.Name == &quot;Default&quot; || m.Name == &quot;Empty&quot;   || m.Name == &quot;Null&quot;)   .SingleOrDefault();   if (member is FieldInfo)   return (T) (((FieldInfo) member).GetValue(null));   if (member is PropertyInfo)   return (T) (((PropertyInfo) member).GetValue(null, null));   return null;   } }
null   への対処方法  (7) 使ってみる Default<string> s = null; Console.WriteLine(s == &quot;&quot;); Default<StreamReader> r = null; // true Console.WriteLine((r == StreamReader.Null)); // true null   値の代入がうまく回避されている。 色々作ってみましたが結構便利…かもしれない? 行儀が本当に良くないのでご利用は計画的に
まとめ いろいろ作ってみるのは結構楽しいです null   をうまくやり込めて楽しいプログラミング 行儀の悪いコードはほどほどにしましょう 実はきながら型構造考えてたけど 意外と使えるかも…? 二郎はラーメンではありません

More Related Content

PDF
Linq To Fun
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
PDF
LLdeade Python Language Update
PDF
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
PDF
テンプレートメタプログラミング as 式
PDF
君はまだ,本当のプリプロセスを知らない
PDF
03 var array_flow_func
PDF
関数型プログラミング入門 for Matlab ユーザー
Linq To Fun
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
LLdeade Python Language Update
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
テンプレートメタプログラミング as 式
君はまだ,本当のプリプロセスを知らない
03 var array_flow_func
関数型プログラミング入門 for Matlab ユーザー

What's hot (19)

PDF
Cocoa勉強会#43-Blocksを使う
PDF
Chainer入門と最近の機能
PDF
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
PDF
マスターオブゴールーチンアンドチャネル スタートGo #1
PPTX
第3章 型とクラス
PPTX
第3章 型とクラス
PDF
並行プログラミングと継続モナド
PDF
CuPy解説
PDF
闇魔術を触ってみた
PDF
Pythonデータ分析 第3回勉強会資料 8章
PDF
Unity + C#講座①
PDF
20170131 python3 6 PEP526
PDF
関数型志向Python - LLまつり2013
PDF
Lisp Tutorial for Pythonista : Day 3
PDF
リテラル文字列型までの道
PDF
F#入門 ~関数プログラミングとは何か~
PPT
Power of Scala
PDF
C++のライブラリを簡単に眺めてみよう
PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Cocoa勉強会#43-Blocksを使う
Chainer入門と最近の機能
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
マスターオブゴールーチンアンドチャネル スタートGo #1
第3章 型とクラス
第3章 型とクラス
並行プログラミングと継続モナド
CuPy解説
闇魔術を触ってみた
Pythonデータ分析 第3回勉強会資料 8章
Unity + C#講座①
20170131 python3 6 PEP526
関数型志向Python - LLまつり2013
Lisp Tutorial for Pythonista : Day 3
リテラル文字列型までの道
F#入門 ~関数プログラミングとは何か~
Power of Scala
C++のライブラリを簡単に眺めてみよう
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Ad

Similar to わんくま東京#32 「null ヤバイのでなんとかする」 (18)

PDF
Kotlinアンチパターン
ODP
オブジェクト指向勉強会(基礎)
PDF
Unity2015_No10_~UGUI&Audio~
PDF
F#によるFunctional Programming入門
PDF
20180830 implement dqn_platinum_data_meetup_vol1
PPT
Start!! Ruby
PDF
Lisp tutorial for Pythonista : Day 2
PPTX
非同期処理の基礎
PDF
今日からできる!簡単 .NET 高速化 Tips
PPTX
final int をFINAL しやがれ!
PPT
わんくま東京#38 LT 「Func&lt;> と ref / out 小咄」
ODP
D言語会議#1
PDF
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
PPT
Puppet Best Practices? at COOKPAD
PDF
boost::shared_ptr tutorial
PDF
JavaのGenericsとは?
PDF
Scalaで型クラス入門
PDF
PerlとSQLのいろいろ
Kotlinアンチパターン
オブジェクト指向勉強会(基礎)
Unity2015_No10_~UGUI&Audio~
F#によるFunctional Programming入門
20180830 implement dqn_platinum_data_meetup_vol1
Start!! Ruby
Lisp tutorial for Pythonista : Day 2
非同期処理の基礎
今日からできる!簡単 .NET 高速化 Tips
final int をFINAL しやがれ!
わんくま東京#38 LT 「Func&lt;> と ref / out 小咄」
D言語会議#1
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
Puppet Best Practices? at COOKPAD
boost::shared_ptr tutorial
JavaのGenericsとは?
Scalaで型クラス入門
PerlとSQLのいろいろ
Ad

More from Takeshi Kiriya (8)

PDF
わんくま東京#53 LT 「10年後のインターフェイス?とか?」
PPTX
わんくま東京#53 LT (別稿:未発表) 「プログラミング1x」
PPTX
わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」
PPT
わんくま東京#43 「いろいろしゃべります」
PPT
わんくま東京#36 「二郎への誘い」
PPT
わんくま東京#26 LT 「C# 4.0 動的型の使い途を妄想してみる」
DOC
MetaTweetの現状と展望 v0
PPT
わんくま東京#38 LT 「takeshik は何を作っているのか? MetaTweet を作ってます!」
わんくま東京#53 LT 「10年後のインターフェイス?とか?」
わんくま東京#53 LT (別稿:未発表) 「プログラミング1x」
わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」
わんくま東京#43 「いろいろしゃべります」
わんくま東京#36 「二郎への誘い」
わんくま東京#26 LT 「C# 4.0 動的型の使い途を妄想してみる」
MetaTweetの現状と展望 v0
わんくま東京#38 LT 「takeshik は何を作っているのか? MetaTweet を作ってます!」

わんくま東京#32 「null ヤバイのでなんとかする」

  • 2. 事故紹介 廃ついったったー https://twitter.com/takeshik ジロリアン ホーム : 仙川 三田本店にはまだ行けてません Twitter クライアント ? MetaTweet 制作中 http://www.metatweet.org/ 未だに未完成 永遠に開発中 おまけで Tween に手を出してみたり
  • 3. 流れとか 対象環境 : .NET   使用言語 : C# 3.0 null の何たるかについて軽く解説   ↓ null のいやらしさについて嘆く   ↓ null に立ち向かう手段をいくつか取り上げる   ↓ 時間が余ったら二郎の素晴らしさを熱く語る
  • 4. で、 null ってなんぞ ? どのオブジェクトも参照していないことを 示す特別な値 (Visual Basic では Nothing ) メンバにアクセスしようとすると例外 NullReferenceException を投げる 値型 ( struct , enum ) には代入できない 小難しい話は全部割愛 (← 重要 )
  • 5. null の周辺要素 Nullable<T> 型 ( T? ) 値型でも null を使えるようにする null をそのまま設定可能。取得はちょっと面倒 null 結合演算子 ( ?? ) a ?? b   =   a != null ? a : b default キーワード 参照型の場合 null 、値型の場合デフォルト値 Generics 向け機能 default(int?) == null
  • 6. null の恐怖 ちょっとのことで例外が飛ぶ プロパティとかにアクセスするだけでアウト チェックとか面倒 if (a == null) とか苦痛 面倒なのに結構 null を返すメソッドが多い 「無」を表すのにもっと適切な値が存在する 場合がある (ex. Stream.Null ) … できれば見なかったことにしたい!
  • 7. null への対処方法 (1) 真面目に条件分岐 if (a == null) ...; 単体だとそうでもないがちょっと面倒 null 結合演算子の利用 a = a ?? new T(...); 初期化みたいな用途とかだと使えるかも 使い所が広く存在するか微妙
  • 8. null への対処方法 (2) ちょっとしたメソッドを作る TResult GetOrNull<TSource, TResult>( TSource obj, Func<TSource, TResult> func) { return obj != default(TSource) ? default(TResult) : func(obj); } FileInfo file = ...; GetOrNull(file, f => f.FullName); file が非 null ならファイルのフルパスが取得できる file が null ならそのまま null が返る -> チェック省けて幸せ!
  • 9. null への対処方法 (3) 静的メソッドは何かと面倒 だったら拡張メソッドにすればいいじゃないか 拡張メソッドはただの構文糖どころじゃない 内部的には静的メソッドなので this 値が null に なり得る! -> null でも呼べるメソッド さっきのメソッドも TResult GetOrNull<TSource, TResult>( this TSource obj, Func<TSource, TResult> func) file.GetOrNull(f => f.FullName); 行儀が悪いのでご利用は計画的に
  • 10. null への対処方法 (4) Nullable<T> が あるなら逆があってもいいよね! public struct NonNull<T> where T : class { // operator ==, operator != は省略 private readonly T _value; public NonNull(T obj) : this() { if (obj == null) throw new ArgumentNullException(&quot;obj&quot;); this._value = obj; } public static implicit operator NonNull<T>(T obj) { return new NonNull<T>(obj); } public static implicit operator T(NonNull<T> obj) { return obj._value; } }
  • 11. 実際に使ってみる NonNull< s tring> s tr = &quot;test&quot;; str = null; // ArgumentNullException 代入時に null を検知可能 Stream.Null のような「無」を表すオブジェクトを もっと積極的に使うようにしてみる ※ String.Empty のように null と比較するのが   相応しくないような事例もあるので時と場合によるかも とりあえず作ってみる null への対処方法 (5)
  • 12. null への対処方法 (6) public struct Defa ult <T> where T : class { // NonNull<T> と同じメンバ、 operator ==, operator != は省略 public Default(T obj) : this() { if (obj == null) this._value = GetDefault() else this._value = obj; if (this._value == null) throw new ArgumentNullException(&quot;obj&quot;); } private static T GetDefault()   { var member = typeof (T).GetMembers(BindingFlags.Public | BindingFlags.Static) .Where(m => m.Name == &quot;Default&quot; || m.Name == &quot;Empty&quot; || m.Name == &quot;Null&quot;) .SingleOrDefault(); if (member is FieldInfo) return (T) (((FieldInfo) member).GetValue(null)); if (member is PropertyInfo) return (T) (((PropertyInfo) member).GetValue(null, null)); return null; } }
  • 13. null への対処方法 (7) 使ってみる Default<string> s = null; Console.WriteLine(s == &quot;&quot;); Default<StreamReader> r = null; // true Console.WriteLine((r == StreamReader.Null)); // true null 値の代入がうまく回避されている。 色々作ってみましたが結構便利…かもしれない? 行儀が本当に良くないのでご利用は計画的に
  • 14. まとめ いろいろ作ってみるのは結構楽しいです null をうまくやり込めて楽しいプログラミング 行儀の悪いコードはほどほどにしましょう 実はきながら型構造考えてたけど 意外と使えるかも…? 二郎はラーメンではありません