【问题标题】:C# Replace value of original string in extension methodC#在扩展方法中替换原始字符串的值
【发布时间】:2014-08-22 20:48:16
【问题描述】:

我正在尝试为带有一个参数的字符串编写扩展方法,并将参数附加到字符串的值。这是我想要的行为:

    public static void AddNumber(this string originalValue, string id)
    {
        List<string> ids = originalValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToString();
        ids.Add(id);
        string newValue = string.Join(",", ids);
        originalValue = newValue;
    }

那我想这样使用:

        string testing = "";
        testing.AddNumber("1"); // value should be 1
        testing.AddNumber("2"); // value should be 1,2
        testing.AddNumber("3"); // value should be 1,2,3

问题是我看到了这个:

        string testing = "";
        testing.AddNumber("1"); // value is ""
        testing.AddNumber("2"); // value is ""
        testing.AddNumber("3"); // value is ""

现在我已经阅读了this! StackOverflow 上的问题,我知道我正在做类似的事情。我无法替换字符串的整个值,我必须修改通过发送的字符串的内容......我只是找不到修改它的方法。我试过修改字符数组并且没有运气。有什么想法吗?

【问题讨论】:

  • 把方法从void改成string试试testing = testing.AddNumber("1");

标签: c#


【解决方案1】:

字符串是不可变的
这是根本不可能的。

【讨论】:

  • 根据我所有的研究和其他人的反馈,似乎不可能创建一个扩展方法并让它替换或修改原始值
  • 奇怪的VB.net可以做到这一点
  • @JackGajanan:不; VB.Net 中的字符串也是不可变的。或者你说的是ByRef参数?
  • 字符串是不可变的,但扩展的“this”是 byref _ Public Shared Sub AddNumber(originalValue As String, id As String) End Sub
【解决方案2】:

要实现这一点,您必须将this string originalValue 传递为ref,但这是不可能的。不过,您可以使用普通方法来执行此操作:

public static void AddNumber(ref string originalValue, string id)

但它必须像这样调用:

AddNumber(ref testing, "1");

【讨论】:

  • 在这种情况下,outref 更有意义。
  • @P.Brian.Mackey 不,实际上,refout 更有意义。他想读取字符串,根据该值生成一个新字符串,然后将变量设置为生成的值。文本框ref.
  • 良好的反馈。我很清楚使用普通方法会起作用我只是个人希望能够按照原始问题中的说明使用这种行为。
  • 除非声明为ref(在方法声明和使用中),否则您无法分配对方法参数的引用。对于扩展方法,根本没有办法说明这一点,因此这是不可能的。
【解决方案3】:

你必须像这样使用这个方法:

public static string AddNumber(this string originalValue, string id)
    {
        List<string> ids = originalValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToString();
        ids.Add(id);
        string newValue = string.Join(",", ids);
        return newValue;
    }

testing = testing.AddNumber("1");

但您可以使用StringBuilder

public static void AddNumber(this StringBuilder builder, string id)
{
    var originalValue = builder.ToString();
    if (originalValue.EndsWith(",") || string.IsNullOrEmpty(originalValue))
         builder.Append(id);
    else
         builder.Append("," + id);
}

var testing = new StringBuilder();
testing.AddNumber("1");
testing.AddNumber("2");
testing.AddNumber("3");

我也改变了算法。看起来效率不高。

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多