强制转换和类型转换

强制转换和类型转换

  • 隐式转换:由于这种转换始终会成功且不会导致数据丢失,因此无需使用任何特殊语法。 示例包括从较小整数类型到较大整数类型的转换以及从派生类到基类的转换

  • 显式转换(强制转换) :必须使用 强制转换表达式,才能执行显式转换。 在转换中可能丢失信息时或在出于其他原因转换可能不成功时,必须进行强制转换。 典型的示例包括从数值到精度较低或范围较小的类型的转换和从基类实例到派生类的转换

  • 用户定义的转换:用户定义的转换是使用特殊方法执行,这些方法可定义为在没有基类和派生类关系的自定义类型之间启用显式转换和隐式转换。 有关详细信息,请参阅用户定义转换运算符。 不允许进行以接口为转换源或目标用户定义转换

  •   
     //隐式转化 不能是接口类型 和类型转化  
            public static implicit operator Student(int st)
    
            {
    
                return new Student { Name = "隐式", Age = st };
            }
            //强制转化 不能是接口类型 和类型转化
            public static explicit operator int(Student st)
            {
                st.Age = 12;
                return st.Age;
    
            }

     

  • 使用帮助程序类进行转换:若要在非兼容类型(如整数和 System.DateTime 对象,或十六进制字符串和字节数组)之间转换,可使用 System.BitConverter 类、System.Convert 类和内置数值类型的 Parse 方法(如 Int32.Parse)。 有关详细信息,请参见如何将字节数组转换为 int、如何将字符串转换为数字和如何在十六进制字符串与数值类型之间转换。

在类强制转换之前先对类型就行兼容测试:

如何使用模式匹配以及 as 和 is 运算符安全地进行强制转换

 

c#中进行类型转换时,为什么【基类=派生类是隐式转换,【派生类=基类】是显示转换

教程的解释是不丢失数据就可以隐式转换,比如说byte转换到int,这个可以理解,因为存储数据的字节更大。但是子类的成员应该是多于父类成员的,这个是如何实现转换而不丢失数据呢?

答:类 转换是改变指针的指向。

当【基类=派生类】时,基类的指针就指向 派生类了。基类可以使用派生类中基类的功能,派生类自己的数据和功能基类是不知道的,所有无法使用,但是派生类的数据和方法并没有丢失,只是基类不知道怎么使用。

当【派生类=基类】时,派生类的指针就指向 基类的。派生类只能使用基类方法和数据,而且派生类自己本身的功能和方法就丢失了 。所以是强制转换。

 

注意,

Parse() 是专为 string 类型转成 值类型 提供功能的!

下面的例子都是错误用法 !

Parse() 是将符合数字格式的字符串转为数字,也就是说,

  • ( )括号内的必须为字符串 !
  • 字符串的内容必须为数字 !

例子 1     ( )  括号内的内容不是字符串

例子 2   变量 str 的内容不是 有效数字格式

第三,[Type].TryParse()

格式如下

int.TryParse()

float.TryParse()

 


... ...

.TryParse() 与 .Parse()  相似,但是使用形式不太一样,

[类型].TryParse(要更改的字符串,out 存储到哪个变量); 

最重要的不同点在于, .TryParse()  在转换失败时,不会引发异常,而是返回 flase

例子


string str = "666";
        int i;
        bool b = int.TryParse(str,out i);    //接收转换结果
或者

        string str = "666";
        int i;
        int.TryParse(str,out i);    //不接收转换结果

 

第四,System.Convert

方法例子

System.Convert.ToSingle(); System.Convert.ToInt32(); System.Convert.ToDouble();

... ...

System.Convert  允许将一种类型转为另一种类型。

常见 类型列表: char、sbyte、short、int、long、uint、ulong、float、double、decimal、string、bool ... ...

但是,同样需要格式支持!

 string str = "666";
        int a= System.Convert.ToInt32(str);        //正确

        string str = "666.66";
        int a= System.Convert.ToInt32(str);        //报错

        int a = 66666;
        bool c = System.Convert.ToBoolean(a);        //正确

        string str = "666.66";
        bool c = System.Convert.ToBoolean(str);        //报错

 

  System.Convert 在转换是也需要注意 格式 才能转换成功。

       同样,此方式也会发生精确度、数字大小改变

第五,System.Convert

.Tostring()

每种数据类型都提供了转为字符串类型的方法 ToString()

无论是值类型还是DateTime 等各种引用类型。

ToString() 把所有类型以字符方式输出

posted @ 2021-09-26 19:40  小林野夫  阅读(277)  评论(0)    收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/