Кратък отговор:НЕ, НЯМА
Внушение:
Без сложен код или включване на библиотеки на трети страни в микса, мисля, че трябва да имате предвид следните точки, когато проектирате своя код:
- Какво трябва да прави този код за диапазона от аргументи, които трябва да бъдат предоставени?
- Този, който извиква тази част от кода, знае ли за възможните резултати от споменатия метод?
Първото нещо, което можете да направите, е да документирате методите.
Във вашия пример изглежда, че getArg
може да върне null
. Така че добър подход може да бъде:
/// <summary>
/// Describe your method here
/// </summary>
/// <returns>Describe what it returns</returns>
/// <remarks>May return NULL if (explain why)</remarks>
public TypeName getArg()
{
//do your code here
}
страхотно И така, сега всеки, който възнамерява да използва метода getArg()
, ще има добро описание на това какво прави методът и, хей, той дори може да ви даде null
екземпляр във връщането.
Можете да направите същото с foo()
. Сега не е ясно дали foo()
трябва да работи или не, ако null
е предадено в параметъра. Но от вашето описание на функционалността изглежда, че ще счупи приложението, ако е така.
Ако случаят е такъв, вероятно искате да накарате foo()
да хвърля изключение.
Така че добър подход би бил:
/// <summary>
/// Describe your method here
/// </summary>
/// <param name="args">Describe the argument here</param>
/// <exception cref="System.ArgumentNullException">When args is null</exception>
public void foo(TypeName args)
{
if (args == null)
throw new ArgumentNullException(nameof(args));
//do your code here
}
Почти стигнахме.
Сега, частта от кода, която свързва всичко...
Знаете от предоставената (от вас) документация, че:
args
може да бъде null
foo()
хвърля изключение, ако args
е null
И от документацията знаете, че искате да избягвате try catch
колкото можете поради производителността.
Предоставеният от вас код трябва да е окончателният код :)
var args = getArgs();
if (args != null)
foo(args);
Но отново. Това е просто използване на стандартен .net код.
Така или иначе, документирането на вашия код винаги е желателно, давайки контекст и предотвратявайки грешки поради липса на знания за това как да използвате кода :)
person
DesertFox
schedule
01.05.2017
null
като параметър. Например, вашиятfoo
метод трябва да има нещо в горната част по линията наif (arg == null) return;
, ако не трябва да работи, когато му бъде подадена нулева стойност. - person Abion47   schedule 01.05.2017?
, ако извикватеfoo
наarg
. т.е. ако сте направилиarg?.foo()
, тогаваfoo
ще бъде извикано само акоarg
не е нула. - person Abion47   schedule 01.05.2017arg
е null. напр.foo(arg == null ? new ArgObject() : arg);
- person Abion47   schedule 01.05.2017null
като параметър - не съм съгласен. Предаването на не-null
препратка може много добре да бъде предпоставка за това извикването да има смисъл. Катоvoid
метод, той може да провери своя аргумент и незабавно да се върне, ако аргументът еnull
, но не-void
методите не могат непременно да направят това (тъй като стойността по подразбиране не е задължително да има смисъл). Вместо това във всеки случай трябва да се хвърлиArgumentNullException
, в който момент очевидно отговорността е за извикване на код ... - person O. R. Mapper   schedule 01.05.2017null
. - person O. R. Mapper   schedule 01.05.2017null
стойности. Знам, че има много примери за методи, които връщатnull
, за да покажат някакъв статус, но обикновено това трябва да са изключителни случаи и да се третират чрез хвърляне на изключение. Ето защо вярвам, че този тип сценарии наистина не трябва да се появяват много на първо място. Да, Ханс предполага; но всички ние трябва, като се има предвид липсата на контекст, и бележката му е разумна. - person Peter Duniho   schedule 01.05.2017null
като част от нормалната си работа, тогава не е нужно да проверявате резултат заnull
преди да го прехвърлите на нещо друго, като по този начин премахнете необходимостта от нулеви проверки. Например, едно нещо, което наистина харесвам в C# срещу C++ е, чеnew
винаги връща стойности, различни отnull
; единственият начин да не може е да бъде хвърлено изключение. - person Peter Duniho   schedule 01.05.2017getArgs
илиfoo
, използването на троичен код в полето за параметър е най-близкото до премахване на нулева проверка изцяло. - person Abion47   schedule 01.05.2017null
, предварителна проверка, изпълнена от извикващия код е разумна. Фактът, че се хвърля изключение означава, че не извиквайте този метод, освен ако нямате нещо различно отnull
за предаване. И проверката чрез извикващия код означава, че ако имамarg
, трябва да извикам метода на него, но ако нямамarg
, нищо не трябва да се случва. - person O. R. Mapper   schedule 01.05.2017