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

Why is a string updated in a method not updated at the call site?

我有这个方法:

    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”。变量未更新。所以我必须将方法更改为 return 一个字符串并将 return 值分配给同一变量。

为什么变量没有在调用点更新?扩展方法获取变量的值paramString,我可以在方法中改变它,但是在主代码中变量没有改变?

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

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

然后您必须分配 returned 变量:

myString = myString.formatDecimalSeparator();

字符串是不可变的。每当对字符串进行任何更改时,都会 return 编辑一个具有更改的新实例。阅读 String is immutable. What exactly is the meaning?.

久经考验

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

字符串方法 return 一个新字符串,这就是您在扩展方法中要做的事情:

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();

如果你不想 return 任何东西,你应该传递字符串作为参考!

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