2009-04-24 7 views
2

Je me demandais, après avoir lu this question ... il a ce code:l'utilisation de nouvelles dans un Func <T>

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

Serait-il possible d'envoyer aussi dans ce nouvel élément comme un autre Func? Je veux dire, bien sûr que ce serait le cas. Mais, cela aurait-il déjà été créé? Ou serait-il créé en premier lorsque vous exécutez réellement le Func? Disons que vous avez ceci:

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

Et puis appelé qu'en faisant ceci:

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

Si cette facture a été trouvé, aurait été créé cette nouvelle facture? Ou ce code n'est-il pas exécuté jusqu'à ce que la fonction soit appelée? ou comment ça marche?

Répondre

1

Dans ce cas, vous passez un délégué si le

() => new Invoice() 
Code

n'est pas appelé jusqu'à ce que le

val = replacement(); 

ligne

1

Le code dans replacement ne serait pas exécuté tant que la fonction n'a pas été appelée et que la valeur manquait dans la table. A propos, si vous implémentez cela comme indiqué, ce qui est parfaitement raisonnable, vous pouvez supprimer la contrainte "where T : new()" de la fonction, car elle n'est plus nécessaire; vous lui donnez toutes les informations sur la façon d'en construire une de manière très explicite.

+0

qui est également vrai. J'ai juste copié le code de sa réponse, je n'y ai pas vraiment réfléchi: p – Svish

0

Non, la nouvelle facture n'aurait pas été créée . Func est juste un délégué, donc quand vous créez le lambda:() => nouvelle facture() il est pratiquement la même chose que faire:

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

et en passant dans un délégué à la méthode Create. exécute le le délégué (la fonction "créer") que ce code exécute réellement et ainsi la facture est créée.

Questions connexes