C# 参数中this 表示扩展扩展方法

2023-11-02

怎么使用

public static SlicedHull Slice(this GameObject obj, Vector3 position, Vector3 direction, Material crossSectionMaterial = null) {
            return Slice(obj, position, direction, new TextureRegion(0.0f, 0.0f, 1.0f, 1.0f), crossSectionMaterial);
        }

例如这个代码中的this 相当于给GameObject类增加了一个新的成员方法Slice
为什么这里会有一个this关键字,做什么用?其实这就是扩展方法!这个扩展方法在静态类中声明,定义一个静态方法,其中第一个参数定义可它的扩展类型。Foo()方法扩展了String类,因为它的第一个参数定义了String类型,为了区分扩展方法和一般的静态方法,扩展方法还需要给第一个参数使用this关键字。

作用

扩展方法可以写入最初没有提供该方法的类中。还可以把方法添加到实现某个接口的任何类中,这样多个类可以使用相同的实现代码。

归纳

  • 通过这个属性可以让程序员在现有的类型上添加扩展方法(无需创建新的派生类型、重新编译或者以其他方式修改原始类型)。
  • 扩展方法是一种特殊的静态方法,虽然是静态方法,但是可以像使用类型上的实例方法一样去使用扩展方法(调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异)。
  • 扩展方法的第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符为前缀。
  • 当你在其他命名空间使用时,需要用using将扩展方法所在命名空间显式导入到源代码中。
  • 扩展方法必须在非范型静态类中定义。
  • 扩展方法无法访问扩展类型中的私有变量。
  • 可以使用扩展方法来扩展类或接口,但不能重写扩展方法。
  • 与接口或类方法具有相同名称和签名的扩展方法永远不会调用(这一点要牢记)。编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。换句话说,如果某个类型具有一个名为Process(int i)的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。如果未找到任何匹配方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。
  • 通常建议你只在不得已的情况下才实现扩展方法,并谨慎地实现。只要有可能,必须扩展现有类型的情形都应该通过创建从现有类型派生新类型来达到这一目的。
    在使用扩展方法来扩展你无法更改其源代码的类型时,你需要承受该类型实现中的更改会导致扩展方法失效的风险。
  • 在代码中,可以使用实例方法语法调用扩展方法。但是,编译器生成的中间语言(IL)会将代码转换为对静态方法的调用。因此,并未真正违反封装原则。实际上,扩展方法无法访问他们所扩展的类型中的私有变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 参数中this 表示扩展扩展方法 的相关文章

