2011-11-03 22 views
7

Müşterilerimden biri bir uygulama çökmesi geçirdi ve bu hatayı/özniteliğini açıklayamadım.
WindowsIdentity.GetCurrent() Name.GetHashCode() bu dizgiyi döndürür: -? 2097695743
Evet, bu eksi, boşluk, soru işareti ve sonra gerçek karma numaraları.C# string.GetHashCode() int int sonuç döndürüyor

Bu, garip davranışı gösteren basit bir konsol uygulamasının kodudur.

static void Main(string[] args) 
{ 
    Console.WriteLine("From String: string name = WindowsIdentity.GetCurrent().Name");    
    string name = WindowsIdentity.GetCurrent().Name; 
    Console.WriteLine("name:       " + name); 
    Console.WriteLine("name.GetHashCode().GetType(): " + name.GetHashCode().GetType()); 
    Console.WriteLine("name.GetHashCode():    " + name.GetHashCode()); 
    Console.WriteLine("name.GetHashCode().ToString(): " + name.GetHashCode().ToString()); 
    Console.WriteLine(); 
    Console.WriteLine(); 
    Console.WriteLine("Direct"); 
    Console.WriteLine("WindowsIdentity.GetCurrent().Name:       " + WindowsIdentity.GetCurrent().Name); 
    Console.WriteLine("WindowsIdentity.GetCurrent().Name.GetHashCode().GetType(): " + WindowsIdentity.GetCurrent().Name.GetHashCode().GetType()); 
    Console.WriteLine("WindowsIdentity.GetCurrent().Name.GetHashCode():    " + WindowsIdentity.GetCurrent().Name.GetHashCode()); 
    Console.WriteLine("WindowsIdentity.GetCurrent().Name.GetHashCode().ToString(): " + WindowsIdentity.GetCurrent().Name.GetHashCode().ToString()); 
    Console.WriteLine(); 
    Console.WriteLine(); 
    Console.WriteLine("Press Enter to continue"); 
    Console.ReadLine(); 
} 

Bu yazı çıktısı:

From String: string name = WindowsIdentity.GetCurrent().Name 
name:       COMMARC\tje 
name.GetHashCode().GetType(): System.Int32 
name.GetHashCode():    - ?2097695743 
name.GetHashCode().ToString(): - ?2097695743 

Direct 
WindowsIdentity.GetCurrent().Name:       COMMARC\tje 
WindowsIdentity.GetCurrent().Name.GetHashCode().GetType(): System.Int32 
WindowsIdentity.GetCurrent().Name.GetHashCode():    - ?2097695743 
WindowsIdentity.GetCurrent().Name.GetHashCode().ToString(): - ?2097695743 


Press Enter to continue 

Ve bu aynı çıktı bir örneği verilmiştir:

Weird GetHashCode return value

Sorum şu: Bu nasıl olabiliyor yeryüzünde nedir?

GÜNCELLEME: sorun, negatif sayılar için korkak pencereler ayarlarındandı.

+2

Değil. Terminalin bonker olduğunu sanıyorum. (Diğer bir olasılık, int.ToString() 'in yanlış olduğunu, ancak bundan şüpheliyim.) –

+0

konsol uygulamasının çıktısını'> '(yani' yourApp.exe'> ') kullanarak bir dosyaya yazarsanız ne olur? out.txt') veya 'File.WriteAllText()' veya 'Debug.WriteLine()' gibi bir şey kullanın? – fardjad

+4

Kültür çatışması olabilir. Name.GetHashCode(). ToString (CultureInfo.InvariantCulture) 'yazdırma nedir? –

cevap

8

Bu, istemcinin bilgisayarındaki (ancak sizinki veya bizimkilerimiz) çıktısıysa, kullanıcının makinesinin özellikle "-?" sayısal negatif sembol olarak. Windows bunu yapmanıza veya başka herhangi bir garip biçime izin vermek için mükemmel bir istektir.

Bir sınama olarak, makinemde Windows'u "-?" Kullanacak şekilde yapılandırdım ve örnek çıktılarınızda olduğu gibi çıktılarınızda olduğu gibi basit bir konsol uygulaması çıktı. İstemcinizin makinesinde durum buysa, GetHashCode'un çalışmasıyla ilgili bir sorun yoktur, sadece Windows biçimlendirmesinin bir ürünüdür.

+0

Bunu ilk olarak cevap olarak işaretlerim. İkiniz de doğru. –

7

Sorun GetHashCode() ile değil, sorun Int32.ToString() ile. Kullanıcı, negatif sayıları biçimlendirme tercihlerinin farkındadır. Denetim Masası + Bölge ve Dil, Biçimler sekmesi, Ek Ayarlar düğmesi. Sayılar sekmesi, Negatif işaret sembol ayarı. Bu iletişim kutusu, Windows'un önceki sürümlerinde biraz farklı çalışır, Windows 7 sürümünü açıkladım.