2013-06-18 3 views
2

void Поскольку подпись используется для обозначения того, что метод ничего, такого рода методы не возвращают, я пишу это следующим образом:недействительным против объекта возвращения нулевой

private void MyMethod() 
{ 
    // Body of the method. 
} 

Однако во многих местах, у меня есть видел методы, которые не предназначены для возвращения ничего, написанные следующим образом:

private object MyMethod() 
{ 
    // Body of the method 

    return null; 
} 

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

+4

Есть ли у вас какие-либо примеры этих мест в общественном коде? Если это все внутреннее, возможно, это всего лишь один разработчик, который имеет странные понятия о чистом API? –

+0

Возвращается ли тело метода? Он не предназначен для возвращения ничего, как пустота. Он намерен вернуть объект, который может быть нулевым, когда это необходимо. Не следуйте за вторым, если это не ваше намерение - не путайте вещи. – ChiefTwoPencils

+0

@JonSkeet например [здесь] (http://jesseliberty.com/2011/01/09/passing-parameters-with-behaviors-in-mvvm-light-for-windows-phone/) и во многих других примерах из его – anderZubi

ответ

7

Второй, написанный как есть, с одним возвратом, как правило, бесполезен, он немного снизит производительность и усложнит использование API. Существуют, однако, небольшие изменения, где это может быть полезно, например, как:

  • Есть несколько точек возврата, и это является окончательным указывает на отсутствие объекта. Например, вы можете возвращать экземпляр объекта обычно, но по какой-то причине у вас его нет на этот раз. (Пример 1)

  • Если метод был отмечен по-разному, скажем public virtual, то реализация по умолчанию или переопределенная может не вернуть значение, но другие могут. (Пример 2)

Пример 1:

public object MyMethod() 
{ 
    if(myObj != null) 
     return myObj.Result(); 

    return null; 
} 

Пример 2:

// Derived Class 
protected override object MyMethod() 
{ 
    // We don't need a result from here so we don't have an implementation of 
    // anything, but the base implementation doesn't make sense. This however 
    // could be breaking SOLID principles. 
    return null; 
} 

// Base Class 
protected virtual object MyMethod() 
{ 
    return new MyObj(); 
} 
0

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

+0

Первый может быть изменен для использования параметров 'out' и по-прежнему возвращает' void'. –

0

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

Даже если вы переопределяете класс, который возвращает что-то значимое, вы должны рассмотреть возможность использования шаблона проекта NullObject, чтобы вы не нарушили существующие API-интерфейсы и не выполнили LSP. Возвращение null создает избыточность с дополнительной логикой проверки нули и является нелогичным.

0

Второй является плохой практикой. Нам не нужно сообщать компилятору проверить тип возврата. Возможно, это сделано для будущих изменений.

1

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

0

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

0

второй метод сам возвращает что-то в вашем случае его null. Я не чувствую это как метод, не возвращающий значение.если метод не возвращается лучше для практики с void

0

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

NULL возвращающая бесполезно и вводит в заблуждение ...

Смежные вопросы