为什么在呼叫站点未更新的方法中更新字符串?

时间:2015-01-02 12:02:18

标签: c# extension-methods

我有这个方法:

    namespace MyProject.String.Utils
    {
        public static class String
        {
            public static void formatDecimalSeparator(this string paramString)
            {
                try
                {
                    if (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator == ",")
                    {
                        paramString = paramString.Replace(".", ",");
                    }
                    else
                    {
                        paramString = paramString.Replace(",", ".");
                    }
                }
                catch
                {
                    throw;
                }
            }
        }
    }

但是当我这样做时:

string myString = "1.23";
myString.formatDecimalSeparator();

结果不是" 1,23"。变量未更新。所以我必须更改方法以返回一个字符串并将返回值赋给同一个变量。

为什么变量未在呼叫站点更新?扩展方法获取变量paramString的值,我可以在方法中更改它,但在主代码中变量不会更改?

3 个答案:

答案 0 :(得分:6)

您需要将返回类型设置为字符串。

public static string formatDecimalSeparator(this string paramString)
{
    try
    {
        if (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator == ",")
            return paramString.Replace(".", ",");
        else
            return paramString.Replace(",", ".");
     }
     catch
     {
         throw;
     }
 }

然后你必须分配返回的变量:

myString = myString.formatDecimalSeparator();

字符串是不可变的。只要在字符串中进行任何更改,就会返回带有更改的新实例。阅读String is immutable. What exactly is the meaning?

尝试和测试

enter image description here

答案 1 :(得分:3)

字符串是不可变的,因此您无法更改字符串。对字符串的引用将传递给该方法,但是当您尝试更改字符串时,实际上您将更改引用以指向新字符串。方法外部的代码仍然具有对原始字符串的引用。

String方法返回一个新字符串,这就是你在扩展方法中要做的事情:

namespace MyProject.String.Utils
{
    public static class String
    {
        public static string formatDecimalSeparator(this string paramString)
        {
            if (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator == ",")
            {
                return paramString.Replace(".", ",");
            }
            else
            {
                return paramString.Replace(",", ".");
            }
        }
    }
}

用法:

string myString = "1.23";
myString = myString.formatDecimalSeparator();

答案 2 :(得分:3)

如果您不想返回任何内容,则应将该字符串作为参考传递!

            public static void formatDecimalSeparator(ref string paramString)
            {
                try
                {
                    if (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator == ",")
                    {
                        paramString = paramString.Replace(".", ",");
                    }
                    else
                    {
                        paramString = paramString.Replace(",", ".");
                    }
                }
                catch
                {
                    throw;
                }
            }