我有一个 ASP.NET C# 方法(我们称之为 writeData。),它使用 Response.Write 重复将字符串写入响应。几天前,一个不同的场景要求我将结果数据保存到一个字符串而不是写入它。所以我不得不在使用 StringBuilder 时复制整个函数。有没有一种方法可以设计 writeData 以便它可以互换地写入 HttpResponse 或 StringBuilder ,可能作为参数?在下面的示例中,我插入了一个 for 循环,该循环将循环 10,000 次,但我的代码可能会循环更多。所以让每个循环尽可能快是很重要的。
//Response.Write Method
private void writeData()
{
for (int i = 0; i < 10000; i++)
{
Response.Write("Text.");
}
}
//StringBuilder.Append Method
private string writeData()
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
sb.Append("Text.");
}
return sb.ToString();
}
这是我解决问题的两个候选人:
//Candidate 1
private string writeData(object responseOrStringBuilder)
{
HttpResponse response = responseOrStringBuilder as HttpResponse;
StringBuilder sb = responseOrStringBuilder as StringBuilder;
bool useResponse = response != null;
for (int i = 0; i < 10000; i++)
{
if (useResponse) { response.Write("Text."); }
else { sb.Append("Text."); }
}
return useResponse ? null : sb.ToString();
}
//Candidate 2
public void writeData(Action<string> writer)
{
for (int i = 0; i < 10000; i++)
{
writer("Test.");
}
}
public void writeDataResponse()
{
writeData((string text) => { Response.Write(text); });
}
public string writeDataStringBuilder()
{
StringBuilder sb = new StringBuilder();
writeData((string text) => { sb.Append(text); });
return sb.ToString();
}
我的“候选人 1”有缺点,包括必须尝试强制转换 HttpResponse 和 StringBuilder。它还必须反复检查 useResponse 变量的值。这些问题变得更加夸张,因为 writeData 本身甚至可以在循环中调用。
“Candidate 2”可能效果更好,但我不知道像我所做的那样传递 Action 参数的效率如何。我还使用了 lambda 表示法,并且可能还有一种更有效的方法来编写它。我可能会在今天晚些时候尝试测试这些。
我会很感激你的想法。谢谢你。