首页 > 编程语言 >【Azure Developer】C#/.NET 静态函数中this关键字的作用

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

时间:2024-07-16 20:19:21浏览次数:15  
标签:AquireElement C# 扩展 element static addFirst Azure MyClass NET

问题描述

在查看.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

 

 

标签:AquireElement,C#,扩展,element,static,addFirst,Azure,MyClass,NET
From: https://www.cnblogs.com/lulight/p/18306029

相关文章

  • SMU Summer 2024 Contest Round 4
    AMadeUp思路:统计A的个数,O(1)统计cnt[bc]voidsolve(){intn;cin>>n;vector<int>cnt(n+1),b(n+1);for(inti=1;i<=n;++i){intx;cin>>x;cnt[x]++;}for(inti=1;i<=......
  • 云计算实训06——find、stat、touch、tree、scp、crontab指令相关应用
    一、find命令1.find的作用:对文件进行搜索2.基本语法:                    find[文件路径][选项选项的值]3.常见的选项-name根据文件的名称搜索文件,支持通配符*-typef 代表普通文件,-typed代表目录4.*通配符在l......
  • snipaste最强平替!轻松搞定截图贴图还有OCR文字识别!工作效率提高300%
    Snipaste一直被吐槽没有OCR功能,而且功能也一直没有优化,不少小伙伴都在问有没有类似的平替?当然有啦!小编为您挖到一款超强的国产软件——千鹿设计助手,它堪称是Snipaste的完美平替!目前千鹿设计助手还在不断优化功能,小编这边也要到了注册码:rGUHvi,小伙伴们可以试试,看看下面的......
  • 【c语言】函数递归的一些例题1.编写一个函数,不许创建临时变量,求字符串长度 2.求n的阶
    1.intmy_strlen(char*str){   if(*str!='\0')   {      return1+my_strlen(str+1);//利用递归求字符串长度:递归一次就是多一个字符这样就可以求出字符串的长度了   }   else      return0;}intmain(){   //编写......
  • Typescript 中 interface 和 type 的区别
    在TypeScript中,interface​和type​是用来描述对象结构或类型的两种主要方式,它们有一些区别和各自的特点。Interface(接口)定义方式:使用interface​关键字定义,例如:interfacePerson{name:string;age:number;}适用场景:主要用于描述对象的形状(Sh......
  • [智能网联汽车] CAN Log 文件 - ASC文件格式 [转]
    0引言因工作研究需要,担心精华内容丢失。故全文转载,转载自:图文详解CANLog文件-ASC文件格式-CSDNVector提供了两种记录数据格式的格式规范:BLF和ASC。在Vector提供的CAN_LOG_TRIGGER_ASC_Format.pdf文件中,规定了CANoe/CANalyzerASC记录中CAN、Log和Triggerevent的格......
  • openStack核心组件的工作流程
    目录openStack核心组件的工作流程1.Keystone1.1User1.2Credentials1.3Authentication1.4Token1.5Project1.6Service1.7Endpoint1.8Role1.9keystone综述2.glance2.1glance-api2.2glance-registry2.3backend2.4glance综述3.placement4.nova4.1nova-api4.2nova-s......
  • TS 入门(五):TypeScript接口与类
    目录前言回顾高级类型与类型操作1.接口a.基本接口b.可选属性和只读属性c.函数类型接口d.可索引类型e.接口继承2.类a.基本类b.类的成员(属性和方法)c.构造函数d.继承和派生类e.公有、私有和受保护的修饰符f.静态属性和方法g.抽象类扩展知识点:接口与类的结合......
  • Oracle数据闪回
    Oracle的闪回功能可以在对数据库进行不完全恢复的情况下,对某一个指定的表进行恢复。闪回数据库是进行时间点恢复的新方法,它能够快速将Oracle恢复到以前的时间,以更正由于逻辑数据损坏或用户错误而引起的问题。当需要恢复时,可以将数据库恢复到错误前的时间点,并且只恢复改变的数......
  • gdb调试c、cpp源代码方法步骤
    1.代码举例//example.c#include<stdio.h>intaddNumbers(intnum1,intnum2){returnnum1+num2;}intmain(){inta=10;intb=20;intsum=addNumbers(a,b);printf("Thesumis:%d\n",sum);return0;}......