我有这个方法:
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
的值,我可以在方法中更改它,但在主代码中变量不会更改?
答案 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?。
尝试和测试
答案 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;
}
}