2015-01-19 13 views
13

Rozważmy następujący kod aplikacji konsoli:Debug.WriteLine() kontra Console.WriteLine() inaczej obsługuje kulturę. Czemu?

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); 
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

DateTime date = new DateTime(2014, 01, 19); 

Console.WriteLine("{0}", date); // Prints 19/01/2014 
Debug.WriteLine("{0}", date); // Prints 01/19/2014 
Debug.WriteLine(date);   // Prints 19/01/2014 

Jak zauważył w komentarzach, że Console.WriteLine() drukuje 19/01/2014 natomiast Debug.WriteLine() wydruków 01/19/2014.

Nawet gorzej - Debug.WriteLine("{0}", date) daje inny wyjście z Debug.WriteLine(date) ...

Oczekuje się, że Debug.WriteLine() ignoruje ustawienia Kultura wątku?

Czy istnieje sposób, aby ustawić Debug.WriteLine() użyć ustawień kultury wątku? Czy muszę użyć String.Format() i przekazać wynik do Debug.WriteLine()?

(Uwaga:. Używam tego produktu w systemie Windows 8.1 64-bit, en-GB, przy użyciu programu Visual Studio 2013 z .Net 4.51 z kompilacji debugowania AnyCPU)

+1

@TimSchmelter: To nie ma nic z tym pytaniem. – SLaks

+0

@TimSchmelter - to do zmiany miejsca docelowego, uszkodzenie (formatowanie) zostało już wykonane. –

Odpowiedz

12

ta jest wyraźnie obsługiwane in the source.

Ma to również sens.
Wyniki debugowania nie powinny mieć wpływu na kulturę użytkowników końcowych; chcesz, aby dzienniki debugowania były spójne, bez względu na to, gdzie kod jest uruchomiony.

+5

Cóż, zaznaczyłem to jako odpowiedź, ale nie zgadzam się z uzasadnieniem. Po pierwsze, dane wyjściowe debugowania nigdy nie pojawią się na komputerze użytkownika końcowego (ponieważ będzie to kompilacja wydania, a nie kompilacja debugowania). Po drugie, chcę mieć daty w formacie brytyjskim, więc nie mieszam ich. Po trzecie, często używa się 'string.Format()' do formatowania wiadomości dla 'Debug.WriteLine()', więc mieszając to możesz uzyskać różne wyniki w zależności od tego, czy użyłeś 'string.Format()' do zbudowania tymczasowego strunowy. –

+2

Co gorsza, 'Debug.WriteLine (date)' daje inny wynik od 'Debug.WriteLine (" {0} ", date)'! –

+1

@MatthewWatson Debugowanie (mam nadzieję) nigdy nie wystąpi na komputerze użytkownika końcowego ... ale może łatwo pochodzić z wielu komputerów deweloperskich, w których programiści są w kilku różnych krajach. W tym scenariuszu chciałbym, aby wszystkie maszyny używały tych samych ustawień kultury. – David

10

Przeciążenie używasz explicitly ignores the culture za pomocą InvariantCulture:

public static void WriteLine(string format, params object[] args) 
{ 
    TraceInternal.WriteLine(String.Format(CultureInfo.InvariantCulture, format, args)); 
} 

Wszystkie inne przeciążenia niczego nie związane z kulturą zrobić. Można "obejść" to za pomocą przeciążenie który przyjmuje string:

public static void WriteLine(string message, string category) 
{ 
    TraceInternal.WriteLine(message, category); 
} 

Robiąc to:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); 
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

DateTime date = new DateTime(2014, 01, 19); 

var formatedDate = string.Format("{0}", date); 
Console.WriteLine(formatedDate); 
Debug.WriteLine(formatedDate); 

Teraz zarówno druk:

19/01/2014 00:00:00 
19/01/2014 00:00:00 
Powiązane problemy