2

だから私はこの方法を持っています:

public string SaveImage(AppConfig imagePath, string ImageNameFilter)
{
    if (selectedFileName == null)
    {
        return null;//No image is selected - return
    }
    string imgPath = imagePath.ConfigValue.ToString();
    string baseFileName = Path.GetFileNameWithoutExtension(selectedFileName);
    string extension = Path.GetExtension(selectedFileName);

    string temp = Path.GetFileNameWithoutExtension(selectedFileName);

    if (!baseFileName.StartsWith(ImageNameFilter))
    {
        throw new InvalidImageException("The image name must starts with  " + ImageNameFilter);
    }
    else
    {
        for (int i = 1; i < (int.MaxValue - 1); i++)
        {
            if (File.Exists(imgPath + "\\" + baseFileName + extension))
            {
                baseFileName = temp;
            }
            else
            {
                File.Copy(selectedFile, imgPath + "\\" + baseFileName + extension);
                return (baseFileName + extension);
            }
            baseFileName += (i).ToString();
        }
    }

    //throw new InvalidImageException("The Image was not saved");
    return null;//Should never come here - something went wrong
}

問題は、考えられるすべての結果を処理していると思っていたにもかかわらず、メソッドが最後に戻りを待っていることです。これで、実際にはメソッドが最後に到達する可能性が 1 つあることがわかりましたfor (int i = 1; i < (int.MaxValue - 1); i++)(ほとんど理論的な方法ではありますが)。結果を返す前にメソッドの最後に到達する可能性があるケースがもっとあるかもしれません。ただし、コードがメソッドの最後に到達した場合、反対側にない場合、コンパイラは不平を言いreturnます。これは、何か問題があることを意味し、これを適切に処理できるようにしたいと考えています。

nullこのチェックの最初に使用します。

if (selectedFileName == null)
{
    return null;//No image is selected - return
}

nullそして、画像が選択されていなくてもまったく問題ないので、結果を返すべき場所はこれだと思います。何も実行されず、メソッドの最後に到達した場合、他の結果のオプションはほとんどありません。投稿したようにreturn null;、もう一度変更する必要があります。この正確なシナリオが起こっていることを知る必要があり、それに応じて対応する必要があります。

現在考えられるオプションは 2 つあります。チェックする文字列を返すか、例外をスローするかです。しかし、よくわかりません-標準returnステートメントを使用する代わりに、例外をスローしてメソッドを終了するのが適切な方法ですか。また、この場合、どのように対処するのが適切だと思いますか?

4

1 に答える 1

3

一般にthrow、メソッド本体の最後で問題ない場合がありますが(「この時点に到達することはないはずです」のように)、それはやや珍しいことです。

この特定のケースでは、制御フローがメソッド本体の最後に簡単に到達できることは明らかです。これは、すべてのFile.Existsチェックが成功した場合に発生します。今、私とあなたはこれが事実上不可能であることを「知っています」が、数学的に不可能ではなく、コンパイラがエラーを出すのに十分です。

では、ここでコンパイラをどのように和らげるべきでしょうか?ええと、どんな方法にもそれが機能する契約があります。このメソッドのコントラクトには、メソッドが未使用のファイル名を検索し、そこにソースファイルをコピーして、呼び出し元にパスを返すことが含まれています。

ただし、メソッドがこのコントラクトを満たすことができない原因となる可能性のある制御外のことがあります。その場合、発信者に「期待したことを実行できませんでした」と何らかの方法で通信する必要があります。これはどういうわけか例外をスローすることによるものです。

于 2013-03-01T11:49:31.097 に答える