Использование нового в Func <T> - PullRequest
2 голосов
/ 24 апреля 2009

Мне было интересно, прочитав этот вопрос ... у него есть этот код:

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 ]

1 голос
/ 24 апреля 2009

В этом случае вы передаете делегата, поэтому

() => new Invoice()

код не вызывается до

val = replacement();

линия

1 голос
/ 24 апреля 2009

Код в replacement не будет выполняться до тех пор, пока функция не будет фактически вызвана, а в таблице не найдено значение.

Кстати, если вы реализуете это, как указано, это вполне разумно - вы можете захотеть удалить ограничение «where T : new()» из функции, так как оно больше не нужно; Вы даете ему всю информацию о том, как построить его в явном виде.

0 голосов
/ 24 апреля 2009

Нет, новый счет-фактура не был бы создан. Func - просто делегат, поэтому, когда вы создаете лямбду: () => new Invoice (), это практически то же самое, что делать это:

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

и передача делегата методу Create. Только после того, как вы на самом деле выполните делегат (функция «создать»), этот код действительно выполняется, и, таким образом, счет-фактура создается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...