将变量分配给另一个变量,并在另一个变量中镜像一个变量中的更改
本文关键字:变量 另一个 一个 分配 镜像 | 更新日期: 2023-09-27 18:34:18
是否可以将一个变量分配给另一个变量,当您更改第二个变量时,更改瀑布会下降到第一个变量?
喜欢这个。
int a = 0;
int b = a;
b = 1;
现在 B 和 A 都会 = 1。
我问这个问题的原因是因为我有 4 个对象要跟踪,并且我使用名为 currentObject 的第 5 个对象跟踪每个对象,该对象等于用户正在使用的 4 个对象中的任何一个。但是,我只想对当前对象进行更改,并使其瀑布到它来自的变量。
谢谢
您需要区分对象、引用和变量。如果你有两个不同的变量(它们不是通过方法中的 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
如果您对引用类型和对象的工作方式不完全满意,您可能希望阅读我关于它们的文章。
编辑:我经常使用的一个类比是房子。假设我们有两张纸(变量(。两张纸上都写着相同的房屋地址(这是每个变量的值,参考(。只有一所房子。如果有人用第一张纸到达房子,然后把门涂成红色,他们并没有改变他们的纸上的任何东西 - 他们正在改变房子的一些东西。然后,如果有人用第二张纸到达房子,他们会看到前门也是红色的。只有一所房子,但有多少张纸上写着它的地址。
首先,你应该了解你在以前的代码中做了什么
- 在内存中创建一个名为"a"的 4 字节大小的变量,然后为其提供值 0
- 在内存中创建一个名为"b"的 4 字节大小的变量,然后给它一个值 (a( 的值 [当前为 0]
- 将变量"b"的值更改为 1
但这不是你想要的,你想要的更像这样
- 在内存中创建一个名为"a"的 4 字节大小的变量,然后为其提供值 0 在内存中创建一个名为"b"的 4 字节大小的变量,
- 然后更改变量"b"的地址,使其不再引用这 4 个字节,而是引用 (a( 的 4 个字节
你所要求的既糟糕+不可能
- 不好:您刚刚创建了一个完全没有用的 4 字节的空白空间并完全忽略了它们
- 不可能:因为您无法更改值类型的地址(因此它们称为"值"类型而不是"引用"类型(
但你"应该"要求的是这个
- 在内存中创建一个名为"a"的 4 字节大小的变量,然后为其提供值 0
- 创建一个引用变量 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
}
结构/值类型------- NO
如整数,布尔值,双精度等。
引用类型--------">是">
比如类、对象等。
您正在寻找的是一种通常称为观察者的设计模式。对象 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;
}
}
这是一个旧帖子,但我有几种方法可以处理这种情况。
首先,您可以创建私有变量,然后让公共 getter/setter 根据需要修改私有值:
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"
}
干杯!
您可以更改get和set函数中的代码以执行几乎任何事情。 但是,您不能在函数中声明这一点。
int a;
int b
{
get
{
return a;
}
set
{
a = value;
}
}