问题描述

在查看.NET代码的时候,发现一个静态方法,第一个参数使用 this 关键字,它在这里是什么作用呢?

public static XElement AquireElement(this XContainer container,
        string name, bool addFirst = false)
    {
      ...
  • 1.
  • 2.
  • 3.
  • 4.


问题解答

通过查看微软的官方博文介绍( https://asp-blogs.azurewebsites.net/scottgu/new-orcas-language-feature-extension-methods), 这是C#的功能:扩展方法。

扩展方法允许开发人员向现有 CLR 类型的公共协定添加新方法,而无需对其进行子类化或重新编译原始类型。  

扩展方法有助于将当今动态语言中流行的“鸭子类型”支持的灵活性与强类型语言的性能和编译时验证相结合。

利用新的扩展方法功能向各个类型添加方法,为开发人员提供了许多有用的可扩展性场景。  然而,扩展方法真正强大的原因在于它们不仅能够应用于单个类型,而且还能够应用于 .NET中的任何父基类或接口。 

这使得开发人员能够构建各种丰富的、可组合的框架扩展,这些扩展可以在 .NET 中使用。

例如:

public static int Foo(this MyClass arg)
  • 1.

就可以用

MyClass myClass = new MyClass();
int i = myClass.Foo();
  • 1.
  • 2.

代替传统的写法

MyClass myClass = new MyClass();
int i = Foo(myClass);
  • 1.
  • 2.

如果MyClass类是同一个项目里面的类,那么此方法优势不明显。 但是如果 MyClass类是由其它第三方开发,然后只是在自己的项目中引用。

那么,扩展方法(this)就非常强大。

本文中遇见的就是对System.Xml.Linq基类中的XContainer对象进行了扩展。添加了获取一个指定元素的扩展方法AquireElement,如元素不存在,则创建。

public static class XmlLinqExtensions
    {
        public static XElement AquireElement(this XContainer container,
            string name, bool addFirst = false)
        {
            var element = container.Element(name);

            if (null != element)
            {
                return element;
            }

            element = new XElement(name);

            if (addFirst)
            {
                container.AddFirst(element);
            }
            else
            {
                container.Add(element);
            }

            return element;
        }
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

使用时

//XDocument document; 

var configElement = document.AquireElement("configuration", addFirst: true);
var configSections = configElement.AquireElement("configSections", addFirst: true);
  • 1.
  • 2.
  • 3.
  • 4.

PS: 原生类中并没有包含AquireElement方法。

【Azure Developer】C# / .NET 静态函数中this关键字的作用_.net

 

参考资料

Extension Methods : https://asp-blogs.azurewebsites.net/scottgu/new-orcas-language-feature-extension-methods

Use of "this" keyword in formal parameters for static methods in C# :  https://stackoverflow.com/questions/846766/use-of-this-keyword-in-formal-parameters-for-static-methods-in-c-sharp

 

 


当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!