¿Existe un atributo simple o contrato de datos que pueda asignar a un parámetro de función que evite que nullse pase en C # / .NET? Idealmente, esto también se verificaría en tiempo de compilación para asegurarse de que el literal nullno se esté usando en ningún lugar para él y en el lanzamiento en tiempo de ejecución ArgumentNullException.
Actualmente escribo algo como ...
if (null == arg)
throw new ArgumentNullException("arg");
... por cada argumento que espero no sea null.
En la misma nota, ¿existe un opuesto al Nullable<>que fallaría lo siguiente?
NonNullable<string> s = null; // throw some kind of exception
c#
.net
parameters
null
Neil C. Obremski
fuente
fuente

Respuestas:
Desafortunadamente, no hay nada disponible en tiempo de compilación.
Tengo una solución un poco hacky que publiqué en mi blog recientemente, que usa una nueva estructura y conversiones.
En .NET 4.0 con las cosas de Code Contracts , la vida será mucho mejor. Aún sería bastante bueno tener una sintaxis de lenguaje real y soporte en torno a la no nulabilidad, pero los contratos de código ayudarán mucho.
También tengo un método de extensión en MiscUtil llamado ThrowIfNull que lo hace un poco más simple.
Un último punto: ¿alguna razón para usar "
if (null == arg)" en lugar de "if (arg == null)"? Encuentro que el último es más fácil de leer, y el problema que el primero resuelve en C no se aplica a C #.fuente
if (null == x)se deba a diferencias de lenguaje natural. Creo que realmente se trata de un estilo obsoleto que simplemente se propaga a través de ejemplos, etc.Sé que llego increíblemente tarde a esta pregunta, pero creo que la respuesta será relevante a medida que la última versión importante de C # se acerque al lanzamiento y luego al lanzamiento. En C # 8.0 ocurrirá un cambio importante, C # asumirá todos tipos no se consideran nulos.
Según Mads Torgersen:
Entonces, la resolución esbozada por Mads es:
Un ejemplo de la característica deseada:
La vista previa está disponible para Visual Studio 2017, 15.5.4+ vista previa.
fuente
Sé que esta es una pregunta MUY antigua, pero esta faltaba aquí:
Si usa ReSharper / Rider, puede usar el marco anotado .
Editar : Acabo de obtener un -1 aleatorio para esta respuesta. Esta bien. Solo tenga en cuenta que sigue siendo válido, aunque ya no es el enfoque recomendado para los proyectos de C # 8.0 + (para comprender por qué, consulte la respuesta de Greg ).
fuente
Consulte los validadores en la biblioteca empresarial. Puedes hacer algo como:
Luego, en su código cuando desee validarlo:
fuente
no el más bonito pero:
también podría ser más creativo en el método ContainsNullParameters:
Por supuesto, podría usar un interceptor o un reflejo, pero estos son fáciles de seguir / usar con poca sobrecarga.
fuente
return (from o in methodParams where o == null).Count() > 0;Uso:return methodParams.Any(o=>o==null);será mucho más rápido en colecciones grandesOk, esta respuesta es un poco tarde, pero así es como la estoy resolviendo:
Utilice este método de exención para que pueda tratar las cadenas nulas y vacías como lo mismo.
P.ej
No es ideal, lo sé, ya que debes recordar llamar a predeterminado en todas partes, pero es una solución.
fuente
string.IsNotNullOrEmptyotra cosa que el azúcar de tener lo que te importa a la izquierda. Puede introducirse en otras funciones (longitud, concatenación), etc. Un poco mejor.Default()) en un null (model.Day). Yo sé los métodos de extensión no se comprueban contra nula, pero mis ojos no son conscientes y que ya se imaginaron el?en el código:model?.Day?.Default():)