Передача значений в методы - PullRequest
2 голосов
/ 14 октября 2011

Допустим, у вас есть:

public void TestFishsticks()
{ 
   var fishes = GetFishstick(false);
}

private object GetFishstick(bool getBigFishes)
{
  return FishsticksManager().GetFishsticks(getBigFishes);
}

против

public void TestFishsticks()
{ 
   var fishes = GetFishstick(getBigFishes: false);
}

private object GetFishstick(bool getBigFishes)
{
  return FishsticksManager().GetFishsticks(getBigFishes);
}

Есть ли для этого какая-либо причина?

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

Ответы [ 5 ]

7 голосов
/ 14 октября 2011

Именованные аргументы в основном были введены в C # 4.0 для улучшения читабельности.Вам на самом деле не нужно их использовать.Некоторые люди предпочитают использовать их в некоторых случаях, другие нет.Это в основном зависит от вас.

Это может значительно улучшить читабельность, особенно если вы не хотите запускать intellisense при постоянном чтении кода (или, что еще хуже, при просмотре распечаток).Сравните эти два значения:

CalculateBMI(123, 178); // What do the numbers mean?
CalculateBMI(weightInKg: 123, heightInCentimeters: 178); // Clearer IMHO.

Однако совместное использование именованных аргументов и необязательных параметров позволяет указать аргументы только для нескольких параметров из списка необязательных параметров.Эта возможность, например, значительно облегчает вызовы к интерфейсам COM.

4 голосов
/ 14 октября 2011

Кажется, нет причины для одного над другим

Несколько веских причин для использования именованных аргументов:

Код легче понять с первого взгляда, особенно когда аргумент равен false или null или 0 или "" и так далее.

Именованные аргументы хорошо работают с необязательными аргументами. Метод, который принимает дюжину аргументов, может иметь упрощенный сайт вызова, если вам просто нужно указать несколько из них.

Код надежен перед лицом изменения порядка рефакторинга на ранней стадии разработки. Если вы вносите решающее изменение перед выпуском клиентам, измените:

void M(int width, int height)

до

void M(int height, int width)

тогда весь код, который сказал

M(height: 123, width: 456);

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

M(123, 456);

нужно будет обновить.

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

M(int top, int bottom, int left, int right)

к этому методу:

M(int top, int height, int left, int width)

очевидное переломное изменение. Код

M(top: 10, bottom: 20, left: 30, width: 40)

выдаст ошибку при изменении метода. Этот код не будет, и изменяет поведение:

M(10, 20, 30, 40);
2 голосов
/ 14 октября 2011

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

public bool GetFishstick(int x = 1, int y = 2, int z = 3)
{
...
}

// Called as such: The other optional parameters (x,y) are supplied automatically.
var fish = GetFishstick(z: 10);

// Compare to the alternative where you have to provide them.
var fish = GetFishstick(1,2,10);

Следует также отметить, что intellisense не всегда доступен.Например, чтение кода в средстве просмотра различий, таком как WinMerge, или иногда в блокноте.Читаемость все еще сохраняется благодаря использованию именованных параметров, хотя intellisense нет.

1 голос
/ 14 октября 2011

Именованные аргументы помогают нам не запоминать и не искать порядок параметров в списках параметров вызываемых методов. Параметр для каждого аргумента может быть указан по имени параметра. Это не имеет смысла (лично), так как у вас есть один параметр. В случае, если у вас есть несколько, то это поможет изменить порядок или быструю читаемость (если вам не нужен метод intellisense)

1 голос
/ 14 октября 2011

Здесь вы используете именованные аргументы .

Они могут значительно улучшить читаемость. Особенно для логических значений.

Рассмотрим:

var date = GetDate(2011, 2, 3);  // 'feb 3' or '2nd of march' ? 

Если вместо этого вы читаете

var date = GetDate(year:2011, month:2, day:3); 

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

var date = GetDate(month:2, day:3, year:2011);  // same date.

Именованные аргументы доступны только в C # 4 и далее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...