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

C#中的类型转换以及异常处理--05

目录

一.类型转换

1.隐式类型转换

2.显示转换

3.使用 Convert 类

4.使用 Parse 和 TryParse 方法

5.自定义类型转化

二.异常处理

1.异常处理的基本概念

2.异常处理的关键字

3.异常处理的基本结构

4.异常处理的示例

5.自定义C#中的异常

6.异常过滤器

三.练习

1.在控制台程序中使用键盘录入去录入一个年份判断输入的年份是否是闰年?并且使用try-catch去捕获异常


一.类型转换

1.隐式类型转换

定义:隐式类型转换是自动进行的,不需要程序员明确指定.当编译器确定转换是安全的,即不会导致数据丢失时,就会进行隐式转换.
代码示例:

int numInt = 10;   
double numDouble = numInt; // 隐式将int类型转换为double类型   
Console.WriteLine(numDouble); 

在上述代码中,int类型的变量numInt被隐式转换为double类型,并赋值给numDouble变量.因为double类型可以表示比int更大的类型,所以这种转换是安全的.

常见的隐式转换规则:

1)从sbyte,byte,short,ushort,int到long,float,double或decimal

2)从char到ushort,int,long,float,double或decimal

3)从没有信息丢失的枚举类型到整型的转换

2.显示转换

定义:显式转换需要使用强制转换操作符(即类型名),因为这种转换可能会丢失数据或者导致运行时异常。显式转换通常用于不兼容类型之间的转换,或者从较大范围的类型转换为较小范围的类型。

代码示例:

double doubleValue = 123.45;   
int intValue = (int)doubleValue;  // double 显式转换为 int,结果为123

在上述代码中double类型的doubleValue被显示转换为int类型的intValue.

double类型的数据在显示转换为int类型的数据时会丢失小数部分.

注意:

1)注意精度丢失(数据丢失)问题,例如在double转换为int时会丢失小数问题

2)注意数值(数据)溢出问题,例如在int转换为byte(如果int数值大于127会导致超出范围异常)

3.使用 Convert 类

定义:在C#中,System.Convert类提供了一个静态方法,可以用于在不同基础数据类型之间进行转换.Convert类的方法通常会处理空值和格式不正确的输入,抛出相应的异常。

常用的方法有Convert.ToInt32(),Convert.ToDouble(),Convert.ToString()等。

代码示例:

string strValue = "456";
int intValue = Convert.ToInt32(strValue);  // string 转换为 int

4.使用 Parse 和 TryParse 方法

定义:针对字符串到数值类型的转换,C#提供了Parse和TryParse方法.这些方法是数值类型和DateTime等类型的静态方法.

Parse方法:如果转换失败,会抛出异常FormatException.

TryParse方法:如果转换失败,不会抛出异常,而是返回false,并将输出参数设置为默认值(如 Int型设置为0).

代码示例:

string strValue = "789";
int intValue = int.Parse(strValue);  // string 转换为 int

string invalidStrValue = "abc";
bool isSuccess = int.TryParse(invalidStrValue, out int result);  // 返回 false,result 为 0

5.自定义类型转化

定义:C# 允许用户在类中自定义类型转换,通过定义 implicit 和 explicit 运算符来实现。这对于自定义类型之间的转换非常有用。

  • 定义隐式转换:使用 implicit 关键字
  • 定义显示转换:使用 explicit  关键字

代码示例:

public class CustomType
{
    public int Value { get; set; }

    // 定义从 int 到 CustomType 的隐式转换
    public static implicit operator CustomType(int value)
    {
        return new CustomType { Value = value };
    }

    // 定义从 CustomType 到 int 的显式转换
    public static explicit operator int(CustomType customType)
    {
        return customType.Value;
    }
}

CustomType custom = 123;  // 隐式转换 将123隐式转换为CustomType类型
int intValue = (int)custom;  // 显式转换 将CustomType类型的custom显示转换为int类型的intValue

二.异常处理

定义:异常处理是编写健壮和可靠的应用程序的关键部分。C# 提供了一套结构化的异常处理机制,允许开发者在程序运行过程中处理异常情况,从而防止程序崩溃,并提供有意义的错误信息或恢复操作。

1.异常处理的基本概念

异常(Exception)是指程序执行过程中发生的错误或意外事件,这些事件通常会中断程序的正常流控制。如果不处理这些异常,程序将会终止执行。异常处理机制允许开发者捕获和处理这些异常,从而保持程序的稳定性。

2.异常处理的关键字

在C#中,我们常使用try,catch,finally和throw关键字来实现异常的处理

  • try:定义一个代码块,在该代码块中可能会发生异常。
  • catch:定义一个代码块,用于捕获和处理在try块中发生的异常.可以同时去定义多个catch去用来捕获不同的异常.
  • finally:定义一个代码块,无论是否发生异常,该块中的代码都会被执行。通常用于释放资源或执行清理操作。
  • throw:用于显式抛出异常。

3.异常处理的基本结构

代码示例:

