问题描述
|
public string[] arrTestResults = new string[8];
public string TestName;
[TestInitialize]
public void SetupTest()
{
// Assigning aliases to array indexes
TestName = arrTestResults[0] = \"\";
}
public void General()
{
arrTestResults[0] = \"Test 1: General\"; // works
TestName = \"Test 1: General\"; // does not work. Quick Watch says TestName = Null. WHY?
解决方法
TestName
不是arrTestResults[0]
的别名。
我假设arrTestResults
也是string[]
,TestName
也是。
“ 2”是一个存储位置,其值引用“ 7”的一个实例。
TestName
是一个存储位置,其值引用string
的一个实例。
TestName = arrTestResults[0] = \"\";
不会使“ 1”成为“ 2”的别名。相反,它为存储位置TestName
和存储位置arrTestResults[0]
分配了对等于\"\"
的string
实例的引用。即,有对“ 16”的引用。该参考分配给arrTestResults[0]
和TestName
。它非常类似于
int y = 0;
int x = y = 17;
在此,x
不是y
的别名。我们刚刚将值17
复制到y
和x
。在我们的例子中,该值是参考。对“ 16”的引用将复制到“ 2”和“ 1”。
然后
arrTestResults[0] = \"Test 1: General\";
为存储位置“ 2”分配一个新引用。
就像
y = 42;
接着
TestName = \"Test 1: General\";
为存储位置“ 1”分配一个新引用。它不会更改arrTestResults[0]
的值,因为这两个存储位置不同。再次,这很像
x = 69;
这不会改变y
的值。
, 我认为您的问题标题在这里显示出潜在的误解:
数组索引的别名
当您像这样分配一个字符串时:
TestName = arrTestResults[0];
您不是要为arrTestResults[0]
中包含的内容分配别名,而是将对字符串arrTestResults[0]
指向的引用复制到TestName
中。这是对字符串的引用的副本,但不是别名。
稍后,当您将值分配给TestName
时:
TestName = \"Test 1: General\";
这将复制一个新引用,并覆盖旧引用。它对数组中的引用没有任何作用,因为它是一个单独的副本。
, 那不是别名;它是一个自变量。
不可能使变量成为另一个变量或数组元素的别名(除非您使用不安全的代码)。