¿Existe un atributo simple o contrato de datos que pueda asignar a un parámetro de función que evite que null
se pase en C # / .NET? Idealmente, esto también se verificaría en tiempo de compilación para asegurarse de que el literal null
no 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.IsNotNullOrEmpty
otra 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()
:)