将变量分配给另一个变量,其中一个变量在另一个变量中镜像

JMD*_*JMD 5 c#

是否可以将变量分配给另一个变量,当您更改第二个变量时,更改会向下变为第一个变量?

像这样.

int a = 0;
int b = a;
b = 1;
Run Code Online (Sandbox Code Playgroud)

现在b和a都= 1.

我问这个的原因是因为我有4个我正在跟踪的对象,并且我使用名为currentObject的第5个对象跟踪每个对象,该对象等于用户正在使用的4个对象中的任何一个.但是,我想对currentObject进行一些更改,然后让它成为它所来自的变量的瀑布.

谢谢

Jon*_*eet 17

您需要区分对象,引用变量.如果你有两个不同的变量(通过方法中的ref/out没有别名等),那么这些变量将是独立的.

但是,如果两个变量引用同一个对象(即它们的类型是一个类,并且它们的是相等的引用),那么通过任一变量都可以看到对该对象的任何更改.听起来这就是你想要实现的目标.例如:

public class SomeMutableClass
{
    public string Name { get; set; }
}

// Two independent variables which have the same value
SomeMutableClass x1 = new SomeMutableClass();
SomeMutableClass x2 = x1;

// This doesn't change the value of x1; it changes the
// Name property of the object that x1's value refers to
x1.Name = "Fred";
// The change is visible *via* x2's value.
Console.WriteLine(x2.Name); // Fred
Run Code Online (Sandbox Code Playgroud)

如果您对参考类型和对象的工作方式不太满意,您可能希望阅读我的文章.

编辑:我经常使用的一个类比是房子.假设我们有两张纸(变量).相同的房屋地址写在两张纸上(这是每个变量的,参考).只有一个房子.如果有人用第一张纸来到房子里,然后将门涂成红色,他们就不会改变他们的纸张 - 他们正在改变房子的一些东西.然后,如果有人使用第二张纸进入房子,他们会看到前门也是红色的.只有一个房子,但是很多纸上写着地址.


big*_*d12 5

首先你应该明白你在之前的代码中做了什么

  1. 在内存中创建一个名为“a”的 4 字节大小的变量,然后为其赋值 0
  2. 在内存中创建一个名为“b”的 4 字节大小的变量,然后为其赋予 (a) 的值 [当前为 0]
  3. 将变量“b”的值更改为 1

但这不是你想要的,你想要的更像是这样

  1. 在内存中创建一个名为“a”的 4 字节大小的变量,然后为其赋值 0
  2. 在内存中创建一个名为“b”的4字节大小的变量,然后更改变量“b”的地址,使其不再引用这4个字节,而是引用(a)的4个字节

你所要求的既不好又不可能

  • 坏:你刚刚创建了一个完全没有用的 4 个字节的空白空间,并且完全忽略了它们
  • 不可能:因为您无法更改值类型的地址(因此它们被称为“值”类型而不是“引用”类型)

但你“应该”要求的是这个

  1. 在内存中创建一个名为“a”的 4 字节大小的变量,然后为其赋值 0
  2. 创建一个引用变量 a 的地址
  3. 通过这个地址改变a的值

这种方法实际上是完全可以的,它使用指针,指针只是内存中的地址。

注意:要使用指针,您必须在“项目”>“构建”中允许不安全代码

代码如下:

int a = 5;
unsafe //use unsafe around the areas where pointers exist
{
    int* b = &a; //create an address named b that refers to a
    *b = 1; //change the value of the variable that exists at the address b to 1

    //now a = 1
}
Run Code Online (Sandbox Code Playgroud)