将引用存储在另一个变量中

本文关键字:变量 另一个 引用 存储 | 更新日期: 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。

祝你好运。