2011-11-03 40 views
7

我的一個客戶有一個應用程序崩潰,我跟蹤它,因爲這個錯誤/功能我不能真正解釋。
WindowsIdentity.GetCurrent()。Name.GetHashCode()返回下面的字符串: - ?2097695743
是的,那是一個負號,一個空格,一個問號,然後是實際的散列號。C#string.GetHashCode()返回非int結果

這是一個簡單的控制檯應用程序的代碼,顯示怪異的行爲。

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

這是文本輸出:

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 

這是相同輸出的圖片:

Weird GetHashCode return value

我的問題是:該如何在地球上是可能的嗎?

更新:問題是與負數的時髦的Windows設置。

+2

不是。我懷疑終端是瘋子。 (唯一的另一種可能性是'int.ToString()'不正確,但我懷疑這一點。) – 2011-11-03 21:39:01

+0

如果使用'>'將控制檯應用程序的輸出寫入文件,那該怎麼辦(例如'yourApp.exe'> out.txt')或使用類似於'File.WriteAllText()'或'Debug.WriteLine()'? – fardjad

+4

這可能是文化衝突。什麼'Name.GetHashCode()。ToString(CultureInfo.InvariantCulture)'print? –

回答

8

如果這是客戶端計算機上的輸出(但不是您的或我們的計算機上的輸出),則用戶的計算機可能特別配置了使用「 - ?」的窗口。作爲數字負號。 Windows完全願意讓你這樣做,或者其他奇怪的格式。

作爲一項測試,我剛剛在我的機器上配置了Windows,使用「 - ?」,並像您的示例輸出一樣運行一個簡單的控制檯應用程序,如您的輸出高速格式化的負數。如果客戶機器上出現這種情況,GetHashCode的操作沒有任何問題,它只是Windows格式化的一個工件。

+0

我會將它標記爲答案,因爲它是第一個。你們兩個都是對的。 –

7

問題不在於GetHashCode(),問題在於Int32.ToString()。哪些知道用戶對格式化負數的偏好。控制面板+區域和語言,格式選項卡,其他設置按鈕。數字選項卡,負號符號設置。這個對話框在Windows的早期版本中有點不同,我描述了Windows 7的版本。