在Func <t>中使用new </t>

时间:2009-04-24 18:17:38

标签: c# generics function delegates

我在读完this question之后想知道......他有这段代码:

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

是否可以将该新项目作为另一个Func发送?我的意思是,当然会。但是,那已经创造了吗?或者当你真正运行Func时它会先创建吗?让我们说你有这个:

public static T FindOrCreate<T>(this Table<T> table, Func<T, bool> find, Func<T> replacement) 
    where T : new()
{
    T val = table.FirstOrDefault(find);
    if (val == null)
    {
        val = replacement();
        table.InsertOnSubmit(val);
    }
    return val;
}

然后这样做:

var invoiceDb = ctx.Invoices.FindOrCreate(a => a.InvoicerId == InvoicerId
                                            && a.Number == invoiceNumber,
                                          () => new Invoice());
invoiceDb.Number = invoiceNumber;

如果找到该发票,是否已创建新的发票?或者直到该函数被实际调用,该代码是否运行?或者它是如何工作的?

3 个答案:

答案 0 :(得分:1)

replacement中的代码在实际调用该函数之前不会运行,并且在表中发现该值丢失。

顺便说一句,如果按照规定实现这一点,这是完全合理的 - 您可能希望从函数中删除“where T : new()”约束,因为它不再是必需的;你给它提供了有关如何明确地构建一个的所有信息。

答案 1 :(得分:1)

在这种情况下,你传递一个代表,所以

() => new Invoice()
直到

才会调用

代码

val = replacement();

线

答案 2 :(得分:0)

不,不会创建新发票。 Func只是一个委托,所以当你创建lambda :()=&gt;新的Invoice()与实现这一点几乎相同:

public Invoice Create()
{
   return new Invoice();
}

并将委托传递给Create方法。只有当您实际执行委托(“创建”功能)时,该代码才会实际运行,从而创建发票。