generics指针?
好吧所以我想创建一个将改变数据类型值的generics类。 我想这样做的原因是我可以使用undo和redo方法。 我可以为我需要的每种值类型编写一个类。 IE double,int …但如果我可以创建一个通用类来做这件事会容易得多。
这就是我所拥有的
class CommandChangeDouble : Command { double _previous; double _new; double* _objectRef; public unsafe CommandChangeDouble(double* o, double to) { _objectRef = o; _previous = *o; _new = to; *_objectRef = _new; } public unsafe void Undo() { *_objectRef = _previous; } public unsafe void Redo() { *_objectRef = _new; } }
这就是我要的
class CommandChangeValue : Command { T _previous; T _new; T* _objectRef; public unsafe CommandChangeValue(T* o, T to) { _objectRef = o; _previous = *o; _new = to; *_objectRef = _new; } public unsafe void Undo() { *_objectRef = _previous; } public unsafe void Redo() { *_objectRef = _new; } }
但这给了我错误错误“无法获取地址,获取大小,或声明指向托管类型(’T’)的指针”
有没有更好的方法来做到这一点或解决这个错误的方法?
而不是提供指向值的指针,提供一个setter:
class CommandChangeValue : Command { T _previous; T _new; Action _set; public CommandChangeValue(T value, Action setValue, T newValue) { _previous = value; _new = newValue; _set = setValue; setValue(_new); } public void Undo() { _set(_previous); } public void Redo() { _set(_new); } } // ... double v = 42; var c = new CommandChangeValue(v, d => v = d, 99);
只是为了记录,您可以使用这些方法获得指向generics类型或任何其他类型的指针….
/// /// Provides the current address of the given element /// /// /// /// [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] public static System.IntPtr AddressOf(T t) //refember ReferenceTypes are references to the CLRHeader //where TOriginal : struct { System.TypedReference reference = __makeref(t); return *(System.IntPtr*)(&reference); } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] static System.IntPtr AddressOfRef (ref T t) //refember ReferenceTypes are references to the CLRHeader //where TOriginal : struct { System.TypedReference reference = __makeref(t); System.TypedReference* pRef = &reference; return (System.IntPtr)pRef; //(&pRef) }
我和其他几个人一起使用它们来实现与数组一起使用的切片forms。
不要使用指针。
如果您使用普通引用,并始终通过此类中的属性与值进行交互,则一切都将正常工作。
不要使用指针,如另一个答案和评论中所述。 如果您想在应用程序中使用某些撤消/重做function,您可能需要查看Memento模式 。
上述就是C#学习教程:generics指针?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1006820.html