将引用存储在另一个变量中
本文关键字:变量 另一个 引用 存储 | 更新日期: 2023-09-27 18:35:04
我一直在搜索,但我找不到任何方法可以在某个变量中存储对另一个变量的引用。我正在尝试创建一个类来撤消用户完成的操作;
class UndoAction
{
public object var;
public object val;
public UndoAction(ref object var, object val)
{
this.var = var;
this.val = val;
}
public static List<UndoAction> history = new List<UndoAction>();
public static void AddHistory(ref object var, object val)
{
history.Add(new UndoAction(ref var, val));
}
}
我想你可以看到我在这里想要实现的目标。
我遇到的问题;
this.var = var;
不存储引用,而是存储引用的"var"的值。我如何存储引用本身,以便我可以简单地运行;
this.var = val;
在我的情况下,"撤消"操作?
2022 年更新:虽然这可能不是实现撤消的特别合适的功能,但 C# 7 引入了 ref 局部变量和 ref 返回,C# 11 计划允许将它们存储在 ref 字段中。
除此之外:
标准安全 C# 根本不支持此功能。底层框架几乎包含所有必要的概念,但它们不会在 C# 语言中公开。但即便如此,这样的引用也不能存储在字段中。
你能拥有的最好的方法是将其包装在某个使用委托的类中。相比之下,这显然是相当昂贵的,但除非您在紧密循环中修改内容,否则这可能足够好:
class VarRef<T>
{
private Func<T> _get;
private Action<T> _set;
public VarRef(Func<T> @get, Action<T> @set)
{
_get = @get;
_set = @set;
}
public T Value
{
get { return _get(); }
set { _set(value); }
}
}
然后像这样使用它:
var myVar = ...
var myVarRef = new VarRef<T>(() => myVar, val => { myVar = val; });
...
myVarRef.Value = "47";
Console.WriteLine(myVar); // writes 47
你的做法是错误的。装箱/取消装箱不是您需要的,您需要保存对象引用和特定属性以及该属性的值。
不要试图建立一个完全通用的系统,可以撤销人类的创造。从简单开始。
首先使用界面设置某些对象,例如...不可行。
使用属性标记某些属性,例如 [UnduableProperty]使用 INotifyPropertyChange 接口并使用 PropertyChanged 事件。当属性更改时,请收听它,检查它是否可撤消,并保存其值。
不要害怕使用反射,但如果可以的话,尽量避免使用速度问题。
保存对象,保存属性,保存值。创建管理器对象以管理撤消过程。
如果您在保存复杂结构的值时遇到问题,请不要忘记 ISerializable。
祝你好运。