try   
{
    // 可能会抛出异常的代码   
}   
catch (ExceptionType1 ex1)   
{
    // 处理 ExceptionType1 类型的异常   
}   
catch (ExceptionType2 ex2)   
{
    // 处理 ExceptionType2 类型的异常   
}   
//如果需要处理更多的异常类型可以继续续写catch语句
finally   
{
    // 无论是否发生异常,都会执行的代码   
}

4.异常处理的示例

using System;
   
class Program   
{
    static void Main()
    {
        try
        {
            Console.WriteLine("输入一个数字:");
            string input = Console.ReadLine();
            int number = int.Parse(input);  // 如果键盘录入不是一个数字,可能会抛出 FormatException异常
            Console.WriteLine("输入的这个数字是: " + number);
        }
        catch (FormatException ex)
        {
            Console.WriteLine("输入不是有效数字。请输入一个有效的整数.");
            Console.WriteLine("Error: " + ex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("发生意外错误.");
            Console.WriteLine("Error: " + ex.Message);
        }
        finally
        {
            Console.WriteLine("这一块内容无论是否发生异常的抛出,最终都会执行.");
        }
    }
}

5.自定义C#中的异常

除去系统定义的异常,在C#中我们可以自己自行的去定义一个异常类型.自定义异常类型通常用于表示特定的应用应用程序的错误情况.

在进行自定义异常类型时,我们需要去继承C#中的System.Exception类,并实现构造函数.

代码示例:

using System;
   
public class MyCustomException : Exception   
{
    public MyCustomException()
    {
    }

    public MyCustomException(string message)
        : base(message)
    {
    }

    public MyCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }   
}
   
class Program   
{
    static void Main()
    {
        try
        {
            Demo();
        }
        catch (MyCustomException ex)
        {
            Console.WriteLine("捕获自定义异常: " + ex.Message);
        }
    }

    static void Demo()
    {
        throw new MyCustomException("如何没有异常,则不去进行异常捕获,运行Demo方法.");
    }
}

6.异常过滤器

在catch中,可以去使用条件表达式来决定是否去捕获异常

代码示例:

try   
{
    // 可能会抛出异常的代码   
}   
catch (Exception ex) when (ex.Message.Contains("NullReferenceException"))   //此时写的是在C#中常见的异常(空引用异常)也可以替换为其他类型的异常
{
    // 仅在满足特定条件时处理异常
    Console.WriteLine("捕获到具有特定条件的异常: " + ex.Message);
}

三.练习

1.在控制台程序中使用键盘录入去录入一个年份判断输入的年份是否是闰年?并且使用try-catch去捕获异常

代码示例:

using System;
   
class Program   
{
    static void Main()
    {
        Console.WriteLine("请输入一个年份:");

        try
        {
            // 从控制台读取输入
            string input = Console.ReadLine();
            
            // 尝试将输入转换为整数
            int year = Convert.ToInt32(input);

            // 判断是否为闰年
            if (IsLeapYear(year))
            {
                Console.WriteLine($"{year} 是闰年。");
            }
            else
            {
                Console.WriteLine($"{year} 不是闰年。");
            }
        }
        catch (FormatException)
        {
            Console.WriteLine("输入的格式不正确,请输入一个有效的整数年份。");
        }
        catch (OverflowException)
        {
            Console.WriteLine("输入的年份超出了整数的范围,请输入一个合理的年份。");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生了一个错误:{ex.Message}");
        }
    }

    static bool IsLeapYear(int year)
    {
        // 闰年规则:能被4整除但不能被100整除,或者能被400整除
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }   
}


http://www.kler.cn/a/502440.html

相关文章:

  • WPF 如何添加系统托盘
  • Docker Desktop 构建java8基础镜像jdk安装配置失效解决
  • SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门
  • 【python基础——异常BUG】
  • 【Docker】Docker部署多种容器
  • GitLab CI/CD使用runner实现自动化部署前端Vue2 后端.Net 7 Zr.Admin项目
  • Python在Excel工作表中创建数据透视表
  • AI Agent:软件测试自动化的新纪元
  • C++中的条件变量(condition_variable)详解:小白版
  • 移动应用安全:保护用户隐私与数据的关键解决方案
  • 安全运营体系建设
  • 字符串 (算法十一)
  • 【8】深入理解 Go 语言中的协程-从基础到高级应用
  • django基于Python对西安市旅游景点的分析与研究
  • 探秘 JMeter (Interleave Controller)交错控制器:解锁性能测试的隐藏密码
  • Go语言之路————func
  • Golang笔记——语言基础知识
  • PyTorch 张量的分块处理介绍
  • 鸿蒙UI开发——带农历的日期滑动选择弹窗
  • 74 mysql having 的实现
  • 数据结构与算法之链表: LeetCode 234. 回文链表 (Ts版)
  • sql server 对 nvarchar 类型的列进行 SUM() 运算
  • Spring Boot 动态表操作服务实现
  • OS1.【Linux】大致介绍和环境搭建
  • Redis高危漏洞-GHSA-whxg-wx83-85p5:用户可能会使用特制的 Lua 脚本来触发堆栈缓冲区溢出
  • uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机上