當我用三種方式建立同一個國家的RegionInfo後,本以為他們都相等,可沒想到事實並不是這樣,來看代碼:
用”zh-cn”,”cn”和2052(LCID)建立中國的RegionInfo。然後看看他們是不是都相等。
var regions = new RegionInfo[]
{
new RegionInfo("zh-cn"),
new RegionInfo("CN"),
new RegionInfo(2052)
};
Console.WriteLine(regions.All(r => r.Equals(new RegionInfo("zh-cn"))));
結果竟然是False!什嗎?難道這三個RegionInfo有一個不代表中國嗎?
我又輸出了RegionInfo的一些屬性,什麼三個RegionInfo卻是都代表中國,但是RegionInfo的Name的值卻不一樣:
static void Main()
{
var regions = new RegionInfo[]
{
new RegionInfo("zh-cn"),
new RegionInfo("CN"),
new RegionInfo(2052)
};
PrintRegionInfo(regions[0]);
PrintRegionInfo(regions[1]);
PrintRegionInfo(regions[2]);
}
static void PrintRegionInfo(RegionInfo r)
{
Console.WriteLine(r.Name);
Console.WriteLine(r.DisplayName);
Console.WriteLine(r.TwoLetterISORegionName);
Console.WriteLine(r.ThreeLetterISORegionName);
Console.WriteLine();
}
輸出:
zh-CN
People's Republic of China
CN
CHN
CN
People's Republic of China
CN
CHN
CN
People's Republic of China
CN
CHN
當使用RegionInfo的字串建構函式後,Name屬性會是這個字串,而如果使用LCID,Name會是相應國家名稱的兩個字母縮寫。
而RegionInfo的Equals方法則只會通過Name屬性做判斷:
//RegionInfo.Equals方法原始碼 (.NET 4.0)
public override bool Equals(object value)
{
RegionInfo info = value as RegionInfo;
return ((info != null) && this.Name.Equals(info.Name));
}
因此最上面3個看似相同的RegionInfo卻不相同的原因,就是第一個用”zh-cn”初始化的RegionInfo的Name是”zh-cn”,而後兩個是”CN”.