C#使用重载方法实现不同类型数据的计算

一、涉及到的相关知识

1.重载的方法

重载方法就是方法名称相同,但是每个方法中参数的数据类型、个数或顺序不同的方法。如果一个类中存在两个以上的同名方法,并且方法的参数类型、个数或者顺序不同,当调用这样的方法时,编译器会根据传入的参数自动进行判断,决定调用哪个方法。

2.Convert.ToInt32(String)方法

将数字的指定字符串表示形式转换为等效的 32 位带符号整数。

public static int ToInt32 (string? value);

参数
value    String
包含要转换的数字的字符串。

返回
Int32
一个与 value 中数字等效的 32 位带符号整数,如果 value 为 null,则为 0(零)。

例外
FormatException
value 不由一个可选符号后跟一系列数字 (0-9) 组成。

OverflowException
value 表示小于 Int32.MinValue 或大于 Int32.MaxValue 的数字。

在C#中,Convert.ToInt32(string)方法用于将字符串转换为整数。如果字符串包含非数字字符,例如小数点,该方法将引发异常。例如,字符串是"123.456",包含非数字字符"."。因此,直接使用Convert.ToInt32(string)会引发异常。

为了避免异常,可以先使用Decimal.Parse(string)方法将字符串转换为小数,然后再使用Convert.ToInt32(decimal)方法将小数转换为整数。

string str = "123.456";
decimal decimalValue = Decimal.Parse(str);
int intValue = Convert.ToInt32(decimalValue);

或者,使用string.Split()方法将字符串按指定的分隔符拆分为一个字符串数组。例如,可以使用小数点"."作为分隔符,然后取第一个元素作为整数部分。

string str = "123.456";
string[] parts = str.Split('.');

// 如果有小数点,取小数点前面的部分作为整数
// 如果没有小数点,整个字符串就是整数部分
string integerPart = parts.Length > 0 ? parts[0] : str;

int intValue = Convert.ToInt32(integerPart);

3.判断字符串是否带有小数点

使用正则表达式@"^\d+\.\d+$"判断字符串是否含有“.”,然后执行相应操作。

二、实例

1.示例

//重载加法运算
using System.Text.RegularExpressions;

namespace _111
{
    public partial class Form1 : Form
    {
        private GroupBox? groupBox1;
        private GroupBox? groupBox2;
        private RadioButton? radioButton3;
        private RadioButton? radioButton2;
        private RadioButton? radioButton1;
        private TextBox? textBox1;
        private Label? label2;
        private Label? label1;
        private TextBox? textBox2;
        private TextBox? textBox3;
        private Button? button1;
        private Label? label3;

