2016-07-01 2 views
0

я наткнулся на пример, подобный следующему:Необязательные аргументы или именованные аргументы, инициализированные нулем? C#

public Dictionary<string, object> generate(
    string elementId, 
    Dictionary<string, object> additionalAttributes = null) 
{ 
.... method body 
} 

Почему словарь передается в качестве параметра инициироваться в нуль? Я не видел такой конструкции. Нужно ли что-то делать с дополнительным параметром?

+2

«Нужно ли что-то делать с необязательным параметром» - правильно. Затем вызывающий может передать «elementId» и не должен явно указывать «null» для второго параметра. – Igor

+0

См. Также: [необязательные аргументы] (https://msdn.microsoft.com/library/dd264739.aspx) – Corak

+0

примечание стороны: 'IDictionary <строка, объект> дополнительные атрибуты = нуль (pleasem notice' I' - интерфейс, т.е. любой класс, который может использоваться как словарь) будет лучшим решением. –

ответ

1

я использую это, чтобы сэкономить время записи функции перегрузки. Например, вместо того, чтобы перегружать две функции:

void SameFunctionName(Parameter1){ .. } 
void SameFunctionName(Parameter1, Parameter2){ .. } 
// maybe additional function body with three parameters .. etc 

Я просто пишу один, используя этот случай:

void MyFunction(Parameter1, Parameter2 = null){ .. } 

Итак, небольшое, если заявление внутри моей функции будет проверить, если Parameter2 является null или нет, затем принимать решения. Все в одном функциональном теле.

и вызов функции для этого случая будет работать в обоих случаях:

MyFunction(Parameter1); // This is a valid syntax 
MyFunction(Parameter1, Parameter2); // This is a valid syntax 
3

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

Ref: MSDN

0

Необязательный параметр, такой как тот, который вы используете в вашем примере, может быть установлен только для постоянных значений, это означает, что вы не можете используйте любые ссылочные значения, то есть словарь, поскольку такой нуль является единственным допустимым значением, вы можете инициализировать необязательную переменную типа Dictionary to, если метод использовал тип значения, такой как int или string, тогда значение может быть инициализировано для необязательный параметр в противном случае он должен быть пустым

+0

'string' не является типом значения в C#. Ссылка: [StackOverflow] (http://stackoverflow.com/questions/1069155/is-string-a-value-type-or-a-reference-type). –

+0

@Dan, как вы можете включить гиперссылки в свой комментарий? –

+0

@FirstStep - StackOverflow поддерживает Markdown. Ссылка: [StackOverflow] (http://stackoverflow.com/editing-help) #Meta –

0

Y эс это экономит время, если вы используете перегрузку функции Например, это можно избежать

Void Main() 
     { 
      fun1(11); 
      fun1(12,13); 
     } 

    public fun1(int i) 
    { 
    Print(i); 
    } 

    public fun1(int i ,int j) 
    { 
    Print(i+j); 
    } 

Это можно избежать, приведенный ниже код и он также экономит время и пространство

Void Main() 
{ 
fun1(12); 
} 

public fun1(int i ,int j = NULL) 
{ 
if(j==NULL) 
    Print(i); 
else 
Print(i+j); 
} 
Смежные вопросы