nov*_*vog 6 c# generics pass-by-reference c#-7.0
是否可以在C#7.0中使用ref returns功能定义一个泛型函数,它可以在Object的两个实例中同时进行字段的比较和更新?我想象的是这样的:
void UpdateIfChanged<TClass, TField>(TClass c1, TClass c2, Func<TClass, TField> getter)
{
if (!getter(c1).Equals(getter(c2))
{
getter(c1) = getter(c2);
}
}
Run Code Online (Sandbox Code Playgroud)
用途示例:
Thing thing1 = new Thing(field1: 0, field2: "foo");
Thing thing2 = new Thing(field1: -5, field2: "foo");
UpdateIfChanged(thing1, thing2, (Thing t) => ref t.field1);
UpdateIfChanged(thing1, thing2, (Thing t) => ref t.field2);
Run Code Online (Sandbox Code Playgroud)
有没有办法指定一个Func类型或任何类型的泛型类型限制,通过要求getter返回引用来使其有效?我试过Func<TClass, ref TField>,但它似乎不是有效的语法.
您将无法使用Func,因为它不会通过引用返回结果.您需要创建一个使用ref return的新委托:
public delegate ref TResult RefReturningFunc<TParameter, TResult>(TParameter param);
Run Code Online (Sandbox Code Playgroud)
然后更改您的函数以使用该委托就足以使其工作:
public static void UpdateIfChanged<TClass, TField>(TClass c1, TClass c2, RefReturningFunc<TClass, TField> getter)
{
if (!getter(c1).Equals(getter(c2)))
{
getter(c1) = getter(c2);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,不能通过引用返回属性.您可以通过引用或任何其他变量返回字段,但属性不是变量.
您需要为它声明自己的委托类型.例如:
using System;
public class Thing
{
public int field1;
public string field2;
}
public delegate ref TOutput FuncRef<TInput, TOutput>(TInput input);
public class Test
{
public static void Main()
{
Thing thing1 = new Thing { field1 = 0, field2 = "foo" };
Thing thing2 = new Thing { field1 = -5, field2= "foo" };
UpdateIfChanged(thing1, thing2, (Thing t) => ref t.field1);
UpdateIfChanged(thing1, thing2, (Thing t) => ref t.field2);
}
static void UpdateIfChanged<TInput, TOutput>(TInput c1, TInput c2, FuncRef<TInput, TOutput> getter)
{
if (!getter(c1).Equals(getter(c2)))
{
getter(c1) = getter(c2);
}
}
}
Run Code Online (Sandbox Code Playgroud)
(注意到处使用"field"而不是"property".)
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |