使用扩展方法时通过引用更改值

时间:2018-11-22 10:32:43

标签: c#

我想创建一个错误消息字符串。它应包含多个提示以纠正错误。

首先,我创建了类似的内容

string errorMessage = string.Empty;

if (1 == 1)
    errorMessage += "- hint 1\n";

if (2 == 2)
    errorMessage += "- hint 2\n";

if (3 == 3)
    errorMessage += "- hint 3";

// do something with errorMessage

我想清理一下。我创建了扩展方法

public static void AppendIf(this string s, bool condition, string txtToAppend)
{
    if (condition)
        s += txtToAppend;
}

在我班上叫它

string errorMessage = string.Empty;

errorMessage.AppendIf(1 == 1, "- hint 1\n");
errorMessage.AppendIf(2 == 2, "- hint 2\n");
errorMessage.AppendIf(3 == 3, "- hint 3");

// do something with errorMessage

但是errorMessage保持为空。我以为this的行为就像ref关键字,所以我的扩展方法出了什么问题?

2 个答案:

答案 0 :(得分:4)

string是不可变的,这意味着它每次您添加到它时都会创建一个新字符串,因此这是不可能的。

但是,您可以使用StringBuilder来实现:

public static class StringBuilderExtensions
{
    public static StringBuilder AppendLineIf(this StringBuilder builder, bool condition, string line)
    {
        // validate arguments
        if (condition) 
            builder.AppendLine(line);
        return builder;            
    }

    public static StringBuilder AppendIf(this StringBuilder builder, bool condition, string line)
    {
        // validate arguments
        if (condition) 
            builder.Append(line);
        return builder;            
    }
}

StringBuilder builder = new StringBuilder();
builder.AppendLineIf(1 == 1, "- hint 1");
builder.AppendLineIf(2 == 2, "- hint 2");
builder.AppendLineIf(3 == 3, "- hint 3");

string result = builder.ToString();
// do something with result

如果您觉得更好,也可以链接这些呼叫:

string result = new StringBuilder()
    .AppendLineIf(1 == 1, "- hint 1")
    .AppendLineIf(2 == 2, "- hint 2")
    .AppendLineIf(3 == 3, "- hint 3")
    .ToString();    

答案 1 :(得分:2)

您无法使用this ref修饰符,请检查compiler feature request

但是,通过使用StringBuilder类型,您可以获得相同的结果:

public static void AppendIf(this StringBuilder s, bool condition, string txtToAppend)
{
    if (condition)
        s.Append(txtToAppend);
}

因此,您的代码将是:

string errorMessage = new StringBuilder();

errorMessage.AppendIf(1 == 1, "- hint 1\n");
errorMessage.AppendIf(2 == 2, "- hint 2\n");
errorMessage.AppendIf(3 == 3, "- hint 3");

NB:请避免在循环内执行类似str += anotherStr;的代码,因为此方法的复杂度为O(N ^ 2),其中N为字符数。请检查this question中的详细信息。