Linq to xml API中 XName 的奇怪实现

简介:

  最近,在使用LinqToXml的时候,使用到其中一个重要的类:XName。它表示一个XML元素/XML属性的“名字”。    System.Xml.Linq中的API,大量使用了这个类,如:

image

    不过还好,我们不用每次都显式的new一个XName类的实例,因为它实现了从string类到它的隐式转换:

public static implicit operator XName(string expandedName);
    这样使得我们在使用的过程中,可以很简单的直接使用linqtoxml的API。如:
XElement person = new XElement("Person");
person.Attribute("Name").Value = "Name";

    同时,由于它也和string类一样,使用了隐式的操作符== 和 !=,所以我们在对它的实例进行判定时,可以使用以下方法:

XName name1 = "name";
XName name2 = "name";
if (name1 == name2)
{
    //do something
}
    当我使用Reflector查看到这个操作符的实现时,它居然是下面这样的!?
image 

    也就是说,它的所有判断相等性,都是使用==操作符,但是这个操作符的实现居然是调用它自己。

    我想,可能是reflector生成的C#有问题,不过查看IL后,也是一样的结果。所以我就写了一个类进行验证:

public class Name
{
    public static bool operator ==(Name left, Name right)
    {
        return (left == right);
    }
    public static bool operator !=(Name left, Name right)
    {
        return !(left == right);
    }

    public static void Test()
    {
        Name name1 = new Name();
        Name name2 = new Name();
        if (name1 == name2)
        {
            //do nothing
        }
    }
}

    结果是:

image


本文转自BloodyAngel博客园博客,原文链接:http://www.cnblogs.com/zgynhqf/archive/2009/11/23/1608804.html,如需转载请自行联系原作者

相关文章
|
3月前
|
XML 缓存 API
【Azure API 管理】使用APIM进行XML内容读取时遇见的诡异错误 Expression evaluation failed. Object reference not set to an instance of an object.
【Azure API 管理】使用APIM进行XML内容读取时遇见的诡异错误 Expression evaluation failed. Object reference not set to an instance of an object.
|
API C# Windows
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
3085 0
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
|
XML JSON 前端开发
软件测试|Spring Boot 的 RESTful API 设计与实现
软件测试|Spring Boot 的 RESTful API 设计与实现
149 0
软件测试|Spring Boot 的 RESTful API 设计与实现
|
NoSQL Java 应用服务中间件
使用ZooKeeper原生API实现分布式锁
分布式锁的引入 一个很典型的秒杀场景,或者说并发量非常高的场景下,对商品库存的操作,我用一个SpringBoot小项目模拟一下。 用到的技术知识: SpringBoot Redis ZooKeeper 我提前将库存 stock 放在redis,初始值为288:
|
SQL 安全 Java
微服务API开放授权平台的设计与实现
微服务API开放授权平台的设计与实现
微服务API开放授权平台的设计与实现
|
人工智能 数据可视化 API
【超简单API实现分割】PaddleSeg 分割之API
【超简单API实现分割】PaddleSeg 分割之API
388 0
【超简单API实现分割】PaddleSeg 分割之API
|
前端开发 JavaScript API
借助 Web Animations API 实现一个鼠标跟随偏移动画
借助 Web Animations API 实现一个鼠标跟随偏移动画
302 0
借助 Web Animations API 实现一个鼠标跟随偏移动画
|
SQL Java 数据库连接
Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
199 0
Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
|
SQL API 数据库
easyswoole快速实现一个网站的api接口程序
easyswoole快速实现一个网站的api接口程序
129 0
easyswoole快速实现一个网站的api接口程序
|
存储 移动开发 前端开发
【前端】【H5 API】实现文件读取操作
【前端】【H5 API】实现文件读取操作
277 0
【前端】【H5 API】实现文件读取操作