Как использовать необязательные/именованные параметры в C# 4.0

На всю жизнь я, похоже, не могу понять, для чего используются необязательные параметры. Под этим я подразумеваю, в каких программах они будут использоваться и как? То же самое относится и к именованным параметрам, я просто не могу полностью понять ни одну из них. Я знаю, что необязательные параметры помогают снизить количество перегруженных методов. Вот об этом. Если бы кто-то мог помочь мне полностью понять, для чего они используются / как их использовать, я был бы очень признателен.


person Bill Fountaine    schedule 16.08.2011    source источник


Ответы (3)


Необязательные параметры — это то, как они называются: для необязательных параметров.

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

person Bernhard Kircher    schedule 16.08.2011

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

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

Надеюсь, это поможет некоторым.

person John Siladie    schedule 16.08.2011

Джон хорошо описывает использование необязательных параметров, но добавим объяснение именованных параметров: Если у вас много необязательных параметров, у вас есть два варианта, если вы хотите указать шестой: указать все более ранние необязательные параметры или использовать именованный параметр. параметр, чтобы просто установить этот конкретный параметр.

Пример:

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)

Последний из этих трех гораздо проще использовать и читать позже.

person Bobson    schedule 05.10.2012