ASP.NET C#:可交换地写入HttpResponse或StringBuilder

ASP.NET C#:可交换地写入HttpResponse或StringBuilder,c#,asp.net,performance,httpresponse,stringbuilder,C#,Asp.net,Performance,Httpresponse,Stringbuilder,我有一个ASP.NET C#方法(我们称之为writeData),它使用Response.Write将字符串重复写入响应。几天前,另一个场景要求我将结果数据保存到字符串中,而不是将其写入。因此,我不得不在使用StringBuilder时复制整个函数。是否有一种方法可以设计writeData,使其可以作为参数互换地写入HttpResponse或StringBuilder?在下面的示例中,我安装了一个for循环,它将循环10000次,但我的代码可能循环次数甚至更多。所以我尽可能快地完成每个循环是很重

我有一个ASP.NET C#方法(我们称之为writeData),它使用Response.Write将字符串重复写入响应。几天前,另一个场景要求我将结果数据保存到字符串中,而不是将其写入。因此,我不得不在使用StringBuilder时复制整个函数。是否有一种方法可以设计writeData,使其可以作为参数互换地写入HttpResponse或StringBuilder?在下面的示例中,我安装了一个for循环,它将循环10000次,但我的代码可能循环次数甚至更多。所以我尽可能快地完成每个循环是很重要的

//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();
}
//Response.Write方法
私有无效写入数据()
{
对于(int i=0;i<10000;i++)
{
回答。写(“文本”);
}
}
//追加方法
私有字符串writeData()
{
StringBuilder sb=新的StringBuilder();
对于(int i=0;i<10000;i++)
{
某人附加(“文本”);
}
使某人返回字符串();
}
下面是我的两位候选人,他们可以解决这个问题:

//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
私有字符串写入数据(对象响应OrStringBuilder)
{
HttpResponse response=作为HttpResponse的responseOrStringBuilder;
StringBuilder sb=作为StringBuilder的responseOrStringBuilder;
bool useResponse=response!=null;
对于(int i=0;i<10000;i++)
{
if(useResponse){response.Write(“Text”);}
else{sb.Append(“Text.”;}
}
返回userresponse?null:sb.ToString();
}
//候选人2
public void writeData(动作编写器)
{
对于(int i=0;i<10000;i++)
{
作者(“测试”);
}
}
公共无效书面答复()
{
writeData((字符串文本)=>{Response.Write(文本);});
}
公共字符串writeDataStringBuilder()
{
StringBuilder sb=新的StringBuilder();
writeData((字符串文本)=>{sb.Append(文本);});
使某人返回字符串();
}
我的“候选者1”有缺点,包括必须尝试抛出一个HttpResponse和一个StringBuilder。它还必须反复检查useResponse变量的值。这些问题变得更加夸张,因为writeData本身甚至可以在循环中调用

“候选者2”可能会更好,但我不知道像我所做的那样传递操作参数有多有效。我还使用了lambda表示法,可能还有一种更有效的方法来编写它。今天晚些时候我可能会尝试测试这些


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

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