2008-11-14 8 views
16

Nasze standardy kodowania wymagają, abyśmy zminimalizowali użycie C# var (sugeruje ograniczenie jego użycia do bycia w połączeniu z Linq). Jednak są chwile, kiedy używa się generycznych, gdzie jest to rozsądnie dogodne, np.Narzędzie do refaktoryzacji C# var na jawny typ

Dictionary<DateTime, Dictionary<string, float>> allValues = ... 
// ... 
foreach (var dateEntry in allValue) 

łatwiej jest wpisać

foreach (KeyValue<DateTime, Dictionary<string, float>> dateEntry in allValue) 

(i prostsze niż pamiętanie co jawne typ jest w niektórych przypadkach).

Czy którekolwiek z narzędzi do refaktoryzacji mają możliwość przekonwertowania tego pierwszego na drugie. Spojrzałem na Resharpera, ale wygląda na to, że nie działa (w rzeczy samej, domyślną sugestią jest pójść w przeciwnym kierunku).

Odpowiedz

19

Mam program ReSharper 4.1 i oferuje tę opcję (w dowolnym kierunku).

Właściwie, polecam rzucić wyzwanie standardowi ... ten pierwszy jest dużo bardziej czytelny niż ten drugi (szczególnie jeśli wywołujesz zmienną pair lub coś podobnego). Nie użyłbym "var" dla var i = 0, ale idealnie pasuje do powyższych.

do zmiany luzem, przejdź do:

  • Kodeksu Oczyszczanie ... (wybrać profil => "Edit Profile" => Narzędzia => Oczyszczanie Code)
    • C#
      • Użyj "var" w deklaracji
        • Zmień kierunek = Czy "var" do użycia typu
        • 'foreach' deklaracja iterator style = Zawsze używaj jednoznaczny typ
        • lokalna deklaracja zmiennej style = Zawsze używaj wyraźny typ

i uruchomić ...

+0

miłe Ci znaleźć jak to zrobić luzem :) +1 – Bluenuance

+0

Dzięki, jestem nowy w Resharper i nie znalazłem. –

4

Resharper robi to (tylko w wersji 4+ jestem tego pewien) , ale nie wiem, czy można go przekonwertować na konkretny typ automatycznie - w końcu trzeba przejść do "var" a następnie pojawia się światło, które daje możliwość wyraźnego określenia typu:

0

będę argumentować, że jeżeli masz złożone typy generyczne na obiektach domena należy typedef im

 
class DomainValueCollection : KeyValue<DateTime, Dictionary<string, float>>{} 

gdzie DomainValueCollection jest somehting że ma sens w kontekście domeny

kod staje

 
var allItems = new DomainValueCollection(); 

zamiast

 
var allItems = new KeyValue<DateTime, Dictionary<string, float>>(); 
+0

Nie jestem pewien, czy to zadziała; zobacz mój drugi wpis z tego powodu (było zbyt długo, aby sensownie zmieścić komentarz). –

3

@Adam - nie można zadeklarować klasę tutaj, ponieważ nie będzie to, co wraca z IDictionary<,>.GetEnumerator() - jednak można alias przez using:

using InnerPair = System.Collections.Generic.KeyValuePair<System.DateTime, 
    System.Collections.Generic.Dictionary<string, float>>; 

Następnie:

To tylko alias typu, więc działa dobrze.

+0

CO? dlaczego to wszystko robisz, skoro możesz po prostu "var" ...? Nie rozumiem? –

+2

@Bobby, aby spełnić wymagania pytania ... –

2

może być bardzo późno, ale napisałem Visual Studio 2015 rozszerzenie, które wykonuje to w oparciu o platformę .NET kompilator. Replace var with Type Został przetestowany pod kątem normalnych sytuacji, a jeśli wystąpi błąd, powinienem go naprawić najwcześniej, a także otworzyć go w przypadku, gdy ktoś chce wnieść wkład lub ulepszyć to narzędzie.

8

Jest to możliwe w Visual Studio 2017.

Narzędzia> Opcje> Edytor tekstu> C#> Kod Styl> Ogólne -

Znajdź preferencje 'var'> Gdy typ zmiennej jest oczywista. Dla opcji Preferencje wybierz "Preferuj typ jawny", a dla opcji Ważność wybierz "Sugestia".

enter image description here

Będziesz teraz uzyskać lekkie działania żarówki podczas korzystania var, można szybko przejść do wyraźnej typu za pomocą Ctrl. klawisz skrótu.

enter image description here

enter image description here

+0

Jakoś to nie działa dla mnie po zmianie sugerowanych ustawień? Jedyną opcją, którą mam w żarówce, jest "Metoda ekstrakcji"? Używam Visual Studio 2017 CE ... Czy jest jakaś inna opcja, aby to zadziałało? –

+1

Nie jestem pewien co do wydania Community Edition, ale nie spodziewałbym się, że będzie inaczej. Spróbuj ustawić istotność ostrzeżenia lub wyjątku i sprawdź, czy jest wyświetlana na liście błędów. Może również spróbować ponownie uruchomić VS? – HaveSpacesuit

+0

Zmiana ostrzeżenia na Ostrzeżenie lub Błąd działa, dzięki za napiwek !! –

Powiązane problemy