Использование именованные и необязательные параметры в C#

Дополнительные параметры - одно из немногих дополнений в последних версиях Visual Studio, которые действительно полезны. Обычно я пытаюсь опубликовать примеры в более старой версии C#, потому что кому-то легче переносить старый пример в более новую версию, чем переносить недавний пример в более старую версию. Большая часть языка C# осталась неизменной в течение длительного времени, так что это не проблема. Тем не менее, C# включает в себя несколько полезных функций, которые были добавлены относительно недавно.

Именованные и необязательные параметры были добавлены с C# 2010.

Именованные аргументы позволяют использовать имена параметров при вызове метода. Например, предположим, что класс Person имеет конструктор, который принимает параметры: name, address, email, sms_phone, voice_phone и fax. Тогда ваш код мог бы вызвать конструктор следующим образом:

Person person = new Person(name: "Rod Stephens",
    email: "RodStephens@CSharpHelper.com",
    address: "", sms_phone: "", voice_phone: "", fax: "")

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

В то время как именованные аргументы дают некоторую выгоду, они действительно не так уж увлекательны, пока вы не объедините их с необязательными параметрами. Чтобы сделать параметр необязательным, следуйте ему со значением по умолчанию в объявлении метода. Например, в следующем коде показан конструктор класса Person с адресом, email, sms_phone, voice_phone и fax необязательно.

public Person(string name, string address = "", string email = "",
    string sms_phone = "", string voice_phone = "", string fax = "")
{
    Name = name;
    Address = address;
    Email = email;
    SmsPhone = sms_phone;
    VoicePhone = voice_phone;
    Fax = fax;
}

Теперь программа может использовать следующий код для создания нового объекта Person, указывая только аргумент name (который требуется, поскольку он не имеет значения по умолчанию в объявлении конструктора) и аргумент email.

Person person = new Person(name: "Rod Stephens",
    email: "RodStephens@CSharpHelper.com")

Это не только удобно, но и дает вам новые возможности, которых у вас раньше не было. Предположим, вы хотите, чтобы конструктор требовал name, но не других параметров. Без дополнительных параметров вы можете создать несколько перегруженных версий конструктора, который принимает (name), который принимает (name, address), который принимает (имя, адрес, адрес электронной почты) и т. д.

Это позволит вам создавать объекты Person, опуская некоторые аргументы, но это не позволит вам опустить их в любой комбинации. Например, вы не можете указать name и email без address. Даже если вы захотели сделать перегруженные конструкторы для всех 32 возможных комбинаций (если я правильно подсчитал), компилятор не смог бы рассказать обо всех версиях, потому что все аргументы являются строками.

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

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

public Person(string name)
    : this(name, "????", "????", "????", "????", "????")
{
}

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

Другой подход состоял бы в том, чтобы позволить вызывающему коду передавать null или какое-либо другое значение для «опускать» аргументы, а затем заставлять код проверять каждый, чтобы увидеть, является ли это null как в следующем коде.

public Person(string name, string address, string email,
    string sms_phone, string voice_phone, string fax)
{
    Name = name;

    if (address == null) Address = "????";
    else Address = address;

    if (email == null) Email = "????";
    else Email = email;

    if (sms_phone == null) SmsPhone = "????";
    else SmsPhone = sms_phone;

    if (voice_phone == null) VoicePhone = "????";
    else VoicePhone = voice_phone;

    if (fax == null) Fax = "????";
    else Fax = fax;
}

Это намного более громоздко и неэффективно, чем использование названных и необязательных параметров.

Источник: http://csharphelper.com/blog/2017/10/use-named-and-optional-parameters-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector