2015-01-19 14 views
13

aşağıdaki Konsol App kodu göz önünde bulundurun: açıklamalarda belirtildiği gibiDebug.WriteLine(), Console.WriteLine() öğesine karşı kültürü farklı şekilde işler. Niye ya?

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 

, Debug.WriteLine() baskılar 01/19/2014 ise Console.WriteLine() baskılar 19/01/2014.

Daha da kötüsü - Debug.WriteLine("{0}", date)

o Debug.WriteLine() parçacığının kültür ayarlarını göz ardı beklenmektedir mı ... Debug.WriteLine(date) farklı çıktı verir?

Debug.WriteLine() iş parçacığının kültür ayarlarını kullanmanın bir yolu var mı? Veya String.Format() kullanmalı ve sonucu Debug.WriteLine() mu geçirmeliyim?

(Not:. Ben bir hata ayıklama AnyCPU yapı ile .Net 4.51 ile Visual Studio 2013 kullanılarak, en-GB, Windows 8.1'de 64-bit bu çalıştırıyorum)

+1

@TimSchmelter: Yani hiçbir şey zorundadır Bu soru ile yapmak. – SLaks

+0

@TimSchmelter - bu hedefi değiştirmek için, daha sonra hasar (biçimlendirme) yapıldı. –

cevap

12

Bu açıkça in the source ele alınır.

Bu da mantıklı.
Hata ayıklama çıktısı son kullanıcı kültüründen etkilenmemelidir; Kodun çalıştığı yerde, hata ayıklama günlüklerinin tutarlı olmasını istiyorsunuz.

+5

Peki, bunu cevap olarak işaretledim, ancak gerekçeye katılmıyorum. Öncelikle, hata ayıklama çıkışı, bir son kullanıcının bilgisayarında asla oluşmaz (çünkü bir sürüm oluşturma, bir hata ayıklama yapısı değil). İkincisi, tarihleri ​​İngiltere formatına sahip olmak istiyorum, böylece onları karıştırmam. Üçüncü olarak, 'Debug.WriteLine()' için mesajları biçimlendirmek için 'string.Format()' işlevini kullanması yaygındır, bu yüzden bunu karıştırarak, "string.Format()" ifadesini kullanıp kullanmayacağınıza bağlı olarak farklı çıkışlar elde edebilirsiniz. dize. –

+2

Ve daha da kötüsü, 'Debug.WriteLine (tarih)' size Debug.WriteLine ("{0}", tarih) 'den farklı bir sonuç verir! –

+1

@MatthewWatson Debug çıkışı, bir son kullanıcının PC'sinde asla gerçekleşmeyecek (umarım) ... fakat geliştiricilerin birkaç farklı ülkede bulunduğu çoklu geliştirici bilgisayarlardan kolayca gelebilir. Bu senaryoda, tüm makinelerin aynı kültür ayarlarını kullanmasını isterim. – David

10

Eğer InvariantCulture kullanarak explicitly ignores the culture kullandığınız aşırı yük:

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

Tüm diğer aşırı yüklenmeler kültürüne ilişkin bir şey yapmayın. Sen "geçici çözüm" Bu string alır aşırı kullanarak yapabilirsiniz: Artık hem baskı

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

: Bunu yaparak

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

19/01/2014 00:00:00 
19/01/2014 00:00:00 
İlgili konular