¿Se llama al método con un valor nulo o da una excepción de referencia nula?
MyObject myObject = null;
myObject.MyExtensionMethod(); // <-- is this a null reference exception?
Si este es el caso, ¿nunca tendré que verificar mi parámetro 'this' para que sea nulo?
c#
parameters
null
extension-methods
tpower
fuente
fuente
Cannot perform runtime binding on a null reference
.Respuestas:
Eso funcionará bien (sin excepción). Los métodos de extensión no usan llamadas virtuales (es decir, usa la instrucción "call" il, no "callvirt"), por lo que no hay verificación nula a menos que lo escriba usted mismo en el método de extensión. Esto es realmente útil en algunos casos:
etc.
Básicamente, las llamadas a llamadas estáticas son muy literales, es decir
se convierte en:
donde obviamente no hay cheque nulo.
fuente
Además de la respuesta correcta de Marc Gravell.
Podría obtener una advertencia del compilador si es obvio que este argumento es nulo:
Funciona bien en tiempo de ejecución, pero produce la advertencia
"Expression will always cause a System.NullReferenceException, because the default value of string is null"
.fuente
Como ya ha descubierto, dado que los métodos de extensión son simplemente métodos estáticos glorificados, se llamarán con
null
referencias pasadas, sin queNullReferenceException
se arrojen. Pero, como parecen ser métodos de instancia para la persona que llama, también deben comportarse como tales. Entonces, la mayoría de las veces, debe verificar elthis
parámetro y lanzar una excepción si es asínull
. Está bien no hacer esto si el método se ocupa explícitamente de losnull
valores y su nombre lo indica debidamente, como en los ejemplos a continuación:También escribí una publicación de blog sobre esto hace algún tiempo.
fuente
Se pasará un valor nulo al método de extensión.
Si el método intenta acceder al objeto sin verificar si es nulo, entonces sí, arrojará una excepción.
Un tipo aquí escribió los métodos de extensión "IsNull" e "IsNotNull" que comprueban si la referencia pasó nula o no. Personalmente, creo que esto es una aberración y no debería haber visto la luz del día, pero es perfectamente válido c #.
fuente
Como otros señalaron, llamar a un método de extensión en referencia nula hace que este argumento sea nulo y no suceda nada más. Esto da lugar a la idea de utilizar métodos de extensión para escribir cláusulas de protección.
Puede leer este artículo para ver ejemplos: Cómo reducir la complejidad ciclomática: cláusula de protección La versión corta es esta:
Este es el método de extensión de clase de cadena que se puede invocar en referencia nula:
La llamada funciona bien solo porque el tiempo de ejecución llamará con éxito al método de extensión con referencia nula. Luego puede usar este método de extensión para implementar cláusulas de protección sin una sintaxis desordenada:
fuente
El método de extensión es estático, por lo que si no hace nada en este MyObject, no debería ser un problema, una prueba rápida debería verificarlo :)
fuente
Hay pocas reglas de oro cuando quieres que tu sea legible y vertical.
En su caso, DesignByContract está roto ... va a realizar algo de lógica en una instancia nula.
fuente