Является ли передача пустым в метод - PullRequest
5 голосов
/ 31 марта 2011

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

В любом случае, мой вопрос

в некоторых случаях нормально использовать ноль в качестве параметра? например, метод может нуждаться в a и b для выполнения задачи, но в некоторых случаях он может нуждаться только в a. Разбирается ли null для b в тех нечетных случаях и проверяет (b == null), тогда мы знаем, как это называется?

Или я здесь в порядке?

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

Ответы [ 5 ]

8 голосов
/ 31 марта 2011

Совершенно нормально передавать null методам.Однако, если у вас есть csae, где вам может не потребоваться передавать переменную, рассмотрите перегрузку .

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

Лично я бы не используйте необязательные параметры - по этому вопросу много дискуссий из-за проблемы с методом в качестве Контракта , который выходит за рамки этого вопроса.


ОБНОВЛЕНИЕ

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

public void Foo(A a)
{
    Foo(a, null);
}
public void Foo(A a, B b)
{
        // .......
}

Это сообщит клиенту этот код:

  • Вы можете вызывать метод только с A
  • Вы можете вызывать метод с A и B

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

2 голосов
/ 31 марта 2011

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

Рассмотрим следующий сценарий:

public string DoSomething(string a, string b)
{
   // Returns something after a and b is processed.
}

В этом примере мы указываем, что a и b являются строками. Это объекты типа char [] или как бы вы ни хотели определить строку. Передача нулевого значения в этом методе вообще не имеет смысла, так как мы ожидаем строки. Ноль - это ничто - это не пустая строка - это просто пустота.

Причина, по которой я говорю, что я не думаю, что лучше отправлять null в метод, заключается в том, что для null никогда не используется. Это просто пустота, оставленная там как заполнитель чего-то, что не удалось создать. Поэтому вызов метода выше, как это:

DoSomething ("что угодно", ноль) не имеет никакого смысла вообще.

Мы можем утверждать, что могли бы сделать что-то вроде этого:

/// <summary>
/// Does something with string a or b
/// </summary>
/// <param name="a">The first string. If it's null, nothing is done with it</param>
/// <param name="b">The second string. If it's null, nothing is done with it</param>
/// <returns></returns>
public string DoSomething(string a, string b)
{
    // Returns something after a and b is processed.
}

Но это также делает код менее читабельным. Почему бы не сделать перегрузку DoSomething (строка a)? Или, может быть, рефакторинг метода полностью, поскольку он может что-то делать с a и null и по-прежнему возвращать допустимое значение. null не является допустимым значением, поэтому результат операции, включающей null в качестве аргумента, не должен возвращать действительное значение.

Это как использовать бесконечность в математике. В результате вы всегда получите бесконечность, если вы добавите / вычтите / умножите или поделите что-то с ним.

Ответственность

Это мои собственные мнения и ни в коем случае не «правильный» способ программирования. Но поскольку на этот вопрос нет правильного ответа, я буду практиковать свое право на свободу слова:)

1 голос
/ 31 марта 2011

Это вполне приемлемо. Если вы используете C # 4.0, вы также можете сделать параметр необязательным , чтобы вызывающей стороне не нужно было указывать значение по умолчанию.

1 голос
/ 31 марта 2011

Вы говорите: «Можно ли передать нулевое значение в качестве параметра методу?»

Если это так - да - это вполне приемлемо.

Однако в.Мир Net 4.0, вы можете рассмотреть возможность использования необязательных параметров, чтобы вам даже не нужно было передавать значение null, вы можете просто его пропустить.

В мире, предшествующем .Net 4.0, если этоРаспространенный сценарий передачи этого нуля в метод, вы можете создать перегрузку, которая вообще не принимает аргумент.

1 голос
/ 31 марта 2011

Если вы не используете некоторые параметры, вы можете использовать Перегрузка или Необязательные параметры в C # 4.0

...