随机推荐

  • springcloud gateway 连接保活问题

    项目中使用了springcloud gateway作为网关 上游与负载均衡服务器连接 近期通过监控系统观察 发现网关与上游负载均衡服务器保持的TCP连接有300 初步怀疑是调用方未释放连接 用如下方法进行分析 1 周期性采集当前建立的连接及
  • C语言提高篇(wchar_t)字符类型

    概述 原来C语言也阔以这么秀 来自于灵感的编程思想 在很多大型项目上见过类似的写法 所以今天写个Demo 记录一下 方便以后赏阅 IDE vscode 1 源码 define ARRAY SIZE array sizeof array si
  • 数据结构与算法导读

    之前学过许多千奇百怪的算法 但是许多其实并没有真正动手码过代码 因此我希望能够在接下来的六个月里 把我学过的大部分算法码一遍 巩固基础知识 提高码题技巧 如果还有精力 我会尝试把一些算法竞赛题写在博客里 让大家感受一下基本算法求解复杂问题同
  • python基础----09-----类、对象、魔法方法、封装、继承、类型注解、多态、数据分析案例

    一 初识对象 说白了就是类的实例化 类是一个抽象层的定义 例如下面class Student就是定义的一个类 它是抽象层 然后stu 1 Student 我们根据类创建了一个对象 就是对类的实例化 这个实例化对象我们是可以操作的 if na
  • ElasticSearch自定义评分-看这篇就够了

    文章目录 一 适用的场景 1 基本介绍 2 使用场景 2 1根据价格评分排序 2 2根据距离评分排序 2 3根据距离价格综合评分排序 2 4自定义编写脚本 二 常用的字段解释 1 整体结构 2 function score 2 1 quer
  • [leetcode 周赛 148] 1145 二叉树着色游戏

    目录 1145 Binary Tree Coloring Game 二叉树着色游戏 描述 思路 代码实现 1145 Binary Tree Coloring Game 二叉树着色游戏 描述 有两位极客玩家参与了一场 二叉树着色 的游戏 游戏
  • python中if__name__=='__main__'_python中的if __name__=='__main__': main()解析

    python中我们会看到一段代码是这样的 1 if name main 2 main 这段代码的什么意思 我们可以知道代码的意思是如果 name main 为Ture 则调用main 函数 有句话经典的概括了这段代码的意义 Make a s
  • OSCS开源安全周报第 55 期:JeecgBoot 远程代码执行漏洞

    本周安全态势综述 OSCS 社区共收录安全漏洞 11 个 公开漏洞值得关注的是 JeecgBoot 远程代码执行漏洞 企业微信私有化后台API未授权访问漏洞 WPS Office 存在代码执行漏洞 MPS 3pcb l4mv Microso
  • 前端常用的跨域方案

    目录 前言 跨域 解决跨域方案 一 修改本地HOST 二 JSONP 三 CORS 四 proxy 前言 发送请求XMLHttpRequest ajax ajax axois fetch http 192 168 0 103 8080 fi
  • Google Colab启动TensorFlow出现No dashboards are active for the current data set.

    我在Colab上面跟着federated learning for image classification教程做相关的东西 在用到tensorbord的时候 使用如下代码 test skip true load ext tensorboa
  • Android 大图显示优化方案-加载Gif 自定义解码器

    基于Glide做了图片显示的优化 尤其是加载Gif图的优化 原生Glide加载Gif图性能较低 在原生基础上做了自定义解码器的优化 提升Glide性能 Glide加载大图和Gif 尤其是列表存在gif时 会有明显卡顿 cpu和内存占用较高
  • JS中版本号的比较(AI)

    在 JavaScript 中 您可以使用字符串比较算法比较版本号 版本号通常采用 x y z 格式 其中 x y 和 z 均为数字 表示主版本号 次版本号和修订版本号 以下是比较版本号的一些示例代码 示例1 简单比较 AI 您可以使用比较运
  • 线性调频脉冲压缩

    线性调频脉冲压缩 LFM信号的数学表达式为 式中为f c载波频率 rect t T 为矩形信号 K B T是调频斜率 信号的顺势频率为f c Kt T 2 t T 2 典型线性调频信号如下图 在MATLAB中实验结果如下 在远场设置了一个目
  • 3. 自建DNS(bind9)

    3 自建DNS bind9 扩展关键词 web dns NamedManager 是一个基于Web的DNS管理系统 注意 下文操作是在172 10 10 11机器上处理的 关键配置注意对应 各主机ip 及其hostname的设置 一 bin
  • C++中class关键字

    在C 语言中class是定义类的关键字 C 中也可以使用struct定义类 两者区别是 用class定义的类 如果数据成员或成员函数没有说明则默认为private 私有 的 而用struct定义的 默认为public 公共 的 示例 inc
  • Vue-Vue列表渲染v-for

    v for 指令需要以 site in sites 形式的特殊语法 一 v for 循环数组 HTML代码 div ul li item li ul div JS代码 new Vue el app data list red green b
  • 数据结构中常见的树

    哈夫曼树 Huffman Tree 哈夫曼树 又被称为最优二叉树 属于带权值二叉树的一种 它的真实节点全部分布在叶子节点中 是各种可能的组合中 WPL 值最小的形式 组合形式可能不唯一 但 WPL 值一定为最小 介绍一下 WPL Weigh
  • c语言repeat语句的用法,关于Lua中的repeat...until循环语句的使用教程

    关于Lua中的repeat until循环语句的使用教程 这篇文章主要介绍了Lua中的repeat until循环语句使用教程 是Lua入门学习中的基础教程 需要的朋友可以参考下与for和while循环不同 在循环的顶部测试循环条件 Lua
  • 【JavaWeb】PowerDesigner的使用

    PowerDesigner 数据库设计的工具 01 PowerDesigner概述 02 数据模型 2 1 概念数据模型 2 1 1 PowerDesigner使用之概念数据模型 2 1 2 根据概念模型生成物理模型 2 2 物理数据模型
  • C# 参数中this 表示扩展扩展方法

    怎么使用 public static SlicedHull Slice this GameObject obj Vector3 position Vector3 direction Material crossSectionMaterial