2011-08-02 9 views
5

Mam funkcję, która zwraca zmodyfikowaną kopię obiektu, który wywołał tę funkcję. Często robię coś takiego:Wyświetlanie ostrzeżenia, gdy wynik funkcji nie jest przypisany do zmiennej

obj = obj.Foo(param); 

Nie pytaj dlaczego, po prostu muszę. Ale czasami (i inni) zapomniał przypisać wynik funkcji, w ten sposób:

obj.Foo(param); 

które wielokrotnie prowadzi do czasochłonnego debuging.

Czy istnieje sposób wyświetlenia ostrzeżenia lub błędu za każdym razem, gdy wynik funkcji nie jest przypisany do zmiennej ? Lub inne sugestie, jak rozwiązać ten problem?

+1

"Nie pytaj dlaczego." Nie martw się! Podany fragment kodu wskazuje na niezmienny styl kodowania (nie mówiąc, że tego używasz). Jest to ten sam styl, którego używałbyś, na przykład, modyfikując zmienną "DateTime". 'date = date.AddDays (1);' –

+2

Rozwiąż problem, nie popełniając błędu w pierwszej kolejności. I wszyscy to robimy, ale to naprawdę jedyna odpowiedź. –

+1

Wygląda na to, że [ReSharper 6] (http://www.jetbrains.com/resharper/whatsnew/) ma * "Wartość zwracana czystej metody nie jest używana" * ostrzeżenie. (Mam tylko v5, więc nie mogę przetestować, że to ostrzeżenie dotyczyłoby twojej wersji, myślę, że to by prawdopodobnie było.) – LukeH

Odpowiedz

4

można użyć z parametrem, więc rozmowa będzie wyglądać następująco:

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

To naruszyłoby możliwość pisania instrukcji takich jak: "obj = obj.Foo (param) .Bar (parem) .Baz (parum); ' – Atreys

+0

Wziąłem pod uwagę to rozwiązanie. Nie używam łańcuchów jak wyżej, ale nie jestem pewien, czy nigdy ich nie użyję. Szukałem też czegoś bardziej "wyrafinowanego": D Przekonałeś mnie do tej metody :) – Grzes

2

Jest to całkowicie legalne i często pożądane, aby nie przypisywać parametr zwrotny więc błędem byłoby mieć ostrzeżenie dla niego. Henrik's Odpowiedź na pytanie, czy użyć parametru out, jest również polecana, aby zapewnić, że wynik zostanie przypisany za każdym razem.

2

można włączyć warings Visual Studio.

enter image description here

można nawet dostosować regułę, którą chcesz zastosować.

powinieneś zobaczyć ostrzeżenia w przypadku, gdy nie przypisanie funkcji do zmiennej

można również zdecydować się traktować jako Waring błędów

Przykład:

public static class MyClass 
    { 

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

enter image description here

enter image description here

+0

Nie we wszystkich wersjach VS, btw ... –

+0

dla starszej wersji możesz użyć poniższego: http: // msdn .microsoft.com/en-us/library/3y20cc1z% 28v = VS.80% 29.aspx –

+0

Niedostępne we wszystkich wersjach? Używam VS 2008 Express, który nie ma zakładki "Analiza Kodów". I nie mogłem znaleźć czegoś podobnego. – Grzes

0

Nie mogę skomentować odpowiedzi, brakuje kredytów stackoverflow. Ale zgadzam się z Chrisem, że jest to całkowicie legalne i często pożądane jest nie przypisywanie wartości zwracanych przez metodę. Czasami też nie jest to pożądane. na przykład

Jest oczywiste, że wywołanie tej metody bez przypisania jej jest prawdopodobnie błędem. Myślę, że stworzenie zasady analizy kodu, która ostrzegłaby za każdym razem, gdy nie przypisałeś wartości, jak sugerował Massimiliano, byłaby gorsza niż brak reguły w ogóle. W takich przypadkach byłoby miło, aby móc zastosować atrybut metody ...

[MustAssign] 
public static int Square... 

Można by utworzyć regułę jak sugeruje Massimiliano ale tylko wywołać ostrzeżenie, gdy metoda jest ozdobiona atrybutu a wartość zwrócona z metody nie jest przypisana. Nie jest to jednak trywialne ćwiczenie.

3

Możesz użyć programu Resharper, aby pomóc w rozwiązaniu tego problemu; trzeba ozdobić swoją metodę z atrybutem [Pure]:

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

wtedy, gdy nazywają go bez przypisywania wartości zwracanej widać:

enter image description here

Atrybut [Pure] jest zdefiniowana w Resharpers danych adnotacji : Należy skopiować klasy do projektu, aby można było do nich odwoływać (wiele bardzo przydatnych innych adnotacji).

enter image description here

Powiązane problemy