C'est l'un des rares domaines où je pense que C# est allé en arrière de C++.
En C++, vous pouvez écrire
void foo(Bar& bar) { /*...*/ }
pour indiquer très clairement à la fois le compilateur et les autres humains qui foo
une instance réelle a pris de Bar
. Oui, il est possible - avec effort - de passer une référence nulle à foo
mais ce n'est pas vraiment légal C++.
Votre seule « solution » (de toutes sortes) en C# est de faire vos class
es struct
s au lieu, comme les types de valeur dans .NET ne peut pas être null
(dans votre exemple, b ne peut jamais être null
parce que c'est un System.Int32
). L'appel à bar()
ne compilera pas:
class A { }
struct B { }
static void foo(A a) { }
static void bar(B b) { }
static void Main(string[] args)
{
foo(null);
bar(null);
}
Il semble certainement qu'il aurait été agréable pour C# avoir fait (beaucoup) plus difficile d'avoir null
références; F #, par exemple, n'a aucun type Nullable.
Pour quelques commentaires intéressants liés à ce sujet, lisez Null References: The Billion Dollar Mistake (et les commentaires).
Edit: A Février 2013 la note de Eric Lippert dit: » ... il se trouve que lorsque C# a d'abord été mis en œuvre il y avait des types de référence toujours nullable, ... il semble plausible que Nullable<T>
pourrait avoir Nous pouvions avoir un système de type où Nullable<string>
était la seule façon légale de représenter "une chaîne qui peut être null
". ... "
Ceci est une copie presque exacte de: http://stackoverflow.com/questions/718630/not-nullable-types – BenAlabaster