116 votes

Marquer les paramètres comme non nullables en C # / .NET?

Est-il un simple attribut ou d'un contrat de données que je peux attribuer à un paramètre de fonction qui empêche null soit passé en C#/.NET? Dans l'idéal, ce serait également vérifier au moment de la compilation assurez-vous que le littéral null n'est pas utilisé n'importe où et au moment de l'exécution jeter ArgumentNullException.

Actuellement, j'écris quelque chose comme ...

if (null == arg)
  throw new ArgumentNullException("arg");

... pour chaque argument que je m'attends à ne pas être null.

Sur la même note, est-il contraire à l' Nullable<> laquelle le suivant serait un échec:

NonNullable<string> s = null; // throw some kind of exception

72voto

Jon Skeet Points 692016

Il n'y a rien de disponible au moment de la compilation, malheureusement.

J'ai un peu de hacky solution que j'ai posté sur mon blog récemment, qui utilise une nouvelle structure et de conversions.

Dans .NET 4.0 avec le Code des Contrats de choses, la vie sera beaucoup plus agréable. Il serait très agréable d'avoir réels de la syntaxe du langage et de soutien autour de la non-possibilité de valeur null, mais le code des contrats seront d'une grande aide.

J'ai aussi une méthode d'extension dans MiscUtil appelé ThrowIfNull ce qui le rend un peu plus simple.

Un dernier point une raison pour l'utilisation de "if (null == arg)" au lieu de "if (arg == null)"? Je trouve ce dernier plus facile à lire, et le problème de l'ancien résout en C ne s'applique pas en C#.

20voto

rsenna Points 5528

Je sais que c'est une très vieille question, mais celle-ci manquait ici:

Si vous utilisez ReSharper, vous pouvez utiliser le cadre annoté .

9voto

Chris Lively Points 59564

Découvrez les validateurs dans la bibliothèque d'entreprise. Vous pouvez faire quelque chose comme:

 private MyType _someVariable = TenantType.None;
[NotNullValidator(MessageTemplate = "Some Variable can not be empty")]
public MyType SomeVariable {
    get {
    	return _someVariable;
    }
    set {
    	_someVariable = value;
    }
}
 

Puis dans votre code quand vous voulez le valider:

 Microsoft.Practices.EnterpriseLibrary.Validation.Validator myValidator = ValidationFactory.CreateValidator<MyClass>();

ValidationResults vrInfo = InternalValidator.Validate(myObject);
 

2voto

FireFart Points 26

1voto

Alexandre Points 76

J'ai trouvé quelque chose à propos des champs obligatoires dans votre classe de modèle. Mais seulement pour .net 3.5 et supérieur ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X