2011-09-28 17 views
7

私はReSharperを使い始めました。なぜこのコードが間違っていると思うのかを特定しようとしています。ReSharper "可能なNullReferenceException"がFileInfoで間違っていますか?

var file = new FileInfo("foobar"); 
return file.Directory.FullName; 

「Possible System.NullReferenceException」としてfile.Directoryをハイライト表示します。ファイルオブジェクトが決してnullになることができず、FileInfoオブジェクトから返されたDirectoryInfoオブジェクトがどのようにnullになる可能性があるのか​​分かりません。

答えて

11

Directoryプロパティは実際にはnullです。プロパティの実装では、それは間違いなくnullを返すことができ、ほぼ

public DirectoryInfo Directory { 
    get { 
     string directoryName = this.DirectoryName; 
     if (directoryName == null) { 
      return null; 
     } 
     return new DirectoryInfo(directoryName); 
    } 
} 

です。ここに具体例があります

var x = new FileInfo(@"c:\"); 
if (x.Directory == null) { 
    Console.WriteLine("Directory is null"); // Will print 
} 
+1

さらに、「ディレクトリのフルパス」を返す[file.DirectoryName'](http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx)を使用することもできます。また、 '' c:\ "'で動作するはずです。 –

0

コードを見てください。すべてのドットは、別のオブジェクトへの穴あけを表します。あなたが "ファイルオブジェクトは決してヌルになることはできません"(正しい)と述べたので、この方程式で他のオブジェクトがnullになる可能性があります。ヒント:FullNameではありません。

+0

最後にポストを読んでください、あなたはこれを見つけるでしょう: "[...]とFileInfoオブジェクトから返されたDirectoryInfoオブジェクトがどのようにnullになる可能性があるかわかりません。したがってOPはこれを認識しています。 – UrbanEsc

+0

より正確には、 '.'はプロパティ、メソッドなどを呼び出す可能性があるため、メモリ位置が参照解除される時を表します。したがって、ドット表記法を使用しているときはいつでも、逆参照しようとする前にそのオブジェクトが何か*であることを確認する必要があります。 – Yuck

+0

@UrbanEsc:OPが正しくありません。そうすれば、有効なディレクトリがないファイルを取得する可能性があります。 –