当前位置: 首页 > article >正文

C#基础(11)函数重载

前言

前面我们已经完成了ref和out补充知识点的学习,以及函数参数相关的学习,今天便再次为函数补充一个知识点:函数重载。

函数重载是指在同一个作用域中,可以有多个同名函数,但参数列表不同。它的发展可以追溯到早期的编程语言。

在早期的编程语言中,函数重载并不被支持。如果需要定义多个功能相似但参数不同的函数,需要为每一个函数提供不同的名称。这样会导致代码冗余,可读性降低。

随着编程语言的发展,函数重载开始得到支持。C++是第一个支持函数重载的编程语言,它的发展历程对函数重载的发展有重要影响。

C++的函数重载使得程序员可以使用相同的函数名来处理不同类型和数量的参数,从而提高了代码的可读性和可维护性。编译器会根据传递给函数的参数类型和数量来选择合适的函数进行调用。

随着时间的推移,函数重载在其他编程语言中也得到了支持。Java、C#、Python等主流编程语言都支持函数重载。

基本概念

在同一语句块中,函数名相同,参数数量不同,类型,顺序不同

最基本的例子,其实你可以点进console里(鼠标放到console这个方法处,然后按f12),可以看到它内部的方法构成,你会发现它本身也有函数重载。

以下是博主在console里截屏到的一些重载的方法。

作用

  1. 命名一组类似的函数,减少函数的数量,避免命名空间的污染
  2. 提升程序的可读性

实例

  • 重载和返回类型无关,又和参数类型,个数,顺序有关
  • 调用时,程序会自己根据传入的参数类型判断使哪一个

参数数量不同

class Program
{
    static void Main(string[] args)
    {
        int result1 = Add(1, 2);
        int result2 = Add(1, 2, 3);
        
        Console.WriteLine("Result 1: " + result1); // 输出:3
        Console.WriteLine("Result 2: " + result2); // 输出:6
        
        Console.ReadLine();
    }

    static int Add(int num1, int num2)
    {
        return num1 + num2;
    }

    static int Add(int num1, int num2, int num3)
    {
        return num1 + num2 + num3;
    }
}
 

以上这个例子实现了Add方法的重载,可以看到,我们实现了多个数的相加,不过这个例子有点不妥当,因为真正要做到无限相加,其实我们有其他的方法实现,不过这个就留给你去思考了。

参数类型不同

using System;

class Program
{
    static void Main(string[] args)
    {
        int num1 = 5;
        float num2 = 3.5f;
        string str = "Hello, world!";

        MyFunction(num1);
        MyFunction(num2);
        MyFunction(str);

        Console.ReadLine();
    }

    static void MyFunction(int num)
    {
        Console.WriteLine("You entered an integer: " + num);
    }

    static void MyFunction(float num)
    {
        Console.WriteLine("You entered a float: " + num);
    }

    static void MyFunction(string str)
    {
        Console.WriteLine("You entered a string: " + str);
    }
}
 

以上例子是实现了一个参数判断的方法,我们也可以直观感受到传不同参数系统的自动调用,建议你自己去实践一下。

参数数量相同但是顺序不同

using System;

public class Speaker
{
    public void Speak(string message)
    {
        Console.WriteLine("我说:" + message);
    }

    public void Speak(string message, string language)
    {
        Console.WriteLine("我用" + language + "说:" + message);
    }

    public void Speak(int times, string message)
    {
        Console.WriteLine("我重复" + times + "次说:" + message);
    }

    public void Speak(string message, int times)
    {
        Console.WriteLine("我说" + message + times + "次");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Speaker speaker = new Speaker();
        speaker.Speak("你好!");
        speaker.Speak("Hello!", "English");
        speaker.Speak(3, "再见!");
        speaker.Speak("Goodbye!", 2);
    }
}
 

以上例子实现一个说话方法的重载,我们其实就能感受到有时候数量相同但是顺序不同在实际开发中有什么作用,我们可能在某些使用上,不用太在乎参数顺序,就可以达到那个方法,但是如果要开发一个如此的函数,需要大量的重载,如果只有两个参数,只用写两种,但是如果有三个参数,就要写六种。

所以这大抵是方便后人的一种写法了。

ref和out

using System;

class Program
{
    static void Main(string[] args)
    {
        int a = 5;
        int b = 10;
        int result1 = Add(a, b);
        Console.WriteLine("Addition Result: " + result1); // Output: 15

        
        Subtract(ref a, out b);
        Console.WriteLine(a+b); // Output: 55

        double c = 2.5;
        double d = 3.5;
        double result3 = Add(c, d);
        Console.WriteLine("Addition Result: " + result3); // Output: 6.0
    }

    static int Add(int num1, int num2)
    {
        return num1 + num2;
    }

    static double Add(double num1, double num2)
    {
        return num1 + num2;
    }

    static void Subtract(ref int num1, out int num2)
    {
        num2 = 10;
        num1 -= num2;
    }
}

以上这个例子,其实只是想告诉大家ref,和out修饰的变量其实完全可以当做一种新变量来看,也是可以参与到函数重载当中的。

总结

我们通过这些例子的学习,想毕你一定已经掌握了函数重载的相关内容,我相信你只要稍加练习,便能达到很熟练的程度。

不过不管知识点难或者简单,还是那句话,学习路上,戒骄戒躁,脚踏实地。

请期待我的下一篇博客!


http://www.kler.cn/news/313590.html

相关文章:

  • 使用jenkins打包unity工程
  • LeetCode118:杨辉三角
  • Spring Boot- 配置文件问题
  • 【JavaScript】数据结构之链表(双指针、滑动窗口)
  • 切换淘宝最新镜像源npm详细讲解
  • 计算机毕业设计选题推荐-4S店试驾平台-小程序/App
  • 过采样和欠采样
  • C++ 字符串最后一个单词的长度(牛客网)
  • # wps必须要登录激活才能使用吗?
  • 摄影学习平台
  • 【Linux】简易日志系统
  • Web前端开发
  • PHP 数组排序类型介绍
  • 基于微信小程序的剧本杀游玩一体化平台
  • [数据结构]算法复杂度详解
  • 代码随想录算法训练营Day7
  • 基于MySQL全量备份+GTID同步的主从架构恢复数据至指定时间点
  • Linux--禁止root用户通过ssh直接登录
  • Java项目实战II基于Java+Spring Boot+MySQL的网上租贸系统设计与实现(开发文档+源码+数据库)
  • 情感AI:科技赋能情感计算的新时代
  • SpringBoot:token是用来鉴权的,那session的作用是什么?
  • 笔记:将WPF中可视化元素(Visual)保存为图像,如PNG,JPEG或BMP的方法简介
  • 设计模式七大原则
  • 毕业设计选题:基于ssm+vue+uniapp的农产品自主供销小程序
  • 与转录组结合,开发下一代诊断技术,或许是医学AI领域的下一个热点|个人观点·24-09-21
  • 中国电子学会202303青少年软件编程(Python)等级考试试卷(四级)真题
  • pandas入门
  • mongoDB-1
  • 深入探索Docker核心原理:从Libcontainer到runC的演化与实现
  • html的基本语法