К сожалению, нет собственного способа сохранить ссылку на переменную в C # .К счастью, есть много способов, чтобы b
ссылка на объект X оставалась синхронизированной с a
ссылкой на объект X.
Во-первых, классы:
public class SomeClass
{
public X x;
}
public class X
{
public int i; // I added this int to verify which X object we're working with.
public X(int i)
{
this.i = i;
}
}
Сценарий1: Если вам нужно сослаться на новый объект X.
Вариант 1: Если a
и b
должны быть разными объектами SomeClass, вы можете просто обновить ссылку на X * объекта b
на a
Ссылка на объект X.
SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
a.x = new X(1);
b.x = a.x;
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
a.x = new X(2);
b.x = a.x;
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
Вариант 2: Если b
не должен отличаться от a
, пусть b
ссылается на тот же объект SomeClass, что и a
.
SomeClass a = new SomeClass();
SomeClass b = a;
a.x = new X(1);
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
a.x = new X(2);
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
Сценарий 2: Если вам нужно только изменить внутреннее значение объекта X.
Поскольку a.x
- это тот же объект X, что и b.x
, вы можете изменитьэтот объект, используя любую ссылку, и просмотрите это изменение, используя другую ссылку.
SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
a.x = new X(1);
b.x = a.x;
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
a.x.i = 2;
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
b.x.i = 3;
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:3, b.x.i:3
Сценарий 3: Если вы хотите, чтобы другой класс всегда имел легкий доступ к X-объекту a
.
Новый класс:
public class SomeClass2
{
private SomeClass someClass;
public X x { get { return someClass.x; } }
public SomeClass2(SomeClass sc)
{
someClass = sc;
}
}
Использование нового класса:
SomeClass a = new SomeClass();
SomeClass2 b = new SomeClass2(a);
a.x = new X(1);
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:1, b.x.i:1
a.x = new X(2);
Console.WriteLine($"a.x.i:{a.x.i}, b.x.i:{b.x.i}"); // a.x.i:2, b.x.i:2
Сценарий 4: Если вы хотите локальныйпсевдоним a.x
.
SomeClass a = new SomeClass();
Func<X> func = () => a.x; // "func()" is now essentially an alias of "a.x"
a.x = new X(1);
Console.WriteLine($"a.x.i:{a.x.i}, func().i:{func().i}"); // a.x.i:1, func().i:1
a.x = new X(2);
Console.WriteLine($"a.x.i:{a.x.i}, func().i:{func().i}"); // a.x.i:2, func().i:2
Сценарий 5: Если вам нужно использовать один и тот же класс и иметь b.x
, всегда ссылаться на тот же объект, что и a.x
.
Вы можете использоватьFunc<X>
член вашего класса, действующий аналогично ссылке на переменную.Это работает , но я не обязательно рекомендую делать это , потому что это не интуитивно понятно и может привести к путанице.
Класс:
public class SomeClass3
{
public Func<X> x;
}
Использование класса:
SomeClass3 a = new SomeClass3();
SomeClass3 b = new SomeClass3();
X x1 = new X(1);
a.x = () => x1;
b.x = () => a.x();
Console.WriteLine($"a.x().i:{a.x().i}, b.x().i:{b.x().i}"); // a.x().i:1, b.x().i:1
X x2 = new X(2);
a.x = () => x2;
Console.WriteLine($"a.x().i:{a.x().i}, b.x().i:{b.x().i}"); // a.x().i:2, b.x().i:2