Вопрос по c# – Присвойте Переменную другой Переменной и отразите изменения одной в другой.

4

Можно ли присвоить переменную другой переменной, и когда вы меняете вторую переменную, водопады изменения переходят к первой переменной?

Как это.

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

теперь и б и а = 1.

Причина, по которой я спрашиваю об этом, заключается в том, что у меня есть 4 объекта, которые я отслеживаю, и я отслеживаю каждый из них, используя 5-й объект с именем currentObject, который равен любому из 4 объектов, которые использует пользователь. Тем не менее, я хотел бы просто внести изменения в currentObject и просто сделать его водопадом для переменной, из которой он получен.

Спасибо

Ваш Ответ

6   ответов
-1

чтобы сделать что угодно. Вы не можете объявить это в функции, однако.

    int a;
    int b
    {
        get
        {
            return a;
        }
        set
        {
            a = value;
        }
    }
Error: User Rate Limit Exceeded JMD
Error: User Rate Limit Exceeded
1

Create a 4-byte-sized variable named "a" in memory and after that give it a value of 0 Create a 4-byte-sized variable named "b" in memory and after that give it a value of (a)'s value [Currently 0] Change the Value of the variable "b" to 1

Но это не то, что вы хотите, то, что вы хотите, это что-то вроде этого

Create a 4-byte-sized variable named "a" in memory and after that give it a value of 0 Create a 4-byte-sized variable named "b" in memory and after that change the address of the variable "b" so that it doesn't refer to these 4 bytes anymore,but instead refer to (a)'s 4 bytes

То, о чем вы просите, - это Плохо + Невозможно

Bad : you have just created an empty space of 4 bytes that have no use at all and completely ignored them Impossible : Because you can't change the address of a value type (thus they are called "value" types not "reference" types)

Но что ты "должен" просить это

Create a 4-byte-sized variable named "a" in memory and after that give it a value of 0 Create an address that refers to the variable a Change the value of a through this address

И этот подход на самом деле совершенно нормально, и он используетуказателиУказатели просто являются адресами в памяти.

Примечание. Чтобы использовать указатели, вы должны разрешить небезопасный код в Project & gt; строить

В коде вот как это сделать:

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
}
Error: User Rate Limit Exceeded
-3

но я только что нашел это быстрое решение: если вы делаете присваивание в цикле for, ваша первая переменная не изменяется.

int a = 3;
int b;

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

b = 2; // a = 3

Надеюсь, поможет

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

что вы ищете, - это шаблон проектирования, обычно известный как наблюдатель. Объект B будет контролировать объект A (или 4 объекта, так как это то, что вам нужно), и когда A изменяется, B уведомляется и соответственно обновляет свое состояние.

В случае с C # я бы использовал события. Например, определите событие ValueChanged на A. 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;
      }
}
16

objects, references а такжеvariables, Если у вас есть две разные переменные (которые не связаны с помощью ref / out в методе и т. Д.), То они будут независимыми.

Однако, если две переменные относятся к одномуobject (т.е. их тип является классом, и ихvalues равные ссылки), то любые изменения в этом объекте будут видны через любую переменную. Похоже, это то, что вы хотите достичь. Например:

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

Если вы не совсем удовлетворены тем, как работают ссылочные типы и объекты, вы можете прочитать моистатья о них.

РЕДАКТИРОВАТЬ: Одна аналогия, которую я часто использую, это дома. Предположим, у нас есть два листа бумаги (переменные). Один и тот же домашний адрес написан на обоих листах бумаги (этоvalue каждой переменной,reference). Там только один дом. Если кто-то использует первый лист бумаги, чтобы добраться до дома, то окрашивает дверь в красный цвет, он ничего не меняет в своем листе бумаги - он что-то меняет вhouse, Тогда, если кто-то используетsecond чтобы добраться до дома, они увидят, что входная дверь тоже красная. Там только один дом, однако на многих листах бумаги написан их адрес.

Error: User Rate Limit Exceeded JMD
Error: User Rate Limit Exceeded JMD
Error: User Rate Limit Exceededx2.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded JMD
2

NO

как int, логическое, двойное и т. д.

С типами ссылок --------YES

как классы, объекты и т. д.

Error: User Rate Limit Exceededdoesn'tError: User Rate Limit ExceededvariableError: User Rate Limit Exceededobjects.

Похожие вопросы