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

时间:2012-05-15 15:36:30

标签: c#

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

喜欢这个。

int a = 0;
int b = a;
b = 1;

现在b和a都= 1。

我问这个的原因是因为我有4个对象我正在跟踪,并且我使用名为currentObject的第5个对象跟踪每个对象,该对象等于用户正在使用的4个对象中的任何一个。但是,我想对currentObject做一个更改,只是将它放到它来自的变量上。

由于

7 个答案:

答案 0 :(得分:16)

您需要区分对象引用变量。如果你有两个不同的变量(通过方法中的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

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

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

答案 1 :(得分:2)

使用结构/值类型-------

喜欢int,boolean,double等。

使用参考类型--------

喜欢类,对象等。

答案 2 :(得分:1)

首先,您应该了解您在之前的代码中正在做什么

  1. 在内存中创建一个名为“a”的4字节大小的变量,之后将其赋值为0
  2. 在内存中创建一个名为“b”的4字节大小的变量,然后给它一个值(a)的值[当前为0]
  3. 将变量“b”的值更改为1
  4. 但这不是你想要的,你想要的是更像这样的东西

    1. 在内存中创建一个名为“a”的4字节大小的变量,之后将其赋值为0
    2. 在内存中创建一个名为“b”的4字节大小的变量,之后更改变量“b”的地址,使其不再引用这4个字节,而是引用(a)' s 4个字节
    3. 你所要求的是Bad + Impossible

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

      但你应该要求的是这个

      1. 在内存中创建一个名为“a”的4字节大小的变量,之后将其赋值为0
      2. 创建一个引用变量a
      3. 的地址
      4. 通过此地址更改a的值
      5. 这种方法实际上完全没问题,它使用Pointers,指针只是内存中的地址。

        注意:要使用指针,您必须在Project>中允许不安全的代码;构建

        在代码中,这里是如何做到的:

        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 refers to to 1
        
            //now a = 1
        }
        

答案 3 :(得分:0)

您正在寻找的是一种通常被称为观察者的设计模式。对象B将监视对象A(或4个对象,因为这是您需要的),并且当A被修改时,B被通知并相应地更新其状态。

在C#的情况下,我会使用事件。例如,在A.上定义事件ValueChanged .B将侦听此事件并更新其值。

public delegate void ChangedEventHandler(object sender, EventArgs e);

Class A
{
   public event ChangedEventHandler Changed;
   int val = 0;
   int Val
   {
      get { return val;}
      set { 
          if ( val != value ) val = value
          {
              val = value;
              if (Changed != null) Changed(this, new EventArgs());
          }

   }
}


class B
{
    A obj1, obj2, obj3, obj4;
    int Val {get;set;}
    A CurrentlyWatched {get;set;}

    public B()
    {
       obj1 = new A();
       obj1.Changed += new ChangedEventHandler(ElementChanged);
       obj2 = new A(); 
       ...
    }

    private void ElementChanged(object sender, EventArgs e) 
      {
         this.CurrentlyWatched = sender as A;
         this.Val = CurrentlyWatched.Val;
      }
}

答案 4 :(得分:0)

我知道这是一篇过时的文章,但是有几种方法可以处理这种情况。

首先,您可以创建私有变量,然后让公共获取器/设置器根据需要修改私有值:

private int firstVar = 10;
private int secondVar = 20;

public int FirstVar
{
    get
    {
        return firstVar;
    }
    set
    {
        firstVar = secondVar = value;
    }
}
public int SecondVar
{
    get
    {
        return secondVar;
    }
    set
    {
        firstVar = secondVar = value;
    }
}

public void SomeFunction()
{
    Console.WriteLine("FirstVar=" + FirstVar); // Output: "FirstVar=10"
    Console.WriteLine("SecondVar=" + SecondVar); // Output: "SecondVar=20"

    FirstVar = 30;
    Console.WriteLine("FirstVar=" + FirstVar); // Output: "FirstVar=30"
    Console.WriteLine("SecondVar=" + SecondVar); // Output: "SecondVar=30"
}

另一种方法是创建一个可以做同样事情的自定义类:

    public class MyVariable
    {
        protected static List<MyVariable> _instances;

        public int Value { get; set; }

        public MyVariable() 
        {
            if (_instances == null) _instances = new List<MyVariable>();
            _instances.Add(this);
        }
        public MyVariable(int value) : base() { Value = value; }

        public void SetAll(int value) { foreach (MyVariable myVar in _instances) myVar.Value = value; }
        public override string ToString() { return Value.ToString(); }
    }

    public void SomeOtherFunction()
    {
        MyVariable var1 = new MyVariable(30);
        MyVariable var2 = new MyVariable(50);

        Console.WriteLine("var1=" + var1.ToString()); // Output: "var1=30"
        Console.WriteLine("var2=" + var2.ToString()); // Output: "var2=50"

        var1.SetAll(100);
        Console.WriteLine("var1=" + var1.ToString()); // Output: "var1=100"
        Console.WriteLine("var2=" + var2.ToString()); // Output: "var2=100"
    }

干杯!

答案 5 :(得分:-1)

在这里,您可以更改get和set函数中的代码以执行任何操作。但是你不能在函数中声明它。

    int a;
    int b
    {
        get
        {
            return a;
        }
        set
        {
            a = value;
        }
    }

答案 6 :(得分:-3)

我对C#编程不是很熟练,但我刚刚发现了这个快速修复:如果你在for循环中进行赋值,你的第一个变量就不会被修改。

int a = 3;
int b;

for (int i = 0; i < 1; i++)
{
   b = a;
}

b = 2; // a = 3

希望有所帮助

相关问题