C#方法详解

总目录


文章目录

  • 总目录
  • 前言
  • 一、方法概述
    • 1、方法签名
    • 2、调用/访问方法/方法形参与实参
  • 二、扩展方法
    • 1.实现扩展方法
    • 2、扩展方法调用
    • 3、优先级问题
    • 4、其他扩展方法示例
      • 1.获得枚举的Description
      • 2.其他常用扩展方法
  • 三、方法参数列表详解
    • 1、可选自变量(可选参数)
    • 2、命名自变量(命名参数)
    • 3、可变数量参数
  • 结语


前言

方法是包含一系列语句的代码块。 程序通过调用该方法并指定任何所需的方法参数使语句得以执行。


一、方法概述

Main 方法是每个 C# 应用程序的入口点,并在启动程序时由公共语言运行时 (CLR) 调用。 在使用顶级语句的应用程序中,Main 方法由编译器生成并包含所有顶级语句。

1、方法签名

方法的访问修饰符(如 publicprivate),可选修饰符(如 abstractsealed),返回值,方法的名称,方法的参数列表,这些一同构成了方法的签名

  • 当我们写重载方法的时候,要求方法签名中的 方法名相同即可
  • 当我们写委托的时候以及对应的方法的时候,需要签名中的返回值和参数列表相同

以下案例包含四种方法的形式:

abstract class Motorcycle
{
    // Anyone can call this.
    public void StartEngine() {/* Method statements here */ }

    // Only derived classes can call this.
    protected void AddGas(int gallons) { /* Method statements here */ }

    // Derived classes can override the base class implementation.
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }

    // Derived classes must implement this.
    public abstract double GetTopSpeed();
}

2、调用/访问方法/方法形参与实参

调用/访问( 略过):通过方法名调用方法,形如:xxxx.方法名();

        public double Sum(double num1, double num2)
        {
            return num1 + num2;
        }

如上(double num1, double num2)声明在方法的参数列表中的变量,就是形参

        public void Show()
        {
            int numA = 12345;
            double result = Sum(numA, 12);
            Console.WriteLine($"计算结果:{result}");
        }

如上numA 和 12 均是实参,用于初始化形参的表达式或变量称作为实参,实参位于方法调用的参数列表中。

二、扩展方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种静态方法,但可以像扩展类型上的实例方法一样进行调用。

1.实现扩展方法

为一个现有类型(类,接口,string,int 等数据类型)添加扩展方法,需要三个要素:

  • 1.扩展方法所在的类为静态类
  • 2.扩展方法本身要为静态方法
  • 3.扩展方法的第一个参数要用关键字this,指向要扩展的类型

代码如下(示例):

    public class DomainEntity
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public static class DomainEntityExtensions
    {
        public static string FullName(this DomainEntity value)
            => $"{value.FirstName} {value.LastName}";
    }

2、扩展方法调用

        public void Test()
        {
            DomainEntity domainEntity = new DomainEntity()
            {
                Id=1,
                FirstName= "Benjamin",
                LastName= "Franklin"
            };
            //调用:方式1(类似于xxx.ToString())
            string fullName = domainEntity.FullName();
            Debug.WriteLine($"输出结果:{fullName}");//输出结果:Benjamin Franklin

            //调用:方式2,通过静态类,像实例方法一样传入参数调用
            fullName = DomainEntityExtensions.FullName(domainEntity);
            Debug.WriteLine($"输出结果:{fullName}");输出结果:Benjamin Franklin
        }

3、优先级问题

当扩展方法与 类中已有的方法重名时,类中的实例方法的优先级高于扩展方法

4、其他扩展方法示例

1.获得枚举的Description

    public static class MyExtension
    {
        /// <summary>
        /// 扩展方法,获得枚举的Description
        /// </summary>
        /// <param name="value">枚举值</param>
        /// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
        /// <returns>枚举的Description</returns>
        public static string GetDescription(this Enum value, Boolean nameInstead = true)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name == null)
            {
                return null;
            }

            FieldInfo field = type.GetField(name);
            DescriptionAttribute attribute = System.Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;

            if (attribute == null && nameInstead == true)
            {
                return name;
            }
            return attribute?.Description;
        }
    }
    public enum City
    {
        [Description("北京(首都)")]
        BeiJing,

        [Description("上海")]
        ShangHai,

        [Description("广州")]
        GuangZhou,
    }

        public void Test()
        {
            City city = City.BeiJing;
            var res= city.GetDescription();
            Debug.WriteLine(res);//北京(首都)
        }

