2011-02-01 11 views
114

Powiel możliwe:
ReSharper and varDlaczego powinienem używać var ​​zamiast typu?

Po zainstalowaniu ReSharper Wymaga (przez ostrzeżeń), które używam var ile to możliwe, na przykład

UnhandledExceptionEventArgs ue = (UnhandledExceptionEventArgs) t; 

ReSharper chce zmień go w

var ue = (UnhandledExceptionEventArgs) t; 

Najbardziej podoba mi się pierwsza wersja, czy istnieje jakikolwiek powód, by preferować var? lepsza wydajność? byle co? czy to tylko styl kodu?

+0

Inne duplikaty http://stackoverflow.com/questions/296783/resharper-vars http: // stackoverflow.com/questions/1010480/why-does-resharper-default-to-warning-if-you-dont-declare-using-var http://stackoverflow.com/questions/1873873/why-does-resharper-want-to -użytkownik-var-for-all http://stackoverflow.com/questions/1299045/is-resharper-correct –

+0

-1: Zostało to pokryte * tak * wiele razy wcześniej, a duplikaty można łatwo znaleźć, przeszukując witrynę . –

+4

@Greg Beech Nie zgadzam się, nie wszyscy znają błąd ReSharpera, myślałem, że to coś znaczy, ale myliłem się. – IAdapter

Odpowiedz

80

To naprawdę tylko styl kodowania. Kompilator generuje dokładnie to samo dla obu wariantów.

Zobacz również tutaj kwestii wydajności:

+1

Zgadza się. Ale próbowałem użyć słowa kluczowego var w VS2010, ale automatyczne uzupełnianie składni wydaje się czasem zdziwione. Więc może z ReShaperem nie ma wady, aby go użyć. – Peposh

+0

@Peposh yup .. samo tutaj, dlatego przestałem go używać ... dopóki nie zacząłem używać ReSharpera. – carny666

+3

Przestałem go używać, ponieważ kolejne pokolenie programistów nie przestaje narzekać. Moja obrona polegała na tym, że przeczytali i zrozumieli kod, który nie zrobił żadnej różnicy. Myślę, że to naprawdę ułatwia sprawę; jeśli zmienisz kod i zmienisz typy, nie będziesz musiał aktualizować swoich odniesień do tego, co zmieniłeś, jeśli zmieni typ, tj. mniej pisania = mniej pracy. – user1040975

29

Kiedy mówisz "o ostrzeżeniach" co dokładnie masz na myśli? Zwykle widziałem, że dało to wskazówkę, że chcesz może chcesz użyć var, ale nic tak ostre jak ostrzeżenie.

Nie ma różnicy w wydajności z var - kod jest kompilowany do tej samej IL. Potencjalną korzyścią jest czytelność - jeśli już zdefiniowałeś typ zmiennej krystalicznie na RHS zadania (np. Przez rzutowanie lub wywołanie konstruktora), gdzie jest korzyść z posiadania go również na LHS? To osobiste preferencje.

Jeśli nie chcesz, aby R # sugerowało użycie var, po prostu zmień opcje. Jedną rzeczą ReSharper: to bardzo konfigurowalne :)

+0

jest zielone ostrzeżenie, myślę, że podpowiedź jest, gdy klikam na przykład na napisie i mogę zrobić z nim trochę magii, ale to jest ostrzeżenie. Po kliknięciu na nią nazywa się "Sugestia". – IAdapter

+6

@ 01: Nie powiedziałbym, że zielone światło jest "ostrzeżeniem". Pomarańczowy lub czerwony, tak ... ale zielony? –

+0

jeśli jest to kwestia stylu kodowania niż dlaczego powinienem się tym przejmować? Jest to Sugestia, ale dla nowych użytkowników, takich jak ja, wygląda to jak ostrzeżenie, a jeśli mnie to nie obchodzi, to po prostu zmienię go na var (ReSharper powinien wiedzieć lepiej ode mnie). Myślę, że termin techniczny to "hałas". – IAdapter

10

W ta sprawa jest właśnie styl kodowania.

Używanie var jest konieczne tylko w przypadku typów anonimowych.
W innych sytuacjach jest to kwestia gustu.

+1

ale jak wiele frameworków takich jak ten, ReSharper zmusza go do gustu;) – IAdapter

+4

Resharper niczego nie zmusza. To jest sugestia. Właśnie dlatego jest zielony. –

+0

@Mystere Man, tak jak ty, nie zmuszasz nikogo do nie wyrażenia zgody na ReSharper, tylko mówisz, że ReSharper ma zawsze rację. Myślę, że większość ludzi widzi zielone ostrzeżenie. – IAdapter

10

Jak mówili inni, nie ma różnicy w skompilowanego kodu (IL) podczas korzystania z jednego z następujących powodów:

var x1 = new object(); 
object x2 = new object; 

Przypuszczam Resharper ostrzega, bo to jest [moim zdaniem] łatwiejsze przeczytać pierwszy przykład niż drugi. Poza tym, co jest potrzebne, aby dwukrotnie powtórzyć nazwę tego typu?

Rozważmy następujący, a dostaniesz to, co mam na myśli:

KeyValuePair<string, KeyValuePair<string, int>> y1 = new KeyValuePair<string, KeyValuePair<string, int>>("key", new KeyValuePair<string, int>("subkey", 5)); 

To sposób łatwiej przeczytać zamiast:

var y2 = new KeyValuePair<string, KeyValuePair<string, int>>("key", new KeyValuePair<string, int>("subkey", 5)); 
+6

Powodem, dla którego wolałbym NIE używać ** var ** jest, jeśli popełniłem błąd dotyczący typu, którego oczekuję, że zostanie on zwrócony na RHS, wtedy użycie jawnego typu po lewej stronie złapie błąd. Ponadto nie zawsze jest oczywiste, patrząc na RHS, jaki jest typ bez Intellisense. W przykładzie powyżej byłbym skłonny dodać using ' korzystając NestedKVP = KeyValuePair > NestedKVP y1 = new NestedKVP ("klucz", nowy KeyValuePair ("podklucz", 5)) ; ' – JonN

Powiązane problemy