だから私はこの方法を持っています:
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
ステートメントを使用する代わりに、例外をスローしてメソッドを終了するのが適切な方法ですか。また、この場合、どのように対処するのが適切だと思いますか?