2.其他常用扩展方法

常见扩展方法

三、方法参数列表详解

1、可选自变量(可选参数)

在这里插入图片描述
由上图可知,我们使用可选参数的时候,有以下几点需要注意:

  • 1 方法的参数列表中,可选参数不可在必需参数之前
  • 2 方法的参数列表中,可以均使用可选参数,也可均不使用,也可部分使用(部分使用时需遵循第一点规则)

2、命名自变量(命名参数)

在这里插入图片描述

3、可变数量参数

使用 params 关键字可以指定采用数目可变的参数的方法参数。

  • 参数类型必须是一维数组。
  • 在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。
  • 在使用不定长参数params时,如果除了params参数还有其他参数,params参数要作为最后一个参数.否则程序无法识别.

在这里插入图片描述


结语

以上就是本文的内容,希望以上内容可以帮助到您,如文中有不对之处,还请批评指正。


参考资料:
C#编程指南 - 方法
方法参数(C# 参考)
C#中的参数和调用方式(可选参数、具名参数、可空参数、不定长参数)
C#参数详解一(形参和实参)
常见扩展方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/4070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析 MVC 模式与三层架构

文章目录1. 前言2. MVC模式3. 三层架构4. MVC和三层架构5. 总结5.1 IDEA 小技巧1. 前言 前面我们探讨了 JSP 的使用&#xff0c;随着计算机技术的不断更新迭代&#xff0c;JSP 的技术由于存在很多的缺点&#xff0c;已经逐渐退出了历史的舞台&#xff0c;所以在学习时&#xf…

Google代码覆盖率最佳实践

软件质量保障: 所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。谷歌一直倡导的领域之一是使用代码覆盖率数据评估风险并识别测试中的真空。然而&#xff0c;代码覆盖率的价值一直是个争议的话题。每次聊到代码覆盖率时&#xff0c;似乎都会引发无尽的争论。由于大家固…

88、K-Planes: Explicit Radiance Fields in Space, Time, and Appearance

简介 主页&#xff1a;https://sarafridov.github.io/K-Planes/ 图像使用一个平面表示&#xff0c;静态三维场景用三个平面表示&#xff0c;后续动态场景用三个平面加一维时间 t 表示&#xff0c;论文提出使用六个平面表示动静态场景&#xff0c;即静态场景占三个平面&#x…

【超详细文件操作(三)】C语言

作者&#xff1a;日出等日落 专栏&#xff1a;C语言 只有流过血的手指&#xff0c;才能弹出世间的绝唱。 ——泰戈尔 目录 1.文件的随机读写 1.1 fseek函数 1.1.1 下面使用fseek函数 1.2 ftell函数 1.3 rewind函数 …

Spring源码分析-Bean创建流程三

目录 一、 列举一些创建对象有哪几种方式 二、自定义BeanPostProcess生成代理对象 1、实战案例 2、源码分析 三、通过supplier创建对象 1、实战案例 2、源码分析 四、通过FactoryMethod创建对象 1、实战案例 2、源码分析 五、小总结 一、 列举一些创建对象有哪几种方…

作为一个女测试员是什么样的体验?

面试时极度紧张&#xff0c;语无伦次&#xff0c;觉得肯定没戏&#xff0c;最后却拿到高薪offer。 工作之后我听同事们讲&#xff0c;测试总监面试官并没打算要我&#xff0c;但身边的人都问他&#xff1a; 那个小姐姐什么时候来报道&#xff1f;... 于是在众人的期待的目光…

撮合交易系统简介

1 撮合交易系统简介 金融市场&#xff1a; 为了应对更高峰值的成交量&#xff0c;国内各金融机构&#xff0c;主要是交易所和银联、中心之间需求越来越多&#xff1a; 其中最重要的就是撮合系统&#xff1a; 系统拓扑图&#xff1a; 委托终端/柜台&#xff1a; 网关&#xff1…

一四三、人脸识别自动点赞、关注

文章目录脚本功能获取video当前播放帧图片将图片传到后台调用百度人脸识别接口拿到识别结果处理逻辑效果展示问题记录脚本功能 通过获取video当前播放帧图片&#xff0c;截图调用后台接口&#xff0c;再调用百度人脸识别拿到人脸信息&#xff08;年龄、颜值、性别等&#xff09…

元宇宙医生虚拟形象提高远程医疗服务质量

与现实中不同&#xff0c;3D虚拟形象是由个人在数字空间中自由选择并进行扮演的。这种3D虚拟形象在元宇宙中的重要性越来越突出。 在元宇宙虚拟空间中&#xff0c;用户借助元宇宙3D虚拟形象就能与其他用户互动、交流并获得真实的沉浸式体验&#xff0c;因此能广泛融入各种生活、…

「解析」牛客网-华为机考企业真题 41-60

又是一年春招时&#xff0c;有幸收到华为自动驾驶算法岗&#xff0c;之前刷题不多&#xff0c;在此汇总下牛客网的真题&#xff0c;主要采用Python编写&#xff0c;个人觉得语言只是实现工具而已&#xff0c;并不是很关键&#xff0c;Python简洁易懂&#xff0c;更加适合算法工…

基于EB工具的TC3xx_MCAL配置开发06_PWM模块配置

目录 1.概述2. EB配置2.1 PWM->General2.2 PWM->Channel2.2.1 PWMChannel配置2.2.2 PwmChannelClass配置2.2.3 GTM通道选取2.3 MCU关联配置2.4 Port关联配置1.概述 本篇开始我们基于EB Tresos工具对英飞凌TC3xx系列MCU的MCAL开发进行介绍,结合项目经验对各MCAL外设的开…

Docker:关于 Dockerfile 编写优化的一些笔记整理

写在前面 分享一些 Dickerfile 构建镜像优化方式的笔记理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#…

【React全家桶】Flux与Redux

&#x1f39e;️&#x1f39e;️&#x1f39e;️ 博主主页&#xff1a; 糖 &#xff0d;O&#xff0d; &#x1f449;&#x1f449;&#x1f449; react专栏&#xff1a;react全家桶 &#x1f339;&#x1f339;&#x1f339;希望各位博主多多支持&#xff01;&#xff01;&a…

javaScript扫雷

文章目录一、准备工作1.图片2.html2.css3.js二、初始化数据1. 配置文件2.工具文件3.逻辑文件1.main函数2.init函数1.随机生成雷2.css添加三、完整代码1.html2.js3.css一、准备工作 1.图片 需要找三张图片 旗子的图片 炸弹的图片 爆炸的图片 2.html html文件夹新建一个html文…

区块链基本原理

区块链的起源 创始者介绍 姓名&#xff1a;中本聪&#xff08;英语&#xff1a;SatoshiNakamoto&#xff09;&#xff0c;自称日裔美国人&#xff0c;日本媒体常译为中本哲史&#xff0c;此名是比特币协议及其相关软件Bitcoin-Qt的创造者&#xff0c;但真实身份未知。 中本聪于…

Chapter9.1:线性系统状态空间基础(上)

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…

解决Visual Studio设置C++标准 但是_cplusplus始终为199711

目录场景复现Visual Studio官方说明C标准对应表解决方案方法一 恢复__cplusplus宏方法二 使用_MSVC_LANG宏场景复现 我在VS2022偶然的一次测试C标准开发环境&#xff0c;发现无论我怎么修改C语言标准&#xff0c;输出的__cplusplus宏总是199711。 Visual Studio官方说明 链…

【C++】vector模拟实现及其应用

文章目录vector的介绍vector的使用及其实现vector的定义vector iterator 的使用vector空间增长问题vector的增删查改vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素…

开源 Swallow 代码审计系统体验

最近在哔哩哔哩看 到Swallow 代码审计系统的宣传,发现功能比较适合我目前的工作需要,安装使用了一下,简单做了一个笔记,分享给有需要的朋友. 底层架构为蜻蜓编排系统,墨菲SCA,fortify,SemGrep,hema 项目地址:https://github.com/StarCrossPortal/swallow 安装与使用视频教程:ht…

hexo 搭建个人博客记录

看B站的程序羊的关于搭建hexo博客的方法自己搭了一个博客&#xff0c;链接是 手把手教你从0开始搭建自己的个人博客 |无坑版视频教程| hexo 下面就视频所讲做做笔记&#xff0c;以后可以回来查看&#xff0c;推荐小伙伴想搭建hexo博客的可以去看看这个视频。 1. 安装Node.js…
最新文章