C# 7.0 中的泛型函数和 ref returns
Generic functions and ref returns in C# 7.0
是否可以使用 C# 7.0 中的 ref returns 功能来定义一个通用函数,该函数可以对一个对象的两个实例中的字段进行比较和更新?我正在想象这样的事情:
void UpdateIfChanged<TClass, TField>(TClass c1, TClass c2, Func<TClass, TField> getter)
{
if (!getter(c1).Equals(getter(c2))
{
getter(c1) = getter(c2);
}
}
预期用途示例:
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);
是否有任何方法可以通过要求 getter return 引用来指定 Func 类型或任何类型的泛型类型限制以使其有效?我试过 Func<TClass, ref TField>
,但它似乎不是有效的语法。
您将无法使用 Func
,因为它不会 return 引用结果。您需要创建一个使用 ref return:
的新委托
public delegate ref TResult RefReturningFunc<TParameter, TResult>(TParameter param);
然后更改您的函数以使用该委托就足以使其工作:
public static void UpdateIfChanged<TClass, TField>(TClass c1, TClass c2, RefReturningFunc<TClass, TField> getter)
{
if (!getter(c1).Equals(getter(c2)))
{
getter(c1) = getter(c2);
}
}
请注意,属性 不能通过引用 return 编辑。您可以通过引用 return 字段 或任何其他 变量 ,但 属性 不是变量。
您需要为其声明您自己的委托类型。例如:
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);
}
}
}
(注意到处都使用 "field" 而不是 "property"。)
是否可以使用 C# 7.0 中的 ref returns 功能来定义一个通用函数,该函数可以对一个对象的两个实例中的字段进行比较和更新?我正在想象这样的事情:
void UpdateIfChanged<TClass, TField>(TClass c1, TClass c2, Func<TClass, TField> getter)
{
if (!getter(c1).Equals(getter(c2))
{
getter(c1) = getter(c2);
}
}
预期用途示例:
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);
是否有任何方法可以通过要求 getter return 引用来指定 Func 类型或任何类型的泛型类型限制以使其有效?我试过 Func<TClass, ref TField>
,但它似乎不是有效的语法。
您将无法使用 Func
,因为它不会 return 引用结果。您需要创建一个使用 ref return:
public delegate ref TResult RefReturningFunc<TParameter, TResult>(TParameter param);
然后更改您的函数以使用该委托就足以使其工作:
public static void UpdateIfChanged<TClass, TField>(TClass c1, TClass c2, RefReturningFunc<TClass, TField> getter)
{
if (!getter(c1).Equals(getter(c2)))
{
getter(c1) = getter(c2);
}
}
请注意,属性 不能通过引用 return 编辑。您可以通过引用 return 字段 或任何其他 变量 ,但 属性 不是变量。
您需要为其声明您自己的委托类型。例如:
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);
}
}
}
(注意到处都使用 "field" 而不是 "property"。)