0

我有一个 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 表示法,并且可能还有一种更有效的方法来编写它。我可能会在今天晚些时候尝试测试这些。

我会很感激你的想法。谢谢你。

4

1 回答 1

0

在我发布这个问题后不久,我决定自己针对我的特殊情况进行性能测试。“候选人2”是明显的赢家。两者的速度似乎大致相同。我曾预计“候选人 1”会更慢。但是“候选人2”更容易阅读。我很想得到其他建议,但考虑到这里的活动量,我不怀疑这会发生。

于 2013-10-09T20:00:45.300 回答