当我用三种方式创建同一个国家的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”.