我正在创建一个程序,需要更改存储在数组中的整数值。这是我正在谈论的一个例子:
int num = 0;
int[] nums = new int[] {num};
Console.WriteLine(nums[0]);
nums[0] = 1;
Console.WriteLine(nums[0]);
Console.WriteLine(num);
此刻,程序输出0、1、0。有没有办法仅通过使用数组来修改num的值,使其输出0、1、1?
答案 0 :(得分:4)
您的错误似乎是在认为变量num
和nums
之间存在引用。
int[] nums = new int[] {num}
仅取值0并将其分配给数组的第一个元素。并且以后更改其中任何一个都不会更改另一个。 int
是一种值类型,因此这是不可能的。您应该阅读值和引用类型。
但是,您可以尝试这样的操作,因为就像我说的那样,您需要对同一事物进行两次引用才能更改一件事,而又更改另一件事。
class IntContainer { public int val;} //class with int field
IntContainer num = new IntContainer {val = 1}; //original set to 1
IntContainer[] nums = new[] {num};
nums[0].val = 200; //setting the array element
Console.WriteLine(num.val); //200 not 1
之所以起作用,是因为它更改了基础引用所指向的值。
答案 1 :(得分:2)
您要么混入变量名,要么不了解C#中引用类型和值类型之间的区别。
您的示例中的num变量是一个值类型。而int [] nums是引用类型。
分配值类型时,将值从一个变量复制到另一个变量。分配引用类型时,就是将对象的引用从变量分配到另一个对象。在这种情况下,当两个变量指向同一个对象的引用而您在该对象内进行更改时,您将看到两者都发生了更改。
这里是另一个例子来说明这一点。...
int valueA = 1; // Copying value 1 to valueA
int valueB = valueA; // Copying valueA to valueB
int[] arrayReferenceA = new[] { valueA }; // Creates a reference of an array of value types
int[] arrayReferenceB = arrayReferenceA; // Copies a reference to the array
valueB = 2; // Copying value 2 to valueB
arrayReferenceB[0] = valueB; // Copying valueB to the first element of an array of values referenced by arrayReferenceB
Console.WriteLine(valueA);
Console.WriteLine(valueB);
Console.WriteLine(arrayReferenceA[0]);
Console.WriteLine(arrayReferenceB[0]);
其输出为...
1 2 2 2