C# 在函数中使用新函数<;T>;
我在想,读完之后。。。他有这样的密码:C# 在函数中使用新函数<;T>;,c#,generics,function,delegates,C#,Generics,Function,Delegates,我在想,读完之后。。。他有这样的密码: public static T FindOrCreate<T>(this Table<T> table, Func<T, bool> find) where T : new() { T val = table.FirstOrDefault(find); if (val == null) { val = new T(); table.InsertOnSubm
public static T FindOrCreate<T>(this Table<T> table, Func<T, bool> find)
where T : new()
{
T val = table.FirstOrDefault(find);
if (val == null)
{
val = new T();
table.InsertOnSubmit(val);
}
return val;
}
如果找到该发票,是否会创建该新发票?或者该代码是在函数实际被调用之前才运行的?或者这是如何工作的?在实际调用函数之前,
replacement
中的代码不会运行,并且发现表中缺少该值
顺便说一句,如果您按照前面所述的方式实现它,这是完全合理的——您可能希望从函数中删除“
where T:new()
”约束,因为它不再是必需的;您可以非常明确地向它提供有关如何构造一个代理的所有信息。在本例中,您传递的是一个委托,因此
() => new Invoice()
直到
val = replacement();
行否,将不会创建新发票。Func只是一个委托,因此在创建lambda:()=>newinvoice()时,实际上与执行此操作相同:
var invoiceDb = ctx.Invoices.FindOrCreate(a => a.InvoicerId == InvoicerId
&& a.Number == invoiceNumber,
() => new Invoice());
invoiceDb.Number = invoiceNumber;
public Invoice Create()
{
return new Invoice();
}
并将委托传递给Create方法。只有在实际执行委托(“创建”函数)后,代码才会实际运行,从而创建发票。这也是正确的。我只是从他的答案中复制粘贴了代码,并没有认真考虑:p
public Invoice Create()
{
return new Invoice();
}