现在的位置: 首页 > 综合 > 正文

.NET(C#):RegionInfo令人费解的Name和Equals

2013年04月04日 ⁄ 综合 ⁄ 共 1289字 ⁄ 字号 评论关闭

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

 

Open-mouthed smile

抱歉!评论已关闭.