Чи можу я вказати значення за замовчуванням для параметрів або необов’язкових параметрів у функціях C #?


77

Чи можу я вказати параметри за замовчуванням у C #?

У C:

void fun(int i = 1)
{
    printf("%d", i);
}

Чи можемо ми задати параметрам значення за замовчуванням? Чи можливо це в C #? Якщо так, чи можемо ми уникнути перевантаження функцій?

Завжди поганою практикою є додавання необов’язкового параметра до існуючої функції. Якщо ви працюєте над проектом, який повинен посилатися на клас, що має функцію, і ми змінили параметр із необов’язковим значенням, це може викликати виняток часу виконання, що метод не знайдений.

Це тому, що ми будемо вважати, що якщо ми додамо додаткове необов’язкове значення, не буде потрібно змінити код, якщо функція використовується в багатьох місцях.

function Add(int a, int b);

Це буде викликано таким чином:

Add(10, 10);

Але якщо ми додамо такий необов’язковий параметр,

function Add(int a, int b, int c = 0);

тоді компілятор очікує

Add(10, 10, 0);

Насправді ми дзвонимо так, Add(10, 10)і ця функція не буде доступна в цьому класі і спричиняє виняток часу виконання.

Це відбувається під час додавання нового параметра до функції, яка викликається у багатьох місцях, і я не впевнений, що це відбуватиметься кожного разу. Але я пропоную вам перевантажити функцію.

Завжди нам потрібно перевантажувати метод, який має необов’язковий параметр. Крім того, якщо ви працюєте з функціями, що мають більше одного необов'язкового параметра, тоді добре передавати значення, використовуючи ім'я параметра.

function Add(int a, int b, int c = 0);

Завжди добре викликати цю функцію, використовуючи такий спосіб.

Add(10, 20, c:30);

1
@Vyas зараз C # 4.0 це можливо
kbvishnu


@nawfal просив довгу спину, і під час роботи з необов'язковим параметром у мене виникли деякі проблеми. Тож я оновив питання.
kbvishnu

1
@VeeKayBee це правильно, але чи виникало у вас там питання (в редагуванні)? Якщо ви хочете зробити це, чому б не відповісти на це у відповідній темі (можливо, навіть цій)?
nawfal

@nawfal дякую за вашу пропозицію. я
оновлю

Відповіді:


79

Саме так ви робите це в C #, але функція була вперше додана в .NET 4.0


5
Це можливо використовувати в .NET 3.5
Marek Kwiendacz

Visual Studio 2010+має msbuildз multitargetingфункцією ( msdn.microsoft.com/en-us/library/vstudio/… ). Він може використовувати цільові пакети для .NET 4.0створення ваших необов’язкових параметрів у купу перевантажених методів.
dbardakov

як щодо вбудованих методів (Func, Action, делегат)?
EricG


27

Це можливо лише з C # 4.0

Однак, коли ви використовуєте версію C # до версії 4.0, ви можете обійти це, використовуючи перевантажені методи:

public void Func( int i, int j )
{
    Console.WriteLine (String.Format ("i = {0}, j = {1}", i, j));
}

public void Func( int i )
{
    Func (i, 4);
}

public void Func ()
{
    Func (5);
}

(Або ви можете перейти на курс C # 4.0).


5

Так, але вам потрібно буде використовувати .NET 3.5 та C # 4.0, щоб отримати цю функціональність.

Ця сторінка MSDN містить більше інформації.


1

Ця функціональність доступна на C # 4.0 - вона була представлена ​​у Visual Studio 2010. І ви можете використовувати її у проекті для .NET 3.5. Тож немає необхідності оновлювати старі проекти в .NET 3.5 до .NET 4.0.

Вам потрібно просто використовувати Visual Studio 2010, але пам’ятайте, що він повинен скомпілюватися до мовної версії за замовчуванням (встановіть його у Властивості проекту-> Buid-> Advanced ...)

Ця сторінка MSDN містить більше інформації про необов’язкові параметри у VS 2010.


0

Це особливість C # 4.0, але це було неможливо без використання перевантаження функції до цієї версії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.