Как разместить необязательные параметры в методах?

StackOverflow https://stackoverflow.com/questions/823967

  •  05-07-2019
  •  | 
  •  

Вопрос

Можно ли объявлять необязательные параметры в методах?

Например, в Delphi я могу сделать что-то вроде:

procedure Test(p1:integer;p2:integer;p3:integer = 2;p4:integer = 4)

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

Test(2,3); //p3 = 2,p4 = 4.
Test(2,3,4,5); //p3 = 4,p4 = 5;

Как это возможно в C#?

Это было полезно?

Решение

Боюсь, это невозможно в C# 1–3.Однако хорошая новость заключается в том, что, поскольку эта функция пользуется большим спросом (хотя наверняка есть те, кто предпочел бы ее не видеть), Microsoft наконец решила добавить ее в C# 4.

Синтаксис C# 4 выглядит следующим образом:

public static void SayHello(string s = "Hello World!")
{
    Console.WriteLine(s);
}

Использование:

SayHello(); // Prints "Hello World!"
SayHello("Hello."); // Prints "Hello."
SayHello(s: "Hello."); // Prints "Hello."

(В последнем примере используется именованный аргумент, который в данном случае не обязателен, но помогает при наличии нескольких необязательных параметров.)

Подробнее об этой теме вы можете прочитать на этот пост в блоге.

Другие советы

Вам также придется подождать C # 4.0 , который поддерживает необязательные параметры или использует стандартные механизмы перегрузки:

void Test(int p1, int p2, int p3, int p4)
{ }

void Test(int p1, int p2)
{
    Test(p1, p2, 2, 4);
}

Это будет возможно в C # 4.0, но до тех пор, пока он не будет выпущен, вы можете обойти его, создавая перегруженные версии вашего метода:

public void MyMethod( int a, int b, int c )
{
    ...
}

public void MyMethod( int a, int b)
{
   MyMethod(a, b, 4);
}

Вы можете использовать переменные аргументы

Используйте ключевое слово params.

void paramsExample(params int[] argsRest)
{

 if(argsRest.Length == 2) then...
 else if(argsRest.Length == 4) then...
 else error...

}
using System;
using System.Runtime.InteropServices;

   public static void SayHello([Optional][DefaultParameterValue("Hello Universe!")] string s)
   {
      Console.WriteLine(s);
   }

Сделанный!:)

Ты пока не можешь этого сделать. Я думаю, что это функция C # 4.0 .

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

Вы используете такие перегрузки

Test(int p1, int p2)
Test(int p1, int p2, int p3)

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

Test(int[] ps)

, а затем обработать данные.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top