2009-04-16 2 views
4

Есть ли лучший способ требовать, чтобы аргумент не был пустым в методе? Я продолжаю проверять, имеет ли какой-либо из аргументов мой метод значение null, как показано ниже. Но мне интересно, есть ли лучший способ.Есть ли способ потребовать, чтобы аргумент, предоставленный методу, не был нулевым?

public void MyMethod(string a, int b) 
{ 
    if(a==null){throw new ArgumentNullException("a");} 
    if(b==null){throw new ArgumentNullException("b");} 

    //more stuff here 
} 
+0

Это почти точный дубликат: http://stackoverflow.com/questions/718630/not-nullable-types – BenAlabaster

ответ

1

Нет другого лучшего способа. Так тонна библиотек Microsoft справляется с ситуацией.

Вы всегда можете использовать метод расширения, чтобы сделать его немного яснее.

static IsNullArgument(this Object o, string arg) 
{ 
    if (o == null) 
     throw ArgumentNullException(arg); 
} 
1

Мне лично нравится CuttingEdge.Conditions. Он прост в использовании и делает его более читаемым.

1

Это одна из немногих областей, где я думаю, C# пошел назад от C++.

В C++, вы можете написать

void foo(Bar& bar) { /*...*/ } 

на достаточно четко указать, как компилятор и другие люди, которые foo взяли реальный экземпляр Bar. Да, можно - с усилием - передать foo пустую ссылку, но это не совсем легальный C++.

Ваше единственное «решение» (своего рода) в C#, чтобы сделать ваши class эс struct s вместо этого, как типы значений в .NET не может быть null (в вашем примере, б никогда не может быть null потому что это System.Int32). Вызов bar() не будет компилироваться:

class A { } 
    struct B { } 

    static void foo(A a) { } 
    static void bar(B b) { } 

    static void Main(string[] args) 
    { 
     foo(null); 
     bar(null); 
    } 

Это, конечно, кажется, что это было бы хорошо для C#, чтобы это сделали (много) более трудно иметь null ссылки; Например, F # не имеет типов с нулевым значением.

Для некоторых интересных комментариев, относящихся к этому вопросу, читайте Null References: The Billion Dollar Mistake (и комментарии).


Edit: февраля 2013 сноска из Eric Lippert говорит:»... это просто так случилось, что, когда C# была впервые реализована она была всегда-NULLABLE ссылочные типы, ..., кажется вероятным, что Nullable<T> может иметь были реализованы для работы с любым типом, а ссылочные типы по умолчанию были бы не нулевыми. Мы могли бы иметь систему типов, где Nullable<string> был единственным законным способом представления «строки, которая может быть null». ... »