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();
}