NullReferenceException
このコードを実行すると、パラメーターを省略して予期しない結果が得fileSystemHelper
られます (したがって、デフォルトで null に設定されます)。
public class GitLog
{
FileSystemHelper fileSystem;
/// <summary>
/// Initializes a new instance of the <see cref="GitLog" /> class.
/// </summary>
/// <param name="pathToWorkingCopy">The path to a Git working copy.</param>
/// <param name="fileSystemHelper">A helper class that provides file system services (optional).</param>
/// <exception cref="ArgumentException">Thrown if the path is invalid.</exception>
/// <exception cref="InvalidOperationException">Thrown if there is no Git repository at the specified path.</exception>
public GitLog(string pathToWorkingCopy, FileSystemHelper fileSystemHelper = null)
{
this.fileSystem = fileSystemHelper ?? new FileSystemHelper();
string fullPath = fileSystem.GetFullPath(pathToWorkingCopy); // ArgumentException if path invalid.
if (!fileSystem.DirectoryExists(fullPath))
throw new ArgumentException("The specified working copy directory does not exist.");
GitWorkingCopyPath = pathToWorkingCopy;
string git = fileSystem.PathCombine(fullPath, ".git");
if (!fileSystem.DirectoryExists(git))
{
throw new InvalidOperationException(
"There does not appear to be a Git repository at the specified location.");
}
}
デバッガーでコードを 1 ステップ実行すると、最初の行を (??
演算子を使用して) ステップ オーバーした後fileSystem
も、この画面の抜粋に示すように値が null のままです (次の行をステップ オーバーすると、 がスローされますNullReferenceException
)。
これは私が期待したものではありません!null合体演算子がパラメータがnullであることを発見し、new FileSystemHelper()
. 私はこのコードを何年も見つめてきましたが、何が問題なのかわかりません。
ReSharper は、フィールドはこの 1 つのメソッドでのみ使用されるため、潜在的にローカル変数に変換される可能性があると指摘しました。出来た。それで、私は修正しましたが、私の人生では、上記のコードが機能しない理由を理解できません。C# について何か面白いことを学ぼうとしているような気がします。ここで何が起こっているか、誰でも見ることができますか?