首页 > 编程学习 > C#方法详解

C#方法详解

发布时间:2023/3/28 23:47:20

总目录


文章目录

  • 总目录
  • 前言
  • 一、方法概述
    • 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#参数详解一(形参和实参)
常见扩展方法

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号