是否可以在C#内置Action 委托中使用ref类型?
C#具有内置委托Action
和Func
。 是否可以为此委托使用’ref’类型参数? 例如,这段代码:
public delegate void DTest( ref Guid a ); public event DTest ETest;
会编译。 但是如果我使用Action
,它将无法编译:
public event Action ETest;
任何提示?
不,您不能对Action
委托使用pass-by-reference。 虽然在框架中存在“通过引用传递的Type
”作为Type
的概念,但就C#而言,它并不是正常意义上的类型。 如果您看到我的意思, ref
是参数的修饰符,而不是类型名称的一部分。
但是,您可以构建自己的等效类型集,例如
delegate void ActionRef(ref T item);
当然,如果你想在同一个委托中混合使用ref和非ref参数,你会遇到一组可怕的组合:
delegate void ActionRef1(ref T1 arg1, T2 arg2); delegate void ActionRef2(T1 arg1, ref T2 arg2); delegate void ActionRef3(ref T1 arg1, ref T2 arg2);
只要您的引用是复杂对象(具有属性),您就可以。
示例对象:
public class MyComplexObject { /// /// Name provided for the result. /// public string Name { get; set; } /// /// Value of the result. /// public object Value { get; set; } }
用于动作:
Action myAction = (MyComplexObject result) => { result.Value = MyMethodThatReturnsSomething(); };
由于未更改MyComplexObject引用,因此将保留数据。
也发布在我的博客上 。