2011-08-02 15 views
5

Tengo una función que devuelve una copia modificada del objeto que llamó a esta función. A menudo hago algo como esto:Mostrando una advertencia cuando el resultado de la función no está asignado a la variable

obj = obj.Foo(param); 

No preguntes por qué, simplemente tengo que hacerlo. Pero a veces (y otros) se olvidó de asignar resultado de la función, hacer esto:

obj.Foo(param); 

que conduce repetidamente para debuging tiempo.

¿Hay alguna manera de mostrar una advertencia o un error cada vez que el resultado de la función no se asigna a una variable? ¿O alguna otra sugerencia sobre cómo resolver este problema?

+1

"No preguntes por qué". ¡No te preocupes! El fragmento de código dado es indicativo de un estilo de codificación inmutable (sin decir que eso es lo que estás usando). Es el mismo estilo que usarías si, por ejemplo, estuvieras modificando una variable 'DateTime'. 'date = date.AddDays (1);' –

+2

Resuelve el problema al no cometer el error en primer lugar. Y todos lo hacemos, pero esa es realmente la única respuesta. –

+1

Aparentemente [ReSharper 6] (http://www.jetbrains.com/resharper/whatsnew/) tiene una advertencia * "El valor devuelto del método puro no se usa" *. (Solo estoy en v5, así que no puedo probar que esta advertencia se aplicaría en tu situación; creo que probablemente lo sea). – LukeH

Respuesta

4

Se podría utilizar un parámetro de salida, por lo que la llamada se vería así:

obj.Foo(param, out obj); 
+6

Esto rompería la posibilidad de escribir sentencias como 'obj = obj.Foo (param) .Bar (parem) .Baz (parum); ' – Atreys

+0

He tomado esta solución en cuenta. No uso cadenas como las anteriores, pero no estoy seguro de que nunca las use. También estaba buscando algo más "sofisticado": D Me convenciste de este método :) – Grzes

2

que es totalmente gratis y con frecuencia deseable no asignar el parámetro de retorno por lo que sería malo tener una advertencia para él. Henrik's respuesta para utilizar un parámetro out es lo que recomendaría también para garantizar que el resultado se asigna cada vez.

2

puede habilitar warnings visual studio.

enter image description here

incluso se puede personalizar la regla que desea aplicar.

debería ver las advertencias en el caso de que no se asigna la función de una variable

también puede decidir tratar el Waring como errores

Ejemplo:

public static class MyClass 
    { 

     public static string GetStr() 
     { 
      return ""; 
     } 
     public static void Main() 
     { 
      GetStr(); 
     } 
    } 

enter image description here

enter image description here

+0

No en todas las versiones VS, por cierto ... –

+0

para la versión anterior puedes usar la siguiente: http: // msdn .microsoft.com/es-us/library/3y20cc1z% 28v = VS.80% 29.aspx –

+0

¿No está disponible en todas las versiones? Uso VS 2008 Express que no tiene la pestaña "Análisis de código". Y no pude encontrar nada similar. – Grzes

0

No puedo comentar las respuestas, ya que no tengo créditos de stackoverflow. Pero estoy de acuerdo con Chris en que es totalmente legal y a menudo deseable no asignar valores devueltos por un método. También ocasionalmente no es deseable. p.ej.

public static int Square(this int myValue) 
{ 
    return myValue * myValue; 
} 

Está claro que llamar a este método sin asignarlo es probablemente un error. Creo que crear una regla de análisis de código que advirtiera cada vez que no asignaba un valor como Massimiliano sugirió sería peor que no tener la regla en absoluto. En tales casos, sería bueno poder aplicar un atributo con el método ...

[MustAssign] 
public static int Square... 

Se puede crear una regla como se sugiere Massimiliano pero sólo invocar la advertencia cuando el método está adornada con el atributo y el el valor devuelto por el método no está asignado. No es un ejercicio trivial sin embargo.

3

Puede usar Resharper para ayudar con este problema; lo necesario para decorar su método con el atributo [Pure]:

[Pure] 
public static IList<T> RemoveItem<T>(this IEnumerable<T> thisList, T item) 
{ 
    var list = thisList.ToList(); 
    list.Remove(item); 
    return list; 
} 

a continuación, cuando usted lo llama sin asignar el valor de retorno se verá:

enter image description here

El atributo [Pure] se define en Resharpers datos Anotaciones : Necesita copiar las clases en su proyecto para que pueda referenciarlas (muchas otras anotaciones muy útiles también)

enter image description here

Cuestiones relacionadas