        public Form1()
        {
            InitializeComponent();
            StartPosition = FormStartPosition.CenterScreen;
            Load += Form1_Load;
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // radioButton1
            // 
            radioButton1 = new RadioButton
            {
                AutoSize = true,
                Location = new Point(11, 17),
                Name = "radioButton1",
                Size = new Size(40, 21),
                TabIndex = 0,
                TabStop = true,
                Text = "int",
                UseVisualStyleBackColor = true
            };
            // 
            // radioButton2
            // 
            radioButton2 = new RadioButton
            {
                AutoSize = true,
                Location = new Point(11, 39),
                Name = "radioButton2",
                Size = new Size(90, 21),
                TabIndex = 1,
                TabStop = true,
                Text = "int+double",
                UseVisualStyleBackColor = true
            };
            // 
            // radioButton3
            // 
            radioButton3 = new RadioButton
            {
                AutoSize = true,
                Location = new Point(11, 61),
                Name = "radioButton3",
                Size = new Size(67, 21),
                TabIndex = 2,
                TabStop = true,
                Text = "double",
                UseVisualStyleBackColor = true
            };
            // 
            // label1
            // 

            label1 = new Label
            {
                AutoSize = true,
                Location = new Point(6, 23),
                Name = "label1",
                Size = new Size(44, 17),
                TabIndex = 0,
                Text = "加数:"
            };
            // 
            // label2
            // 
            label2 = new Label
            {
                AutoSize = true,
                Location = new Point(6, 53),
                Name = "label2",
                Size = new Size(56, 17),
                TabIndex = 1,
                Text = "被加数:"
            };
            // 
            // textBox1
            // 
            textBox1 = new TextBox
            {
                Location = new Point(56, 17),
                Name = "textBox1",
                Size = new Size(91, 23),
                TabIndex = 2
            };
            // 
            // textBox2
            // 
            textBox2 = new TextBox
            {
                Location = new Point(56, 47),
                Name = "textBox2",
                Size = new Size(91, 23),
                TabIndex = 3
            };
            // 
            // groupBox1
            // 
            groupBox1 = new GroupBox
            {
                Location = new Point(12, 12),
                Name = "groupBox1",
                Size = new Size(153, 92),
                TabIndex = 0,
                TabStop = false,
                Text = "数据运算"
            };
            groupBox1.Controls.Add(textBox2);
            groupBox1.Controls.Add(textBox1);
            groupBox1.Controls.Add(label2);
            groupBox1.Controls.Add(label1);
            groupBox1.SuspendLayout();
            // 
            // groupBox2
            // 
            groupBox2 = new GroupBox
            {
                Location = new Point(171, 12),
                Name = "groupBox2",
                Size = new Size(127, 92),
                TabIndex = 0,
                TabStop = false,
                Text = "选择数据类型"
            };
            groupBox2.Controls.Add(radioButton3);
            groupBox2.Controls.Add(radioButton2);
            groupBox2.Controls.Add(radioButton1);
            groupBox2.SuspendLayout();
            // 
            // textBox3
            // 
            textBox3 = new TextBox
            {
                Location = new Point(88, 107),
                Name = "textBox3",
                Size = new Size(100, 23),
                TabIndex = 1
            };
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(223, 107),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 2,
                Text = "开始计算",
                UseVisualStyleBackColor = true
            };
            button1.Click += Button1_Click;
            // 
            // label3
            // 
            label3 = new Label
            {
                AutoSize = true,
                Location = new Point(12, 113),
                Name = "label3",
                Size = new Size(68, 17),
                TabIndex = 3,
                Text = "运算结果:"
            };
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(309, 136);
            Controls.Add(label3);
            Controls.Add(button1);
            Controls.Add(textBox3);
            Controls.Add(groupBox2);
            Controls.Add(groupBox1);
            Name = "Form1";
            Text = "重载加法运算";
            groupBox1.ResumeLayout(false);
            groupBox1.PerformLayout();
            groupBox2.ResumeLayout(false);
            groupBox2.PerformLayout();
        }

        private void Button1_Click(object? sender, EventArgs e)
        {
            textBox3!.Text = "";
            try
            {
                if (radioButton1!.Checked)
                {
                    if (!IsDecimalNumber(textBox1!.Text) && !IsDecimalNumber(textBox2!.Text))
                    {
                        textBox3!.Text = Add(Convert.ToInt32(textBox1!.Text), Convert.ToInt32(textBox2!.Text)).ToString();
                    }
                    else
                    {
                        MessageBox.Show("文本内数字不能是小数","警示");
                    }
                }
                else if (radioButton2!.Checked)
                {
                    if (!IsDecimalNumber(textBox1!.Text))
                    {
                        textBox3!.Text = Add(Convert.ToInt32(textBox1!.Text), Convert.ToDouble(textBox2!.Text)).ToString();
                    }
                    else
                    {
                        MessageBox.Show("加数不能是小数", "警示");
                    }
                }
                else if (radioButton3!.Checked)
                {
                    textBox3!.Text = Add(Convert.ToDouble(textBox1!.Text) ,Convert.ToDouble(textBox2!.Text)).ToString();
                }
            }
            catch { }
        }

        public static int Add(int x, int y)//定义一个静态方法Add,返回值为int类型,有两个int类型的参数
        {
            return x + y;
        }
        public static double Add(int x, double y)//重新定义方法Add,它与第一个方法的返回值类型及参数类型不同
        {
            return x + y;
        }
        public static double Add(double x, double y)//重新定义方法Add,它与第一个方法的返回值类型及参数类型不同
        {
            return x + y;
        }
        /// <summary>
        /// 使用正则表达式判断字符串是否为带小数的数字
        /// ^\d+\.\d+$ : ^ 表示字符串开始, \d+ 表示一个或多个数字,
        /// \.? 表示可能存在的小数点, \d+ 表示小数点后面的一个或多个数字,
        /// $ 表示字符串结束
        /// </summary>
        public static bool IsDecimalNumber(string str)
        {
            return MyRegex().IsMatch(str);
        }

        [GeneratedRegex(@"^\d+\.\d+$")]
        private static partial Regex MyRegex();
    }
}

2.生成成果


