2013-09-03 4 views
2

В C#, что-то вроде этого я могу написать:C# анонимный метод в выражении if?

if (
    (
      try { 
       ... 
       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
    ) == true 
    ) 
{ 
... 
} 

без необходимости перемещать все мои попытки/поймать блок внутри новой функции

- редактировать -

OK. Я завершу свой вопрос. (и, возможно, немного ответит). То, что должно быть в try/catch, является своего рода XmlDocument.TryLoad (поток) (например, есть int.tryParse (строка)). Мне понадобится это только один раз, поэтому я хотел бы избежать дополнительных функций. Так что мой код будет что-то вроде

  try { 
       new XmlDocument().Load(foo); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 

Я просто хочу знать, если это пойдет не так. Меня не волнует причина (поток пустой, плохое кодирование).

Есть много интересных ответов, но я думаю, что более подходящим для меня является создание метода расширения для xmlDocument. Это будет более чистым (и многоразовым и более простым для чтения), чем попытка заставить анонимный метод в моем заявлении

+2

В первую очередь, я стараюсь избегать использования 'попробовать/catch' нравится это. Вы ловите каждое исключение, которое будет выброшено. Игнорирование исключений может легко сделать отладочный кошмар. – Leri

+0

На самом деле мне все равно, какая именно причина его ловит. В следующем случае я выйду из строя, если возвращаемое значение не было истинным. – frenchone

ответ

10

Вы не можете использовать этот точный синтаксис, нет. Вы могли писать:

Func<bool> func =() => 
{ 
    // Code in here 
}; 

if (func()) 
{ 
    ... 
} 

... но лично я бы извлечь его в отдельный метод. Это, вероятно, будет значительно более читаемым - и, возможно, также легче протестировать.

+0

Перемещение на отдельный метод может сломать инкапсуляцию. Также он отделяет код, тогда как 'Func ' будет содержать код в чистоте. Я бы предпочел «Func » для удобства чтения и обслуживания. – Enigmativity

+1

@ Энигматичность: как он может разрушить инкапсуляцию в пределах одного класса? Разделение кода было бы * желанием * здесь, так что каждый метод отвечал только за один аспект, разделяя тестирование на ответ.Если в тестировании достаточно кода, чтобы в первом случае было целесообразно использовать этот подход, то, вероятно, достаточно кода, чтобы его можно было разделить на метод IMO. –

+0

Методы должны обрабатывать только одно, а цель написания чистого кода должна максимально сократить эти методы до минимума. Лично я нахожу, что дядя Боб предлагает самые четкие средства написания кода. – ZeroPhase

0

От C# Спецификация языка 5.0 (8.7.1):

если заявление выбирает заявление для выполнения на основе значения из логического выражения.

Но ваш код:

(
try { return true; } 
catch (Exception ex) { return false; } 
) == true 

Разве это не boolean expression но statement.

+0

Итак, мой вопрос: «Можно ли обернуть некоторый код (или оператор) таким образом, чтобы он имитировал логическое выражение (не делая его функцией)? – frenchone

+0

Не то, чтобы я знал. – haim770

1

Не то, что я рекомендовал бы ловить исключения, как это тоже, но:

public static bool Try(Action action) 
    { 
     try 
     { 
      action(); 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 

Примеры использования

 int x; 
     int a = 0; 
     int b = 1; 
     if (Try(() => x = a/b)) 
     { 

     } 

     if (Try(OtherMethod)) 
     { 

     } 

     if (Try(OtherMethod(1,2))) 
     { 

     } 
0
if (((Func<bool>)(() => 
{ 
    // Multi-statement evaluation 
    DateTime dt = DateTime.UtcNow; 

    if (dt.Hour <= 12) 
     return true; 
    else 
     return false; 
}))()) 
{ 
    Console.WriteLine("Early"); 
} 
else 
{ 
    Console.WriteLine("Late"); 
} 
+0

Jon опубликовал тот же подход более 3 лет назад ... – Servy

+0

Ответ Джона был анонимным методом. Mine является встроенным многопозиционным заявлением, если это то, о чем просил frenchone. – RichardV

+0

Ответ Джонса заключался в использовании анонимного метода. Ваш ответ заключался в использовании анонимного метода. Независимо от того, хранится ли этот анонимный метод в локальной переменной, на самом деле это не очень большая разница, безусловно, изменение, которое любой читатель может сделать, если они действительно хотят. Что касается вопроса, он спрашивает, как написать код, не создавая новый метод [named]. Вы оба это делаете. – Servy

Смежные вопросы