Aquí es una pieza de código:

        IUser user = managerUser.GetUserById(UserId);
        if ( user==null ) 
            throw new Exception(...);

        Quote quote = new Quote(user.FullName, user.Email);

Todo está bien aquí. Pero si puedo reemplazar «si» de acuerdo con la siguiente:

        ComponentException<MyUserManagerException>.FailIfTrue(user == null, "Can't find user with Id=" + UserId);

donde implementación de la función es la siguiente:

public abstract class ComponentException<T> : ComponentException
        where T : ComponentException, new()
{
    public static void FailIfTrue(bool expression, string message)
    {
        if (expression)
        {
            T t = new T();
            t.SetErrorMessage(message);
            throw t;
        }
    }
    ...
}

A continuación, resharper me genera una advertencia: Posible » del Sistema.NullReferenceException’ apunta en la 1ª uso de ‘usuario’ objeto.

Q1. ¿Por qué se genera esta excepción? Tan lejos como puedo ver si el «usuario==null’, a continuación, excepción será generado y de la ejecución nunca llegar al punto de uso.

Q2. Cómo quitar esa advertencia? Por favor nota:
1. No quiero suprimir esta advertencia con los comentarios (que voy a tener un montón de piezas similares y no quiero transformar mi código fuente en » comentó el garbase);
2. No quiero cambios resharper configuración para cambiar este problema a partir de la advertencia ‘sugerencia’ de ‘ayuda’.

Gracias.

Pensamientos son bienvenidos!

P. S. estoy usando resharper 5.1, MVSV DE 2008, C#

OriginalEl autor Budda | 2010-12-08

6 Comentarios

  1. 6

    P1: Porque Resharper no hacer la ruta de análisis. Que sólo ve un posible null de referencia y banderas que.

    P2: no Se puede sin hacer cualquiera de lo que siempre ya.

    OriginalEl autor Femaref

  2. 10

    Resharper sólo se ve en el método actual para su análisis, y no analizar de forma recursiva otros métodos de llamar.

    Sin embargo, puede dirigir Resharper un poco y darle meta-información acerca de ciertos métodos. Se sabe, por ejemplo, de «hacer Valer.IsNotNull(a)», y tomará en cuenta para el análisis. Es posible hacer una externa anotaciones archivo para Resharper y dar información adicional acerca de una cierta biblioteca para hacer sus análisis mejor. Tal vez esto podría ofrecer una manera de resolver su problema.

    Más información se puede encontrar aquí.

    Un ejemplo que muestra cómo se utiliza para la biblioteca de Microsoft.Los contratos pueden ser encontrados aquí.

    OriginalEl autor rvdginste

  3. 6

    Una nueva respuesta en el anterior post…

    Aquí una pequeña muestra de mi código acerca de cómo utilizar CodeContract a través de ContractAnnotation con Resharper:

        [ContractAnnotation("value:null=>true")]
        public static bool IsNullOrEmpty(this string value)
        {
            return string.IsNullOrEmpty(value);
        }

    Es muy simple…si u encontrar la ruta de la madera. Puede comprobar otros casos también.

    Tengan un buen día

    Si usted sabe que un método siempre se produce una excepción que usted puede hacer [ContractAnnotation("=> halt")]

    OriginalEl autor user3464936

  4. 3

    Que no conocemos (o espera) que este código producirá una excepción si hay una referencia nula:

    ComponentException<MyUserManagerException>.FailIfTrue([...]);

    Sin embargo, ya que no hay contrato que especifica esta, ReSharper tiene que asumir que esto es sólo un método normal de llamada que puede devolver sin tirar ninguna excepción, en cualquier caso.

    Hacer que este método de aplicar el ReSharper contrato, o como una solución sencilla (que sólo afecta a modo de depuración, por lo que no penalización de rendimiento para el modo de disparador), justo después de la FailIfTrue llamada:

    Debug.Assert(user != null);

    Que va a deshacerse de la advertencia, y como un bono adicional de hacer una comprobación en tiempo de ejecución en modo de depuración para asegurarse de que la condición asumida por usted después de llamar a FailIfTrue es de hecho conocido.

    Deseaba que fuera cierto … Resharper 5.1 no identifica correctamente Debug.Assert(user != null); y plantea la advertencia. Hay alguna configuración que debo hacer?
    Uh, R# 5.1 es bastante anticuado, así que no tengo nada para poner a prueba tu problema. Algunos consejos: asegúrese de que el código correctamente, se refiere a la System.Diagnostics.Debug clase como el código de contrato definido para que, y no por la arbitrariedad con que nombre/firma. También, asegúrese de que la configuración de generación se establece para Depurar (de lo contrario el código que está fuera del alcance y por lo tanto, la advertencia aparece!).
    Debug.Assert obras, pero sólo en modo de Depuración.

    OriginalEl autor Lucero

  5. 0

    Esto es causado por la Resharper motor. Estos «posibles NullReferenceException» suceden porque alguien (probablemente en Resharper) ha declarado/configurado en algún lugar una anotación en el método.

    Aquí es cómo funciona: ReSharper NullReferenceException Análisis y Sus Contratos

    Por desgracia, a veces, estos útiles de anotación están mal.

    Cuando se detecta un error, se debe informar de ello a JetBrains y se actualizará las anotaciones en la próxima versión. Están acostumbrados a esto.

    Mientras tanto, usted puede tratar de solucionarlo por sí mismo. Lea el artículo para más 🙂

    OriginalEl autor Simon Mourier

  6. 0

    Por favor, compruebe si usted tiene cualquier usuario==null si se echa por encima el código dado. Si la hay, entonces ReSharper piensa que la variable «puede ser null» así lo recomienda el uso de un cheque/assert antes de hacer referencia a ella. En algunos casos, que es la única manera de ReSharper puede adivinar si una variable puede o no puede ser null.

    OriginalEl autor Cagatay Kalan

Dejar respuesta

Please enter your comment!
Please enter your name here