На всю жизнь я, похоже, не могу понять, для чего используются необязательные параметры. Под этим я подразумеваю, в каких программах они будут использоваться и как? То же самое относится и к именованным параметрам, я просто не могу полностью понять ни одну из них. Я знаю, что необязательные параметры помогают снизить количество перегруженных методов. Вот об этом. Если бы кто-то мог помочь мне полностью понять, для чего они используются / как их использовать, я был бы очень признателен.
Как использовать необязательные/именованные параметры в C# 4.0
Ответы (3)
Необязательные параметры — это то, как они называются: для необязательных параметров.
Единственное, что очень важно, это то, что значения параметров по умолчанию компилируются в вызывающий код. Это означает, что если вы измените значение параметра по умолчанию, вам также придется перекомпилировать вызывающие сборки, иначе они по-прежнему будут использовать старое значение по умолчанию.
Обычно я использую необязательные параметры в методе, который могут вызывать многие разные объекты. Например, если у вас есть приложение, которое обрабатывает поиск, у вас могут быть параметры
List<string> SearchStuff(string searchString, Date startDate, Date endDate);
Позже вы можете начать думать о нумерации страниц и захотеть установить по умолчанию 25 результатов, но при этом позволить вызывающей стороне определить это и использовать необязательный параметр, чтобы помочь вам, например:
List<string> SearchStuff(string searchString, Date startDate, Date endDate, int pageSize = 25);
Размер страницы, которую вы можете видеть, является необязательным, установив для него значение. Вызывающий может передать pageSize, если хочет, или может опустить все вместе, и будет использоваться значение по умолчанию.
Что касается именованных параметров, я не уверен, что использовал их в C# (или вообще можете ли вы). Однако в Objective-c они используются постоянно:
- (NSString *) getThisFromInteger:(NSInteger)myInteger;
и при вызове метода вы фактически вводите именованные параметры при его вызове
[self getThisFromInteger: 24];
в отличие от С#, на который это больше похоже
self.getThis(24);
Надеюсь, это поможет некоторым.
Джон хорошо описывает использование необязательных параметров, но добавим объяснение именованных параметров: Если у вас много необязательных параметров, у вас есть два варианта, если вы хотите указать шестой: указать все более ранние необязательные параметры или использовать именованный параметр. параметр, чтобы просто установить этот конкретный параметр.
Пример:
public static void sendEmail(string to, string subject, string body, string[] attachmentFiles = null, bool isHTML = false, string onBehalfOf = "", MailPriority priority = MailPriority.Normal, string BCCAddress = null, bool isWeb = false)
Если я хочу отправить электронное письмо с высоким приоритетом, мой выбор:
// If we didn't have optional parameters
sendEmail("[email protected]", "Important!", "Something broke - fix it!", null, false, "", MailPriority.High, null, false)
// If we didn't have named parameters
sendEmail("[email protected]", "Important!", "Something broke - fix it!", null, false, "", MailPriority.High)
// Using both optional and named parameters to full advantage.
sendEmail("[email protected]", "Important!", "Something broke - fix it!", priority: MailPriority.High)
Последний из этих трех гораздо проще использовать и читать позже.