Właśnie zacząłem używać ReSharpera z Visual Studio (po wielu zaleceniach dotyczących SO). Aby to wypróbować, otworzyłem najnowszy projekt ASP.NET MVC. Jedną z pierwszych i najczęstszych rzeczy, które zauważyłem, sugeruje to zmianę większości / wszystkich moich wyraźnych deklaracji na var
. Na przykład:
//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
i tak dalej, nawet z typów prostych, takich jak int
, bool
itp
Dlaczego jest to zalecane? Nie wywodzę się z informatyki ani środowiska .NET, ponieważ ostatnio „wpadłem” w rozwój .NET, więc naprawdę chciałbym zrozumieć, co się dzieje i czy jest to korzystne, czy nie.
var
, nawet jeśli ten typ nie jest wcale oczywisty! Powodem jest to, że zmusza mnie do wybrania najbardziej opisowej nazwy, jaką mogę wymyślić, i ostatecznie sprawia, że kod jest znacznie, znacznie bardziej czytelny. Ostatecznie pomaga także oddzielić logikę od implementacji. Oczywiście to tylko moja opinia, mam nadzieję, że komuś to pomoże;).Odpowiedzi:
Jednym z powodów jest poprawiona czytelność. Który jest lepszy?
lub
źródło
var
do wszystkiego - zrobić wiele, wiele opinii kod za pomocą TFS (dyferencjału webowy) i to sprawia, że moje zadanie niezwykle trudne: tjvar items = GetSomeItems();
vsIDataReader dr = GetSomeItems();
Brakujące za pomocą komunikatu na obu, ale łatwiej mi się złapać podczas korzystaniaIDataReader
vsvar
.To, co sugeruje ReSharper, to wyraźnie nadużywanie słowa kluczowego var. Możesz go użyć, gdy typ jest oczywisty:
Jeśli ten typ nie jest oczywisty, powinieneś go zapisać:
źródło
var
jest kwestią opinii, a nie „wyraźnie” jednej czy innej rzeczy. Wolę nie wpisywać rzeczy, które kompilator może sam wymyślić. Lubię wnioskowanie typu C # i często żałuję, że nie było tak dobre jak wnioskowanie typu F #. Gdybym mógł, pomijałbym typy jawne z parametrów metody i typy zwracane, jak to jest normą w F #. Oczywiście nie wszyscy się zgadzają.Stream
obiektu nosi nazwęRead
, a nie nazwęReadAndReturnNumberOfBytesAsInt32
.Osobiście wolę wyłączyć tę sugestię. Korzystanie
var
może często poprawić czytelność; ale, jak wspomniałeś, czasami go zmniejsza (w przypadku prostych typów lub gdy typ wynikowy jest niejasny ).Wolę wybierać, kiedy używam,
var
a kiedy nie. Ale znowu, to tylko ja.źródło
var
dość często.var methodXYResultIntArray
. Jest to niezgodne ze wszystkimi standardami kodowania i mniej zwięzłe niżint[] methodXYResult
. Jeśli chcesz zwrócić abyte[]
z metody w przyszłości, wszystkie nazwy zmiennych są niepoprawne. W przypadku jawnych typów można to bardzo łatwo zmienić. Istnieją powody do użyciavar
, na przykład zDictionary<string, List<SomeType<int>>>
. Ale jeśli nazwa pełnego typu nie jest zbyt długa i nie używasz jejnew
po prawej stronie (lub w jawnej obsadzie) resharper nie powinien jej sugerować.var
może zwiększyć czytelność kodu, jednocześnie zmniejszając natychmiastowe zrozumienie kodu. Podobnie może zmniejszyć czytelność kodu w innych sytuacjach. Czasami jego użycie jest neutralne. Miara czytelności rozumienia nie jest proporcjonalna, ale zależy od sytuacji. Czasami oba są zwiększane lub zmniejszane razem.Czynnikiem jest to
var
, co jest stosowane i jak dobrze cel obsługuje natychmiastowe zaciemnianie swojego typu danych do czytnika, lub czy informacja o jego typie jest potrzebna do zrozumienia dostępnej części programu.Na przykład złe nazewnictwo może prowadzić do
var
zmniejszenia zrozumienia kodu. Nie jest to jednakvar
wina:Czasami nie ma sensu używać
var
prostych typów danych, gdy kod jest bardziej czytelny w przypadku jego braku:Czasami
var
może być przydatne ukrycie informacji o typie danych, których niekoniecznie zależy Ci na złożoności:Państwo musi wykorzystać
var
, gdy pojawia się anonimowy typ obecny, ponieważ nie ma nazwa typu nazwać to przez:Jeśli mimo to Visual Studio Intellisense dostarcza informacje o typie
var
, musisz mniej polegać na swoim zrozumieniu dzięki ścisłemu odczytywaniu kodu bez pomocy. Prawdopodobnie rozsądnie jest założyć, że nie każdy może mieć Intellisense lub go używać.Podsumowując na podstawie powyższych przykładów, sugeruję, że stosowanie carte blanche
var
nie jest dobrym pomysłem, ponieważ większość rzeczy najlepiej jest wykonywać z umiarem i na podstawie okoliczności, jak pokazano tutaj.Dlaczego Resharper używa go domyślnie? Sugeruję z łatwością, ponieważ nie można przeanalizować niuansów sytuacji, aby zdecydować, kiedy najlepiej jej nie używać.
źródło
var
, zmusi cię to do napisania przyzwoitych nazw metod.GetNumber() -but what type?
- cóż, dlaczego cię to obchodzi? Jeśli ważne jest, aby wiedzieć, należy wywołać metodęGetNumberAsDouble()
, to jest tak samo jasne i zadziała, jeśli jedna metoda zwracastring
i jedną zwracadouble
.W ReSharper (8.02, ale prawdopodobnie w innych wersjach) opcję sugestii „Użyj niejawnie wpisanej zmiennej lokalnej” można dostosować do własnych preferencji , cokolwiek to może być, najpierw otwierając menu opcji dla ReSharper:
Następnie w obszarze „Kontrola kodu” poprzez dostosowanie „Ważności kontroli” wybranego języka, w moim przypadku c #:
Jak widać, istnieją opcje dostosowania wszystkich sugestii ReSharper. Ma nadzieję, że pomoże to komuś takiemu jak ja, który ma już strategię użytkowania „var” i chce, aby ReSharper ją przestrzegał :)
źródło
Dziwi mnie, że nikt nie wspominał, że łatwiej jest również zmienić typ tworzonego obiektu, ponieważ
jest formą powtórzenia . Jeśli chcę zmienić się
AVeryLongTypeName
w jedną z jego klas pochodnych, potrzebuję zmienić to tylko raz podczas korzystaniavar
i nadal mam dostęp do metod klas potomnych.Poza tym ważna jest poprawiona czytelność, ale jak powiedzieli inni, var nie powinien być nadużywany, więc myślę, że wyłączenie podpowiedzi w Resharper jest absolutnie w porządku.
źródło
„var” polega na jasności
Główna debata na temat tego, czy użyć
var
słowa kluczowego, czy nie, dotyczy tego, jak czytelny jest kod dla ciebie i innych programistów.Tak, jakbyś pisał historię, nie ma ostatecznej właściwej odpowiedzi. Ale spójrzmy na kilka przykładów tego w prostym języku angielskim.
Kto poszedł w drugą stronę? Jake czy Bill? W tym przypadku użycie nazw „Jake” i „Bill” przypomina użycie nazwy typu. A „On” i „on” jest jak użycie
var
słowa kluczowego. W takim przypadku może być bardziej szczegółowe. Poniższe na przykład jest znacznie jaśniejsze.W tym przypadku bardziej szczegółowe uściśliło zdanie. Ale nie zawsze tak będzie. W niektórych przypadkach dokładność utrudnia czytanie.
W takim przypadku łatwiej byłoby odczytać zdanie, gdybyśmy użyli słowa „on”, a w niektórych przypadkach całkowicie pominęli jego imię, co jest równoważne użyciu
var
słowa kluczowego.Te przykłady obejmują sedno, ale nie opowiadają całej historii. W tych przykładach był tylko jeden sposób na odniesienie się do osoby. Albo używając ich nazwy, albo używając bardziej ogólnego terminu, takiego jak „on” i „on”.
W przypadku kodu mamy 3 sposoby na zwiększenie przejrzystości. Typ, nazwa zmiennej i przypisanie. Weźmy na przykład następujący wiersz kodu:
Teraz pojawia się pytanie, czy w tym wierszu kodu jest wystarczająco dużo informacji, aby pomóc ci zrozumieć, co się dzieje?
Co z następującym wierszem kodu? Czy nadal wiesz, co
p
oznacza w tym przypadku:A teraz:
Lub teraz:
Albo ten:
Albo to:
To, czy słowo kluczowe
var
działa w danym scenariuszu, zależy w dużej mierze od kontekstu kodu, takiego jak nazwy zmiennych, klas i metod. Zależy to również od złożoności kodu i reszty otaczającego go kodu.Osobiście lubię używać
var
słowa kluczowego, które jest dla mnie bardziej wszechstronne . Ale mam też tendencję do nazywania moich zmiennych po typie, więc tak naprawdę nie tracę żadnych informacji.To powiedziawszy czasami w zależności od kontekstu, z którego robię wyjątki, taka jest natura wszystkiego złożonego, a oprogramowanie jest niczym, jeśli nie złożone.
źródło
var
o ile wiem, co to jest, czytając ten wiersz. Jeśli nie mam pojęcia, co zwraca metoda z innego rozwiązania korzystającego z innego modelu domeny, wolę wyraźnie zdefiniować ten typ, co znacznie ułatwia czytanie. +1Też mi się nie podobało.
Nie chcę, aby przerodziło się to w debatę na temat wykorzystania
var
, ma swoje zastosowania, ale nie powinno być stosowane wszędzie.Najważniejszą rzeczą do zapamiętania jest to, że ReSharper jest skonfigurowany zgodnie z dowolnymi standardami kodowania.
Edycja: ReSharper i var
źródło
Widzę wiele poprawnych odpowiedzi, ale brakuje pełnej.
Prawdą jest, że ReSharper
var
domyślnie nadużywa . Myślę, że większość ludzi się z tym zgodzi. Łatwiej jest również odczytać, kiedyvar
jest używany, a typ jest oczywisty, na przykład przy użyciunew
instrukcji. Widziałem jeden post, który pokazał, jak zaktualizować ważność inspekcji, aby pokazać tylko wskazówki dotyczące użyciavar
.Próbowałem najpierw skomentować inne posty, aby dodać, gdzie je ustawić, ale nie miałem na to reputacji. Najwyraźniej nie miałem reputacji, aby opublikować zrzut ekranu z ustawieniami.
Wyjaśnię ci, jak się tam dostać.
W Visual Studio> Menu główne> Resharper> Opcje> Edycja kodu> C #> Styl kodu> Wykorzystanie Var w deklaracjach
Dokumentacja pomocy ReSharper: Styl składni kodu: Wpisywanie niejawne / jawne (słowo kluczowe „var”) - Konfiguracja preferencji dotyczących używania słowa kluczowego „var”
źródło
Moja zasada jest taka:
Ty deklarując prymitywny typ (czyli
byte
,char
,string
,int[]
,double?
,decimal
, itd.)? -> Użyj typu:Czy deklarowania typu złożonego (czyli
List<T>
,Dictionary<T, T>
,MyObj
)? -> Użyjvar
:źródło
string myStr = "foo";
to oczywiste, że to struna. Umieściłbym wszystkie twoje przykłady w kategorii use var ... i deklaracje, które są zwrotami z metody użycia typu explicity. Ale pod koniec dnia wszystko, co Ty i Twój zespół czuje, jest lepsze dla danego projektu.Chciałbym tylko wskazać, że użycie „var” jest zalecane w konwencjach kodowania C #
prawdopodobnie dlatego końcówka jest domyślnie włączona w ReSharper. Udostępniają również niektóre przypadki, w których nie poprawiłoby to czytelności poniżej w tym samym dokumencie.
źródło
System.Diagnostics.PerformanceCounter()
- Możesz łatwo odróżnić licznik wydajności od wbudowanej klasy diagnostycznej. Ale jaki typ jest tutaj zwracany?var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)
? Brak wskazówek dotyczących taktowania, szczególnie jeśli masz w swoim rozwiązaniu ponad 100 projektów.ReSharper zaleca,
var
ponieważ ma tendencję do rozplątywania tworzenia obiektów.Porównaj te dwa przykłady:
To tylko skrót, który powinien być łatwiejszy do odczytania.
Myślę, że to w porządku, gdy tworzysz nowe obiekty jawnie za pomocą „new”. W twoim przykładzie może nie być jednak oczywiste, czy klasy nie zostały poprawnie nazwane.
źródło
BTW, ReSharper rozróżnia „możesz zastosować tę sugestię do swojego kodu” i „Twój kod jest zepsuty, czy chcę to naprawić?”. Słowo
var
kluczowe znajduje się w kategorii sugestii, podobnie jak „odwróć, jeśli chcesz ograniczyć zagnieżdżanie”; nie musisz tego przestrzegać.Możesz skonfigurować, jak denerwujące są poszczególne alerty, w oknie dialogowym Opcje lub bezpośrednio w menu podręcznym tego alertu. Możesz obniżyć liczbę rzeczy takich jak
var
sugestia, aby były mniej widoczne, lub możesz ulepszyć takie rzeczy, jak alert „użyj metody rozszerzenia”, aby wyświetlał się jako rzeczywisty błąd.źródło
var
Cechą .NET 3.0 jest po prostu rodzaj wnioskowania , która jest typu bezpieczne i często sprawia, że kod łatwiejsze do odczytania. Ale nie musisz i możesz wyłączyć tę rekomendację w resharper, jeśli chcesz.źródło
Var jest niesamowity! Natknąłem się na wielu programistów, którzy mają wrażenie, że
var
jest związany z typem dynamicznym, tak nie jest. Nadal jest statycznie wpisany, po prostu decyduje o tym kompilator.Oto kilka niesamowitych zalet używania var
Mniej pisania var jest krótsze i łatwiejsze do odczytania, na przykład
Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()
Fuj.var postcodes = new Dictionary<int,IList<string>>()
\ o / \ o /Bardziej opisowe nazwy zmiennych - niepewne, ale myślę, że ważne jest, aby pozwolić
var
tutaj zabłysnąć płynnej naturze . Jakvar
jest nieco niejasne, to naprawdę nie zachęcają bardziej desciptive nazwę zmiennej zamiast pozwalając Czytaj typ dla siebie.Mniej zmian kodu - jeśli zmieni się typ zwracanego wywołania metody. Musisz tylko zmienić wywołanie metody, a nie każde używane miejsce.
Typy anonimowe - typy anonimowe to naprawdę potężna koncepcja, szczególnie w obszarach takich jak częściowe zasoby WebApi . Bez var nie można ich używać.
Czasami jednak użyteczne jest jawne deklarowanie typów i uważam to za najbardziej przydatne w operacjach podstawowych lub strukturach. Na przykład osobiście nie uważam tej składni za bardzo przydatną:
vs
Wszystko
var
zależy od osobistych preferencji, ale używanie naprawdę przyspieszy rozwój i odblokuje cały świat dobroci typu anonimowego.źródło
Nie ma różnicy technicznej, jeśli użyjesz var, typ jest sugerowany przez kompilator. Jeśli masz taki kod:
x jest implikowane jako int i nie można mu przypisywać żadnych innych wartości.
Słowo kluczowe var jest przydatne, jeśli zmienisz typ zmiennej; musisz tylko wprowadzić jedną zmianę zamiast dwóch:
źródło
Słowo
var
kluczowe zostało wprowadzone w C # 3.0 - pozwala nam zapomnieć o wyraźnym określeniu naszego typu.Nie ma żadnej różnicy w tym, czy używasz
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
lub
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
oprócz czystej czytelności i mniejszej szansy na błąd.
Wygląda to na stereotypowy przykład, ale powiedz, że poniższe informacje mogą pomóc w zrozumieniu:
zwraca
int
typ, natomiastzwraca
string
typ.Odniesienie MSDN
źródło
Określenie jawnego typu obiektu jest w jakiś sposób zbędne. Nawet przetłumaczony na angielski, brzmi to nadmiarowo: „umieść obiekt typu X w zmiennej typu X” vs „Umieść obiekt typu X w zmiennej”.
Jednak używanie „var” ma swoje ograniczenia . Zapobiega poniższemu wykorzystaniu polimorfizmu, który jest czystym pięknem :
Załóżmy, że pies rozszerza zwierzę; Cat rozszerza hierarchię klas zwierząt:
Ten sam kod z x zadeklarowanym za pomocą „var” nie będzie się kompilował .
W każdym razie, wracając do pierwotnego pytania, nie używam Resharpera, ale zakładam, że jest wystarczająco inteligentny, aby wykryć, kiedy nie używać „var”. :-)
źródło
as
) jest okropne. Błędy kompilacji zamieniasz w błędy środowiska wykonawczego, jeśli masz coś takiego:Animal x = new Cat(); DoStuffWithDog(x as Dog);
Dlaczego ponownie użyć x? Pies x = nowy pies (), kot y = nowy kot (), boom nie jest już możliwy.Animal
do metod, które pobierająDog
iCat
. Polimorfizm jest odwrotna: tak można przekazać obiekty typuDog
iCat
do metody, które maAnimal
, na przykładvoid Walk(Animal a)
:Walk(new Cat())
,Walk(new Dog())
Moim zdaniem
var
należy go używać tylko wtedy, gdy jest natychmiast jasne, jaki jest typ przy definiowaniu wartości zmiennej.Przykład:
Oczywiste jest, że
s
jest tostring
.Uważam, że jest to również właściwe, gdy nazwa typu zmiennej jest bardzo złożona.
Przykład:
Poza tymi scenariuszami nie widzę żadnego ZYSKU do użycia przy użyciu
var
, ale mogę wymyślić kilka scenariuszy, w których może to być szkodliwe:Na przykład typ jednorazowy, którego wartość zmiennej po prawej stronie nie pokazuje wyraźnie typu. Pozbywanie się urządzenia IDisposable można łatwo zapomnieć
Przykład:
źródło
„var” dodaje do kodu swego rodzaju „dynamiczny” element (chociaż kod pozostaje oczywiście ściśle wpisany). Odradzam używanie go w przypadkach, gdy typ nie jest jasny. Rozważ ten przykład:
W przypadku zmiany zwracanego typu GetTheObjectFromDatabase () z Type A na B nie zauważymy, ponieważ obie klasy implementują DoSomething (). Jednak kod może teraz zrobić coś zupełnie innego.
Może to być tak subtelne, jak pisanie różnych rzeczy do dziennika, więc możesz nie zauważyć, że unitl jest już za późno.
Następujące użycie var powinno zawsze być w porządku:
źródło
Dla tych, którzy nie lubią ciągłego używania „var”, możesz także powstrzymać ReSharper przed domyślnym ustawieniem var podczas wykonywania „wprowadzenia zmiennej”. To było coś, co frustrowało mnie przez długi czas, zawsze domyślnie zmieniało się, a ja zmieniałem to za każdym razem.
Te ustawienia znajdują się w obszarze Edycja kodu> C #> Styl kodu
źródło
Nie ma różnicy technicznej (jak wskazał eWolf). Możesz użyć jednego lub drugiego, wygenerowany kod CLR będzie wyglądał tak samo.
Moim zdaniem główną zaletą jest to, że zmusza cię to do korzystania z lepszego nazewnictwa zmiennych. W twoim przykładzie „foo” jest dość kiepskim wyborem dla nazwy zmiennej.
źródło
Według JetBrains (autor ReSharper), domyślnie zachęcają do korzystania z var.
Z ich strony internetowej :
źródło