web-dev-qa-db-ja.com

Resharperの警告「純粋メソッドの戻り値は使用されていません」

作業中のc#プロジェクトでVisualStudioのResharperから受け取った警告について簡単な質問があります。警告は次のとおりです。

「純粋メソッドの戻り値は使用されません」

これが発生している方法は次のとおりです。

_ private static bool FilePathHasInvalidChars(string userInputPath)
    {
        try
        {
            //this is where the warning occurs:
            Path.GetFullPath(userInputPath);

        }
        catch (Exception e)
        {
            Log.Error(String.Format(
                "The Program failed to run due to invalid characters or empty " + 
                "string value for the Input Directory. " + 
                "Full Path : <{0}>. Error Message : {1}.",
                userInputPath, e.Message), e);
            return true;

        }
        return false;
    }
_

警告が発生している理由はわかっていると思います。 Path.GetFullPath(path)は、無効な文字に関するすべての例外をキャッチする目的でのみ使用しています。パスはユーザーによる入力として提供されるため、実際にはPath.GetFullPath(userInputPath)の結果を使用しません。私がこのメソッドに対して持っている唯一の用途は、指定されたパスが空でないか、無効な文字がないことを確認するために、mainメソッドに対して行うチェックです。

上記の方法を使用する場所は次のとおりです。

_if (FilePathHasInvalidChars(inputDirectory))
{
     return;
}
_

基本的には、プログラムが無効なパラメータを使用して実行を開始する前の出口点にすぎません。

この警告によって問題が発生するのか、それとも_Path.GetFullPath_メソッドを将来問題が発生するような方法で誤用しているのか疑問に思っていました。

13
Jetnor

いいえ、それはあなたにとって何の問題も引き起こさないはずです、なぜならこれは実際にあなたがそれを使いたい方法だからです。

この場合のResharperヒントは、フェッチしたデータを保持する変数を作成するのを忘れた場合の単なるポインターです。検証しているだけで、実際にはそのデータは必要ないので、問題ないはずです。

編集:ヒントを回避し、次のような特定のResharperコメントを使用して、これが意図的なものであることを明確にすることができることに注意してください。

_// ReSharper disable once ReturnValueOfPureMethodIsNotUsed
Path.GetFullPath(userInputPath);
_

編集#2:SynerCoderはおそらく正しいですがSystem.IO.Directory.Exists()が特定の目的に適したオプションであることについて...

19
Kjartan

サンプルコードでは、Exceptionをキャッチします。これは、ArgumentExceptionSecurityExceptionArgumentNullExceptionNotSupportedExceptionPathTooLongExceptionのいずれかですが、パスに無効な文字が含まれている場合にスローされるのはArgumentException[〜# [〜#〜]
さらに、

Path.GetFullPath(path)は、無効な文字に関するすべての例外をキャッチする目的でのみ使用しています。

むしろ、次のコードを使用し、例外処理を省略してください。

foreach (char invalidChar in Path.GetInvalidPathChars())
{
    if (userInputPath.Contains(invalidChar))
    {
        return true;
    }
}
return false;
7
Yurii

パスが違法かどうかを確認するために独自の方法を使用しないでください。ディレクトリ(inputDirectory)をチェックしているので、次のコードを使用する必要があります。

if (!System.IO.Directory.Exists(inputDirectory))
{
    return;
}
5
SynerCoder