扩展错误分配,如何修复?

时间:2013-06-07 11:50:59

标签: c# .net

我们假设,例如我有一个字符串,我想逃避它,并且好好阅读)

需要一个可以解决这个问题的工作扩展

我试过了。

var t = "'";
t.Escape();// == "%27" (what i need), but it not assign result to var. t
t = t.Escape();//works, but ugly.

和扩展名

public static string Escape(this string string_2)
    {
        if (string_2.HasValue())
            string_2 = Uri.EscapeDataString(string_2);
        return string_2;
    }

如何修复此扩展程序?

2 个答案:

答案 0 :(得分:5)

t = t.Escape();是.NET中用于更改字符串的常用习惯用法。例如。 t = t.Replace("a", "b");我建议你使用它。这是必要的,因为strings are immutable

有很多方法,但它们是IMO的丑陋。例如,您可以使用ref参数(但不能使用扩展方法):

public static string Escape (ref string string_2) { ... }
Util.Escape(ref t);

或者你可以创建一个类似于String的类,它是可变的:

public class MutableString { /** include implicit conversions to/from string */ }
public static string Escape (this MutableString string_2) { ... }

MutableString t = "'";
t.Escape();

我提醒您,如果您使用t = t.Escape();以外的任何内容,从而偏离正常使用,您可能会混淆将来读取代码的任何人。

答案 1 :(得分:1)

C#中的“可变字符串”拼写为StringBuilder

所以你可以做这样的事情:

public static void Escape(this StringBuilder text)
{
    var s = text.ToString();
    text.Clear();
    text.Append(Uri.EscapeDataString(s));
}        

但使用它并不会那么棒:

StringBuilder test = new StringBuilder("'");
test.Escape();
Console.WriteLine(test);

真正的答案是使用“难看的”字符串重新分配

t = t.Escape();//works, but ugly.

你会习惯的。 :)