Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止重复代码_C# - Fatal编程技术网

C# 如何防止重复代码

C# 如何防止重复代码,c#,C#,我是一名初学者程序员,感觉自己在重复代码(DownloadFiles()),如下例所示: var files = DownloadFiles(); var retryCount = 0; while (files == null && retryCount < 3) { retryCount++; Console.WriteLine("Retrying {0} time", retryCount); files = DownloadFiles()

我是一名初学者程序员,感觉自己在重复代码(
DownloadFiles()
),如下例所示:

var files = DownloadFiles();
var retryCount = 0;

while (files == null && retryCount < 3)
{
    retryCount++; 
    Console.WriteLine("Retrying {0} time", retryCount);
    files = DownloadFiles();       
}
var files=DownloadFiles();
var-retryCount=0;
while(files==null&&retryCount<3)
{
retryCount++;
WriteLine(“重试{0}次”,retryCount);
files=下载文件();
}
我的应用程序基本上是通过HttpWebrequest下载文件,如果没有检索到文件,应该重试下载3次

我需要你的专家意见:

我正在使用
DownloadFiles()重复代码

这段代码能更有效地编写吗


这可能看起来很琐碎,但我想开发良好的编程实践。

您可以使用
do。。。正如Ben Aaronson所建议的那样:

TypeOfFiles files;
var retryCount = 0;

do
{
    files = DownloadFiles();       

    if (retryCount > 0)
    {
        Console.WriteLine("Retrying {0} time", retryCount);
    }
}
while (files == null && retryCount++ < 3)
TypeOfFiles文件;
var-retryCount=0;
做
{
files=下载文件();
如果(retryCount>0)
{
WriteLine(“重试{0}次”,retryCount);
}
}
while(files==null&&retryCount++<3)

我将
retryCount++
移动到
内部,而
这样你的号码就不会掉下来(与在循环内部这样做相比)。

你没有重复你的代码,你已经将下载逻辑封装在一个方法中,并且你正在循环这个方法

糟糕的事情是内联DownloadFiles方法或展开while循环。

???档案//函数返回的类型
??? files; //type returned by the function
var retryCount = 0;

do 
{
    files = DownloadFiles();

    if (retryCount > 0)
        Console.WriteLine("Retrying {0} time", retryCount);       
} while (files == null && retryCount++ < 3)
var-retryCount=0; 做 { files=下载文件(); 如果(retryCount>0) WriteLine(“重试{0}次”,retryCount); }while(files==null&&retryCount++<3)
另一种方法是:

List<File> files;  // replace with whatever type files is
var retryCount = 0;

while ((files = DownloadFiles()) == null && retryCount < 3)
{
    retryCount++; 
    Console.WriteLine("Retrying {0} time", retryCount);
}
列出文件;//替换为任何类型的文件
var-retryCount=0;
而((files=DownloadFiles())==null&&retryCount<3)
{
retryCount++;
WriteLine(“重试{0}次”,retryCount);
}

for循环可能看起来更整洁:

var files = DownloadFiles();

for (int retryCount = 0; files == null && retryCount < 3; retryCount++)
{
    Console.WriteLine("Retrying {0} time", retryCount);
    files = DownloadFiles();       
}

retryCount

在循环中,但这有待讨论。

一般来说,这类事情可能没问题。在这种情况下,您可能希望查看
do…while
loop如果不为编译提供一些上下文,您就不能使用
var
。OP的代码不会在第一次尝试时打印“重试”。而且,您的代码只会下载3次,而OP的代码会下载4次。@Xiaoy312:我认为它不会运行3次,因为
retryCount
上的
++
是在计算表达式后完成的(与
++retryCount
相反)。请为您的代码解决方案添加一些解释,以供将来参考。@PatrickHofman OP中的代码已经起作用了。问题的关键在于创建一个更具可读性/可维护性的解决方案。在这方面,这个解决方案比OP的要糟糕得多。代码有效并不意味着它是一个好的答案。@Patrickhoffman因此,对代码进行审查并使其变得更糟并不是一个有用的答案,事实上它是一个无用的答案。有一个特定的按钮可以用来表示答案是无用的。这是最后一票。
const maxRetries = 3;
retryCount < maxRetries