我刚刚编写了一个函数,但我不明白为什么我得到的结果是:

private void ReplaceIfEmpty(string originalValue, string newValue)
{
  if (string.IsNullOrWhitespace(originalValue))
  {
    originalValue= newValue;
  }
}


当我调用此函数时,originalValue不会更新。我的理解是,字符串是一个类,因此它是一个引用类型,因此我传递的值应该被更新。您能解释为什么不是吗?

最佳答案

这实际上与引用类型与值类型无关。

您正在更改参数的值:

originalValue= newValue;


对于没有refout修饰符的“常规”参数,该更改将永远不可见。

有关更多信息,请参见我的article on parameter passing,以及有关reference types and value types的文章,以确保您了解为什么有时“看起来”像引用类型默认通过引用传递。 (它们不是:默认情况下,所有参数都是按值传递的,只是对于引用类型,参数值是引用,而不是对象,因此对对象的更改仍然可以从调用方看到。)

因此,您可以将originalValue设置为ref参数-但最好使该方法返回一个string。我通常不愿意使用ref参数;没有它们,代码通常更容易理解。

08-07 16:21