我刚刚编写了一个函数,但我不明白为什么我得到的结果是:
private void ReplaceIfEmpty(string originalValue, string newValue)
{
if (string.IsNullOrWhitespace(originalValue))
{
originalValue= newValue;
}
}
当我调用此函数时,originalValue不会更新。我的理解是,字符串是一个类,因此它是一个引用类型,因此我传递的值应该被更新。您能解释为什么不是吗?
最佳答案
这实际上与引用类型与值类型无关。
您正在更改参数的值:
originalValue= newValue;
对于没有
ref
或out
修饰符的“常规”参数,该更改将永远不可见。有关更多信息,请参见我的article on parameter passing,以及有关reference types and value types的文章,以确保您了解为什么有时“看起来”像引用类型默认通过引用传递。 (它们不是:默认情况下,所有参数都是按值传递的,只是对于引用类型,参数值是引用,而不是对象,因此对对象的更改仍然可以从调用方看到。)
因此,您可以将
originalValue
设置为ref
参数-但最好使该方法返回一个string
。我通常不愿意使用ref
参数;没有它们,代码通常更容易理解。