为什么在调用站点未更新的方法中更新字符串?
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;
}
}
我有这个方法:
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;
}
}