2016-11-28 5 views
2

Исходя из языка программирования Swift, я привык к парадигме optional values. Есть много интересных аспектов этой языковой функции, но, в частности, мне интересно, имеет ли C# эквивалентный способ обработки, то есть значения возвращаемых функций nil. Возьмем, к примеру, простую функцию поиска, которая возвращает значение для данного ключа. В Swift, идиоматическим способом обработки недостающего ключа было бы просто вернуть nil. По сути, это мешает программистам бросать ошибки или выполнять обработку ошибок в подавляющем большинстве случаев, и это работает довольно элегантно. Аналогично, в Javascript я могу просто вернуть undefined.Идиоматические дополнительные значения возврата в C#

Из того, что я читал на MSDN, кажется, что программист на C# обычно предпочитает классические исключения в таких случаях и обрабатывает их в блоках try catch. Это вообще так? Было бы необычным, например, обернуть целочисленные возвращаемые значения в объекте Nullable и позволить вызывающей функции проверить, равно ли значение null? Каким будет ортодоксальный подход к этим ситуациям?

ответ

3

Исключения для исключительного сценария, а не для обычного потока программы. Наверное, мы на той же стороне.

Вам понадобится дополнительный возврат «типа», например, null, когда ваш метод проверяет наличие и извлекает ресурс. Возьмем, например, код, чтобы получить содержимое файла:

if (File.Exists(...)) 
{ 
    return false; 
} 

string contents = File.ReadAllText(...); 
... 
return true; 

Это не требует каких-либо исключений или null возвращаемые значения, и если файл будет удален между проверки и открытия файла, который затем можно было бы считать исключительный сценарий.

Однако, пытаясь получить сущность из базы данных, вы хотите совместить проверку доступности и выборку ресурса, так что требуется только один запрос. Есть много программистов, которые действительно возвращают null, но так как нет закона C#, сложно отслеживать, какой метод делает что.

Мне лично нравится стиль bool TryGet(int id, out Entity entity), который четко указывает, что он проверяет наличие и извлекает ресурс, если найден. Если вы предпочитаете возвращать null и хотите более подробно узнать, что делает ваша функция, вы можете использовать Entity GetOrDefault(int id) в качестве соглашения об именах. Некоторые базовые методы (то есть Linq) названы таким образом.

В случае возвращаемых типов значений возврат Nullable<>, возможно, уже указывает, к чему относится ваш метод. Чтобы закончить круг, C# 7 (насколько мне известно) добавит non-nullable reference types.

В конце концов, это зависит от вас (и вашей команды), какое соглашение вы предпочитаете.

+0

Благодаря нагрузкам. Я особенно ценю предложение TryGet, это само по себе делает меня намного яснее. –

0

В C# (пока еще нет опции), в F # есть тип параметра, который вы могли бы злоупотреблять на C#.

Смотрите здесь для подробного описания: Using F# option types in C#

или обратитесь к C.Evenhuis сообщению для C# способ сделать это.

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