Альтернативы необязательным (VB) параметрам в C #? - PullRequest
0 голосов
/ 22 августа 2011

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

void Person(string name, int age)
void Person(string name)

и

void Person(string name, int age = 30)

Моя проблема заключается в том, что при вызове компонентов C # из VB6 перегруженные методы имеют тенденцию изменять имя, например, "Person (имя строки), Person _1 (имя строки, int age)" и т. Д., И переменные с Значения по умолчанию не могут использоваться при выводе переменных.

НО как насчет

void Person(string name, [Optional] int age)

??

Может кто-нибудь объяснить мне, как это работает, и могу ли я использовать его для симуляции необязательных переменных в VB6?

Ответы [ 4 ]

6 голосов
/ 22 августа 2011

Начиная с C # 4, существует необязательная поддержка параметров:

public void MyMethod(bool arg = false)
{

}

Хотя не уверен, как это будет вызываться из VB6.

Другой возможный способ - заключить аргументы в другойclass:

public class PersonSettings
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public Person(PersonSettings settings)
{

}

Затем у вас есть один аргумент, и вы можете по умолчанию использовать значения в классе PersonSettings.

Конечно, предлагаемое вами использование OptionalAttribute также должно работать длявы.Хотя я думаю, что вам нужно избавиться от перегруженного метода или использовать интерфейс, чтобы предоставить COM только один из этих методов:

http://social.msdn.microsoft.com/Forums/en/clr/thread/048c0104-20ed-49af-a221-ddadb081989e

3 голосов
/ 22 августа 2011

C # 4.0 действительно имеет дополнительные параметры:

public void MyMethod(string optionalParameter = "optional")
{

}
0 голосов
/ 26 августа 2011

Я разобрался с помощью OptionalAttribute.Я думаю, что это было лучшее решение, потому что все другие решения были бы трудоемкими и всеобъемлющими.Чтобы проверить, был ли передан необязательный атрибут, используйте: if(attr_optional != Type.Missing) (требуется, чтобы необязательный атрибут имел тип object)

0 голосов
/ 22 августа 2011

Вы можете сделать это:

void Person(string name, int? age)
{
    if (!age.hasValue)
    {
        Console.WriteLine("The nullable integer parameter age wasn't provided with a value ..");
    }
}

Вы должны будете отправить "null" вместо int, хотя.Тара не сработает.

...