2015-01-19 1 views
13

Рассмотрим следующую консоль App код:Debug.WriteLine() versus Console.WriteLine() обрабатывает культуру по-разному. Зачем?

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 

Как было отмечено в комментариях, то Console.WriteLine() отпечатки 19/01/2014 в то время как Debug.WriteLine() отпечатков 01/19/2014.

Еще хуже - Debug.WriteLine("{0}", date) дает другой выход из Debug.WriteLine(date) ...

ли он ожидать, что Debug.WriteLine() игнорирует параметры Культивируют потока?

Есть ли способ сделать Debug.WriteLine() использовать настройки культуры темы? Или я должен использовать String.Format() и передать результат Debug.WriteLine()?

(Примечание. Я бегу это на Windows, 8.1 64-битная, еп-ГБ, с помощью Visual Studio 2013 с .Net 4.51 с отладки AnyCPU сборки)

+1

@TimSchmelter: То есть ничего сделайте с этим вопросом. – SLaks

+0

@TimSchmelter - это для изменения места назначения, повреждение (форматирование) уже было выполнено. –

ответ

12

Это явно обрабатывается in the source.

Это тоже имеет смысл.
Отладочная продукция не должна зависеть от культуры конечных пользователей; вы хотите, чтобы ваши журналы отладки были согласованы независимо от того, где работает код.

+5

Ну, я отметил это как ответ, но я не согласен с рассуждениями. Во-первых, отладочный вывод никогда не будет возникать на компьютере конечного пользователя (потому что это будет сборка релиза, а не сборка отладки). Во-вторых, я хочу иметь даты в британском формате, поэтому я не смешиваю их. В-третьих, обычно используется 'string.Format()' для форматирования сообщений для 'Debug.WriteLine()', поэтому, смешивая это, вы можете получать разные выходы в зависимости от того, используете ли вы 'string.Format()' для создания промежуточного строка. –

+2

И что еще хуже, 'Debug.WriteLine (date)' дает вам другой результат из 'Debug.WriteLine (« {0} », date)'! –

+1

@ Вывод Debug на MatthewWatson будет (надеюсь) никогда не появляться на ПК конечного пользователя ... но он может легко появиться на нескольких компьютерах разработчиков, где разработчики находятся в нескольких разных странах. В этом случае я хотел бы, чтобы все машины использовали одни и те же настройки культуры. – David

10

Перегрузка вы используете explicitly ignores the culture с помощью InvariantCulture:

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

Все остальные перегруженные делать все, что связано с культурой не делать. Вы не можете "обойти" это, используя перегрузку, которая принимает string:

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

Делая это:

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); 

Теперь как печать:

19/01/2014 00:00:00 
19/01/2014 00:00:00 
Смежные вопросы