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

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

问题描述

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

public static XElement AquireElement(this XContainer container,
        string name, bool addFirst = false)
    {
      ...

问题解答

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

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

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

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

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

例如:

public static int Foo(this MyClass arg)

就可以用

MyClass myClass = new MyClass();

int i = myClass.Foo();

代替传统的写法

MyClass myClass = new MyClass();

int i = Foo(myClass);

如果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;
        }
    }

使用时

//XDocument document;


var configElement = document.AquireElement("configuration", addFirst: true);

var configSections = configElement.AquireElement("configSections", addFirst: true);

 

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

 

参考资料

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

 

相关文章
|
JSON C# 数据格式
【Azure Function】C#独立工作模式下参数类型 ServiceBusReceivedMessage 无法正常工作
Cannot convert input parameter 'message' to type 'Azure.Messaging.ServiceBus.ServiceBusReceivedMessage' from type 'System.String'.
386 73
|
开发框架 安全 .NET
【Azure Developer】.NET Aspire 项目本地调试遇 Grpc.Core.RpcException 异常( Error starting gRPC call ... )
Error starting gRPC call. HttpRequestException: The SSL connection could not be established, see inner exception. AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
561 12
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
650 18
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
672 0
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
799 12
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
317 6
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
338 6
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
378 6
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
1143 13
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
1194 5