C#——类型转换

本文详细介绍了C#中的类型转换,包括同一类型转换(Cast)和不同类型转换(Convert)。通过实例演示了隐式转换、显示转换(强制转换)以及如何使用Convert类在不同类型间进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类型转换

一、c#类型转换可以分为两大类:一类是同一类型转换(Cast),另一类是不同类型转换(Convert)。

   (一)同一类型转换(Cast)可分为两种:

      (1)隐式转换:如果当目标类型一定能满足源类型转换过去后的要求的话就是隐式转换。

      (2)显示转换(强制转换):如果当目标类型不一定能满足源类型转换过去后的要求的话就需要显示转换(程序员自已负责)。

具体解释参考下图:

(二)不同类型转换:Convert

二、具体实例

  <1>同一类型数据转换实例:

      功能段1:怎样打印数据类型的范围

       功能段2:隐式转换

       功能段3:强制转换(byte)

namespace Cast入门
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 怎样打印数据类型的范围
            Console.WriteLine("int的最大值是{0},最小值{1}",int.MaxValue,int.MinValue);
            Console.WriteLine("byte的最大值是{0},最小值{1}",byte.MaxValue,byte.MinValue);
            //int i =99999999999999999;   错误:99999999999999999超出int整数范围
            #endregion

            #region    隐式转换
            byte b = 3;
            int i = b;   //(一个小的范围里的数放在一个大的范围里一定会放下的,这就好比小容器一定能放在大容器里)隐式转换
            Console.WriteLine(i);
            #endregion

            #region   强制转换(byte)
            //b = i;    (一个大的范围里的数放在一个小的范围里可能会放不下,编译器不能保证一定能转换成功。)
            b=(byte)i;   //强制转换
            Console.WriteLine(b);

            //注意:标byte与不标byte的区别

            i = 2;
            b = i;                     //不标上byte,程序报错。
            Console.WriteLine(b);

            i = 2;                      
            b = (byte)i;                //标上byte,程序不报错了,但程序员来负责
            Console.WriteLine(b);

            //注意:标byte与不标byte的区别

            i = 2000;
            b = i;                      //不标上byte,程序报错.
            Console.WriteLine(b);

            i = 2000;
            b = (byte)i;                //标上byte,程序不报错,错误程序员来负责。
            Console.WriteLine(b);
            #endregion

            Console.ReadKey();
        }
    }
}

注意:在隐式转换中注意标注byte,它做代表的意思是:强制转换,程序不再报错,转换结果程序员自己负责。

<2>不同类型数据转换实例:

namespace Convert转换
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "123";
            // i = (int)s;       //不能在string和int之间进行强制类型转换,只能用convert
            int i = Convert.ToInt32(s);    
            Console.WriteLine(i);
            Console.ReadKey();
        }
    }
}

 

<3>同一类型数据转换和不同类型数据转换实例的综合比较:

namespace 类型转换
{
    class Program
    {
        static void Main(string[] args)
        {
            //同一类型数据之间的转换:隐式转换、显示转换(强制转换)
           byte b1 = 2;
           int i1 = b1;              //隐式转换(同一类型的数据,:小→大)
           Console.WriteLine(i1);

           int i2 = 2000;
           byte b2 = (byte)i2;      // 强制转换(同一数类型:大→小)
           Console.WriteLine(b2);
           Console.ReadKey();


           // 不同类型数据之间的转换:convert
           string s = "123";
           // i = (int)s;       //不能在string和int之间进行强制类型转换,只能用convert
           int i = Convert.ToInt32(s);    //convert:不同类型数据之间的转换
           Console.WriteLine(i);
           Console.ReadKey();
        }
    }
}


 总结(个人理解):

 Cast和convert两大类型转换的区别:

        Cast:同一类型的数据的转换,只是大小范围不同之间同一类型之间的转换(比如:byte类型和int类型之间的转换)

        (1) 小范围转换为大范围转换:隐式转换(同一类型的数据,:小→大)

        (2)大范围转换为小范围转换:强制转换(同一类型的数据:大→小)

        Convent:不同类型的数据的转换,不可以进行强制转换,只能用convert(比如:int类型和string类型之间的转换)

 

 

 

### C# 中隐式类型转换的使用详解 #### 定义与特点 隐式类型转换是指无需显式代码干预即可由编译器自动执行的一种类型转换操作。这种转换的特点在于其安全性较高,通常发生在从小范围数据类型向大范围数据类型的转换过程中[^1]。例如,从 `int` 类型到 `long` 类型的转换属于典型的隐式类型转换。 --- #### 自动支持的隐式类型转换 C# 编译器内置了一些常见的隐式类型转换规则,主要包括但不限于以下场景: - **数值类型间的转换**:如 `sbyte` 到 `short`、`int` 到 `long`、`float` 到 `double` 等。 - **基础类型到复杂类型**:如从 `bool` 转换为 `System.Boolean`。 - **派生类到基类**:任何继承关系下的对象都可以隐式地向上转型为其父类或接口类型。 这些转换均遵循一个重要原则——不会导致数据丢失或精度下降[^2]。 --- #### 用户自定义隐式类型转换 除了上述预设的支持外,开发人员还可以通过重载 `implicit` 运算符来自定义特定类别的隐式类型转换行为。下面是一个具体实例展示如何实现这一点: ```csharp // 定义一个简单的封装类 Digit public class Digit { public double Value { get; } public Digit(double value) { Value = value; } // 定义从 Digit 到 double 的隐式转换 public static implicit operator double(Digit digit) { if (digit == null) throw new ArgumentNullException(nameof(digit)); return digit.Value; } // 定义从 double 到 Digit 的隐式转换 public static implicit operator Digit(double value) { return new Digit(value); } } class Program { static void Main() { // 测试隐式转换功能 Digit myDigit = 7.5; // 此处调用了从 double 到 Digit 的隐式转换 double convertedValue = myDigit; // 此处调用了从 Digit 到 double 的隐式转换 Console.WriteLine($"Original: {myDigit.Value}, Converted: {convertedValue}"); } } ``` 在这个例子中展示了两个方向上的隐式转换机制是如何工作的[^4]。 --- #### 应用场景分析 1. **简化代码书写** 当频繁涉及到不同但兼容的数据类型间交互时,合理运用隐式转换可以让程序更加简洁易懂[^5]。 2. **提升性能效率** 相较于手动编写复杂的映射逻辑,依赖编译器优化后的隐式转换往往能带来更好的运行表现。 3. **增强可维护性和扩展性** 对未来可能新增的功能模块预留灵活调整空间的同时减少冗余重复劳动。 --- #### 注意事项 虽然隐式类型转换带来了诸多便利之处,但也需要注意避免滥用以免引入难以察觉的问题: - 确保每次转换都不会引起信息损失; - 不得因过度依赖而掩盖潜在隐患如越界访问等问题; - 明确区分何时应该选用显式而非隐式的方式更为合适。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值