是否可以更改数组中变量的值?

时间:2018-07-18 02:14:16

标签: c# arrays

我正在创建一个程序,需要更改存储在数组中的整数值。这是我正在谈论的一个例子:

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?

2 个答案:

答案 0 :(得分:4)

您的错误似乎是在认为变量numnums之间存在引用。

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