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

#c#

#c#

Вопрос:

Есть ли способ заставить функцию использовать значение своего необязательного параметра? Например, скажем, у меня есть,

 public void myFunction(bool required, string optional = "This is optional") {...}
 

и я хочу сделать что-то вроде этого,

 string possiblyNull = null; // the result of another function
myFunction(true, possiblyNull ?? possiblyNull : optional)
 

Комментарии:

1. завершите вызов с помощью if...else

2. Я не думаю, что это возможно. Однако вы можете использовать классическое if (possiblyNull == null) myFunction(true); else myFunction(true, possiblyNull); .

3. Звучит как плохой дизайн.

Ответ №1:

Компилятор C # вставляет значение параметра по умолчанию всякий раз, когда аргументы не указаны на сайте вызова. И в вашем случае вы хотите вызвать свой метод с этим параметром. Итак, это невозможно, поэтому вы должны использовать эту проверку либо снаружи, либо внутри вашего метода. Если вы действительно хотите предотвратить использование if предложения при вызове вашего метода, вы можете изменить сигнатуру своего метода так:

 public void myFunction(bool required, string optional) 
{
    optional = optional ?? "This is optional";
    ...
}
 

А затем назовите это так:

 string possiblyNull = null; // the result of another function
myFunction(true, possiblyNull)
 

Ответ №2:

Вы не можете получить значение по умолчанию на сайте вызова. Вам нужно будет выполнить проверку вне вызова метода.

 string possiblyNull = null;
// ...
if (possiblyNull == null)
    myFunction(true);
else
    myFunction(true, possiblyNull);
 

Ответ №3:

Если вас беспокоит то, что

  • Вы не хотите просто устанавливать null значение по умолчанию, потому что это означало бы, что значение по умолчанию не будет отображаться в Intellisense, и вызывающий объект не увидит значение по умолчанию
  • Вы могли бы присвоить некоторому значению значение по умолчанию, а затем проверить null , и если оно равно null, заменить его значением по умолчанию, но это означало бы поместить значение по умолчанию в два места

Вы могли бы сделать это:

 private const string OptionalValue = "This is optional!";
public void myFunction(bool required, string optional = OptionalValue)
{
    optional = optional ?? OptionalValue;
}
 

Теперь вы получаете оба. Значение по умолчанию отображается в Intellisense и не повторяется.

Если это просто, что вы

  • возможно, потребуется передать нулевое значение
  • хотите получить значение по умолчанию
  • приходится делать это достаточно часто, чтобы это раздражало
  • не удается изменить исходный метод

вы могли бы создать расширение для класса, содержащего метод:

 public static class Extension
{
    // I can't think of how this function name would not be awkward.
    public static void MyFunctionThatReplacesNullWithDefault(
        this ClassWithOptionalMethod target, bool required, string optional = null)
    {
        if(optional == null)
            target.myFunction(required);
        else
            target.myFunction(required, optional);
    }
}
 

Ответ №4:

вы на месте, но вам нужно только удалить possiblyNull: пока вы передаете параметр методу, вы можете поступить следующим образом…

 public partial class MainWindow : Window
{
    private string optional = "Test";
    string possiblyNull = null;

    public MainWindow()
    {
        InitializeComponent();

       // here you can check null 
        myFunction(true, possiblyNull ?? optional);
       // Or 
        myFunction(true);

    }

    public  void myFunction(bool required, string optional = "This is optional")
    {
       MessageBox.Show(optional);
    }
}