Существует ли соглашение об упорядочении параметров перегрузки методов С#?

Существует ли какое-либо соглашение в C# (или любом объектно-ориентированном языке, поддерживающем перегрузку методов) для следующей ситуации?

Допустим, у меня есть метод foo:

public void Foo(int a){//does stuff}

Но на самом деле у меня есть 3 метода foo:

public void Foo(int a){}
public void Foo(int a, double b){}
public void Foo(float c, int a, double b){}

Существует ли соглашение, в котором указывается, имеет ли значение порядок параметров в перегруженном методе? Обратите внимание, что третий метод не имеет очевидной логической последовательности (a,b,c).


person Dream Lane    schedule 12.02.2013    source источник
comment
Если a требуется всегда, а b требуется, если предоставляется c, я бы сделал что-то вроде этого: public void Foo(int a, double? b = null, float? c = null) - предполагая, что ваша логика такая же.   -  person zimdanen    schedule 13.02.2013
comment
@zimdanen, нет причин делать параметры обнуляемыми   -  person Maxwe11    schedule 13.02.2013
comment
@Jupiter: Идея состоит в том, чтобы использовать это как альтернативу перегрузкам. Это хорошо работает, когда есть несколько независимых параметров — вы избегаете удвоения количества перегрузок каждый раз, когда добавляете новый. (По общему признанию, как только вы получите около 5 параметров, вам следует очень внимательно посмотреть, подходит ли этот дизайн в любом случае...)   -  person Jon Skeet    schedule 13.02.2013


Ответы (2)


Да, есть. Взгляните на https://msdn.microsoft.com/en-us/library/ms229029(v=vs.110).aspx

Будьте последовательны в порядке параметров в перегруженных элементах. Параметры с одинаковыми именами должны отображаться в одной и той же позиции во всех перегрузках.

person delixfe    schedule 12.02.2013
comment
Кроме того, вы должны перегружать методы только для целей предоставления значений по умолчанию общему методу. В противном случае методы не связаны достаточно сильно, чтобы иметь одно и то же имя, и им должны быть присвоены разные имена. - person Matthew Watson; 13.02.2013

Хотя не требуется поддерживать определенный порядок, обычно рекомендуется это делать для удобочитаемости. Однако порядок параметров имеет значение для подписи метода. Например,

public void DoStuff(int a, bool b, string c)
{

}

public void DoStuff(bool b, string c, int a)
{

}

действителен и прекрасно компилируется, несмотря на то, что количество параметров и даже их имена совпадают.

Обновление: я бы не рекомендовал делать это таким образом. Это может привести к путанице. Я просто сказал, что это технически допустимо.

person sparky68967    schedule 12.02.2013
comment
Хотя это действительно так, это может полностью сбить с толку тех, кто использует этот метод. - person JG in SD; 13.02.2013
comment
Именно поэтому я сказал, что поддерживать порядок для удобочитаемости — хорошая идея. Я бы лично так делать не стал. Я просто указал для записи, что порядок параметров действительно влияет на сигнатуру метода. Если бы это было не так, компилятору было бы сложнее различать перегрузки. - person sparky68967; 13.02.2013