相关文章

  • SpringBoot底层原理

    springboot3.x中,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,配置了需要创建Bean对象的全类名。当Springboot项目启动后,Springboot中的一些配置类,bean对象就会自动存入到IOC容器中,不需要我们手动去申明。,它负责管理Spring应用程序中所有的bean,同时提供了一些方法来获取Bean,注册Bean,是整个Spring应用的核心。

  • C# 实现网页内容保存为图片并生成压缩包

    通过动态页面技术,可以实现简历配置后的网页内容输出,但制作对应的各种模板会遇到开发效率和服务跟进的问题。为了保障原样输出,折中而简单的方案就是将动态输出的页面转化为图片格式。

  • 五种多目标优化算法(MSSA、MOJS、NSWOA、MOPSO、MOAHA)性能对比(提供MATLAB代码)

    多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解过程可以分为以下几个步骤:1. 定义问题:首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数,这些目标函数可能是相互矛盾的,因此需要进行权衡和平衡。2. 生成初始解集:通过某种方式生成初始解集,可以是随机生成、根据经验生成或者使用已有的解集。3. 评估解集:对初始解集中的每个解进行评估,计算其在各个目标函数上的值。评估方法可以根据具体问题选择,例如计算目标函数值、计算约束违反程度等。

  • SQL实现模糊查询的四种方法总结

    SQL实现模糊查询的四种方法总结

  • 【C#小知识】c#中的delegate(委托)和event(事件)

    今天来介绍一下delegate和event。delegate在c#中可以定义一个函数类型,可以将函数作为一个对象来使用。event在c#中则可以看做一个函数的集合,event中包含了一个或多个函数。

  • Spring两大核心思想:IOC和AOP

    1.先自定义一个注解@Target(ElementType.METHOD) //作用范围 此处是方法@Retention(RetentionPolicy.RUNTIME) //生命周期 此处是运行时2.在切点表达式中加入该注解@Aspect@Component@Slf4j@Around(&quot;@annotation(com.example.demo.aspect.TestAnnotation)&quot;) //此处加自定义注解log.info(&quot;around继续&quot;);try {

  • SpringCloud-搭建Nacos配置中心

    本文详细介绍了如何在Spring Cloud项目中使用Nacos实现配置管理。首先,通过简洁的步骤指导了Nacos的安装和配置。然后,通过在项目中引入Nacos的依赖和配置,实现了与Nacos配置中心的连接。在Nacos控制台上演示了如何新建配置,并通过Spring Cloud项目实现了动态读取配置的操作。这种灵活的配置管理方案为微服务架构提供了高度可维护性和实时性的优势,使得项目能够在运行时动态调整配置,而无需重启服务

  • 小程序 自定义组件和生命周期

    类似vue或者react中的自定义组件⼩程序允许我们使⽤⾃定义组件的⽅式来构建⻚⾯。类似于页面,一个自定义组件由 json wxml wxss js 4个文件组成可以在微信开发者⼯具中快速创建组件的⽂件结构在⽂件夹内 components/myHeader ,创建组件 名为 myHeader⾸先要在⻚⾯的 json ⽂件中进⾏引⽤声明。还要提供对应的组件名和组件路径index.wxml// 引用声明// 要使用的组件的名称 // 组件的路径&lt; view &gt; _微信小程序 自定义组件生命周期

  • Makefile 和 Bash 脚本之间区别和联系

    在 Makefile 中可以调 Bash 脚本,或在 Makefile 中直接写入 Bash 命令。这使得在构建过程中执行更复杂的任务成为可能。Makefile和Bash脚本由于它们的设计目标和用途不同,它们在基本结构、命令执行、通配符使用、错误处理等方面存在显著的差异。了解这些差异对于正确编写和理解Makefile和Bash脚本至关重要。Makefile主要用于编译和构建软件项目,而Bash脚本则更广泛地应用于系统管理和自动化任务。在实际工作中,两者可以结合使用,以创建一个完整、自动化的构建和部署。

  • C#:Sleep() 和 Wait() 有什么区别

    Sleep() 和 Wait() 是两个不同的方法,用于控制线程的执行。

  • DockerUI如何部署结合内网穿透实现公网环境管理本地docker容器

    DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基于容器安装方式,部署方便高效,浏览和维护docker单节点或集群节点worker和manager。DockerUI具有易于使用的界面。它不需要记住 docker 指令。只需下载镜像即可立即加入并完成部署。使用DockerUI并结合cpolar内网穿透可以更加轻松的管理docker和swarm,实现后台公网访问并管理,视觉性更加直观,后台开发更加便利。

  • C++ STL库详解:容器适配器stack和queue的结构及功能

    详细介绍了c++中的stack和queue两大容器适配器的功能、接口与使用方法,通过与vector、string等容器的配合使用来实现特定的功能。介绍了stack与queue的底层默认容器deque的原理及结构以及它的优缺陷。

  • C语言——深入理解指针(1)

    我们已经知道,32内存位计算器有32条地址总线,每条线有1和0两个状态,那么一个内存的编号就有32条地址线表示,一条地址线占一个比特位,那么32条地址线就是32个比特位,因此就是4个字节。,可以这么理解,32位的计算器有32条这样的线,每个线有两种状态,分别是0和1,那么32根线一共能表示2^32种状态,这样的每个状态就是我们的一个地址,他们分别储存在不同的硬件上,地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传入CPU内寄存器。当然,需要我们了解一下计算机的进制转换,

  • C,C++,C# 的区别

    C#是一种面向对象的编程语言,由微软开发。总的来说,C适合系统级编程和嵌入式开发,C++适合大型项目和需要高性能的应用程序开发,而C#适合Windows应用程序开发和.NET平台。C++是一种面向对象的编程语言,是C的扩展。C++也具有更强大的标准库,以支持更多的功能和任务。它具有简单的语法和较小的标准库,适合于高效的低级编程和处理底层细节。C++具有更高的性能和更好的底层控制能力,但开发过程中更复杂。C#的开发速度更快,代码更易于维护,但性能可能稍逊于C++。C,C++,C# 是三种不同的编程语言。

  • 一些著名的软件都用什么语言编写?

    比如你的两个朋友与你分别玩用VB、Java、与C++编写的“跑跑卡丁车”,你玩C++编写的游戏已经跑玩结束了,发现你的两个朋友还没开始跑呢,那是相当的卡啊。备注:曾经在智能手机的操作系统(Windows Mobile)考虑掺点C#写的程序,比如软键盘,结果因为写出来的程序太慢,实在无法和别的模块合并,最终又回到C++重写。:2008 年推出:C语言(有传言说是用Java开发的操作系统,但最近刚推出原生的C语言SDK): 部分JAVA(对外接口),主要为C++ (开源,可下载其源代码)

  • Java把列表数据导出为PDF文件,同时加上PDF水印

    可以看到字体文件在jar目录下面是有的,但是发现classes后面多了个叹号。这是引入外部字体方式不对,后改用问题2参考文章的第三种写法就没问题了。网上都是说jar包的版本不对,导致的字体兼容性问题。换了jar包版本发现没效果,后来索性直接把字体下载到本地直接引入。字体文件资源自己百度,直接搜。

  • HarmonyOS 鸿蒙应用开发( 六、实现自定义弹窗CustomDialog)

    自定义弹窗(CustomDialog)可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗。具体用法请参考自定义弹窗。

  • java获取双异步返回值时,如何保证主线程不阻塞?

    CompletableFuture的异步执行通过ForkJoinPool实现,ForkJoinPool在于可以充分利用多核CPU的优势,把一个任务拆分成多个小任务,把多个小任务放到多个CPU上并行执行,当多个小任务执行完毕后,再将其执行结果合并起来。

  • C# 十大排序算法

    这些排序算法具有不同的时间复杂度、空间复杂度和稳定性,适用于不同的排序场景。每种算法都有其独特的思想和实现方式,您可以根据具体的需求选择适合的排序算法。以上代码分别实现了10大算法。请注意,如果需要对其他类型的数据进行排序,需要进行相应的修改。

  • Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

    传统的vue2里面,我们访问dom时的代码,还是的借助于this对象的【this.$refs.userName】。毕竟,父子组件之间,各司其职。下面展示的是,借助于ref来访问子组件的实例对象。(声明:默认情况下,子组件内部的属性和方法,不会主动对外暴漏的。Vue3前端开发,借助Ref来获取组件内dom对象,借助defineExpose编译宏可以获取到子组件的属性和方法。如图,确实是可以拿到子组件的属性和方法了,如果不使用编译宏,是访问不到的。这个是子组件里面的内容,我们定义了一个常量,一个方法。

  • 掌握Spring MVC拦截器整合技巧,实现灵活的请求处理与权限控制!

    在这个方法中可以通过返回值来决定是否要进行放行,我们可以把业务逻辑放在该方法中,如果满足业务则返回true放行,不满足则返回false拦截。方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法,如果返回false,则代表拦截,后面的就不会再执行了。(7)如果满足规则,则进行处理,找到其对应的controller类中的方法进行执行,完成后返回结果。配置多个后,执行顺序是什么?(5)在找到具体的方法之前,我们可以去配置过滤器(可以配置多个),按照顺序进行执行。

  • Java编程模型:VO,BO,PO,DO,DTO

    Java编程模型中的VO,BO,PO,DO,DTO提供了一种结构化和组织代码的方法。通过合理运用这些概念,可以使代码更具可读性、可维护性和可扩展性。在实际项目中,根据需求和架构设计,合理选择和运用这些概念将有助于构建清晰、高效的Java应用程序。