zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#【基础篇】 C# 类型转换

c#基础 类型转换
2023-09-11 14:15:48 时间

C#学习汇总 - 总目录


前言

类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种形式:

隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型从派生类转换为基类

实例:

namespace TypeConvertion
{   class Class1
    {

    }

    class Class2 : Class1 //类Class2是类Class1的子类
    {

    }
    class Program
    {
        static void Main(string[] args)
        {
            int inum = 100;
            long lnum = inum; // 进行了隐式转换,将 int 型(数据范围小)数据转换为了 long 型(数据范围大)的数据
            Class1 c1 = new Class2(); // 这里也是隐式转换,将一个新建的 Class2 实例转换为了其基类 Class1 类型的实例 C1
        }
    }
}

显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。【注:使用as可以进行显式转换】

下面的实例显示了一个显式的类型转换:

namespace TypeConversionApplication
{
    class ExplicitConversion
    {
        static void Main(string[] args)
        {
            double d = 5673.74;
            int i;

            // 强制转换 double 为 int
            i = (int)d;
            Console.WriteLine(i);
            Console.ReadKey();
           
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

5673

使用as进行显式转换的实例:



namespace TypeConvertion
{  
		class Class1
    {

    }

    class Class2 : Class1 //类Class2是类Class1的子类
    {

    }
    class Program
    {
        static void Main(string[] args)
        {
           Class1 c11 = new Class1();
					Class2 c22 = c11 as Class2; //使用as进行显式转换
					Console.WriteLine(c22 is Class1);
					Console.WriteLine(c22 is Class2);
					Console.ReadLine();
        }
    }
}

运行结果:

FALSE
FALSE

C# 类型转换方法

C# 提供了下列内置的类型转换方法(显式类型转换):
在这里插入图片描述
下面的实例把不同值的类型转换为字符串类型:

namespace TypeConversionApplication
{
    class StringConversion
    {
        static void Main(string[] args)
        {
            int i = 75;
            float f = 53.005f;
            double d = 2345.7652;
            bool b = true;

            Console.WriteLine(i.ToString());
            Console.WriteLine(f.ToString());
            Console.WriteLine(d.ToString());
            Console.WriteLine(b.ToString());
            Console.ReadKey();
           
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

75
53.005
2345.7652
True

C# 常见显式转换方法总结对比

Convert.ToInt32() 、int.TryParse() 和 int.Parse() 、(int)的区别

1)对于转换对象
Convert.ToInt32() 可以为多种类型(除数字类型外 bool,string,DateTime 等)

int.TryParse() 和 int.Parse() 只能是整型字符串类型(即各种整型 ToString() 之后的形式,不能为浮点型,否则 int.Parse() 就会出现输入的字符串格式不正确的错误,int.TryParse() 也会返回 false,输出参数为 0

(int)只能是数字类型(例 float,int,uint等)

2)对于空值 NULL
从运行报错的角度讲,(int) 强制转换和 int.Parse() 都不能接受 NULL【会报异常

Convert.ToInt32() 其实是在转换前先做了一个判断,参数如果为 NULL,则直接返回 0【不会报异常】,否则就调用 int.Parse() 进行转换

int.TryParse() 其实是对 int.Parse() 做了一个异常处理,如果出现异常则返回 false,并且将输出参数返回 0

3)针对于浮点型的取舍问题
浮点型只有 Convert.ToInt32() 和 (int) 能进行转换,但是也是进行取舍了的,
Convert.ToInt32() 采取的取舍是进行四舍五入,
而 (int) 则是截取浮点型的整数部分,忽略小数部分,
例如 :Convert.ToInt32(1.499d) 和 (int)1.499d 都返回 1,Convert.ToInt32(1.5d) 返回 2,而 (int)1.5d 还是返回 1;

4)关于溢出
将大的数据类型转换为小的数据类型时 ,Convert.ToInt32() 和 int.Parse() 都会报溢出错误,值对于 Int32 太大,而 (int) 不报错,但是返回值为 -1。

如此可见,我们在进行数据转换前选择转换方法要谨慎!

如果是数字类型可以考虑直接用(int)强制转换,
如果是整型字符串类型的,考虑用 int.Parse() 进行转换,
如果不是这两种类型,再考虑用 Convert.ToInt32() 进行转换。

实例:

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            //示例1:
            string locstr = 123.ToString();
            //如果要将"locstr"转成整型数
            //方法一: 用 Convert 
            int i = Convert.ToInt16(locstr);
            //方法二: 用 Parse
            int ii = int.Parse(locstr);
            Console.WriteLine(i);
            Console.WriteLine(ii);
            Console.WriteLine();

            //示例2:
            //该方式也是将数字内容的字符串转换为int类型,但是该方式比int.Parse(string s) 好一些,它不会出现异常,最后一个参数result是输出值,如果转换成功则输出相应的值,转换失败则输出0。 
            string s1 = "abcd";
            string s2 = "1234";
            int a, b;
            bool bo1 = int.TryParse(s1, out a);
            Console.WriteLine(s1 + " " + bo1 + " " + a);
            bool bo2 = int.TryParse(s2, out b);
            Console.WriteLine(s2 + " " + bo2 + " " + b);
            Console.WriteLine();

            //示例3:
            //C# 中对 double 类型的数据取整,可以使用 convert.toint32() 方法,也可使用 int 强制转换为整数,使用 int 时并不存在四舍五入的情况,而是直接将后面的小数位数丢掉。比如:
            double c = 1.35;
            double d = 1.65;
            int c1 = Convert.ToInt32(c);
            int c2 = (int)(c);
            int d1 = Convert.ToInt32(d);
            int d2 = (int)(d);
            Console.WriteLine("{0}使用convert方法转化的结果为:{1}", c, c1);
            Console.WriteLine("{0}使用int强制转换的结果为:{1}", c, c2);
            Console.WriteLine("{0}使用convert方法转化的结果为:{1}", d, d1);
            Console.WriteLine("{0}使用int强制转换的结果为:{1}", d, d2);


            Console.ReadLine();
        }
    }
}

运行结果:

123
123

abcd False 0
1234 True 1234

1.35使用convert方法转化的结果为:1
1.35使用int强制转换的结果为:1
1.65使用convert方法转化的结果为:2
1.65使用int强制转换的结果为:1

浅谈 string 转 int 与抛异常

string 字符串类型和 int 也是可以转换的。下一行的代码给出错误的转换方法。

string a = "123";  // 将a设置为字符串“123”
int x = (int) a;   // 转换

上述代码,毋庸置疑,肯定是错误的。VS 在编译时就过不了。那么,string 该怎么转换成 int 呢?

这里,我们需要用到 int.Parse(),核心代码为:

string a = "123";     // 将a设置为字符串“123”
int x = int.Parse(a); // 转换

如果仅仅是这样,是没有问题的,但是,我们下面再来做一个实例。

用户输入一个数字,而电脑将计算出这个数字加上1以后的答案,并且显示出来。

用户输入的东西,即 Console.ReadLine() ,一定是以字符串形式表现的。

于是,运用之前的方法,我们可以写出以下的代码:

class Test
{
    static void Main(string[] args)
    {
        Console.WriteLine("输入数字,将计算出它加一的答案");
        int a = int.Parse(Console.ReadLine());  //转换用户输入的数字
        Console.WriteLine("答案是{0}",++a);     //++a 即 a+1 后的那个数,将它输出出来
        Console.ReadKey();
    }
}

当程序运行时,会出现:

输入数字,将计算出它加一的答案
3
答案是4

这样就很完美了吗?不!!

如果用户输入并非数字的其他字符,如汉字,会发生什么情况?

此时,用户输入 王 ,显然,程序将无法继续运行下去,因为int类型只能存整数,不能存字符。

这时,程序就会抛出异常。

如果用 VS 编,你还会看到异常类型:FormatException。

所以,为了保险,可以用try、catch来解决此问题。核心代码为:

try
{
               
}
catch (Exception)
{
                
}

try 在英语中就是尝试的意思。在这段代码中,try{} 部分,顾名思义,也就是去尝试进行下面的代码。catch{} 部分,则是检测异常。这样,在出现异常时,catch 就能捕获到异常,从而程序并不会停止。

则这段程序,完整的代码应该为:

using System;
class Test
{
    static void Main(string[] args)
    {
        try
        {
           Console.WriteLine("输入数字,将计算出它加一的答案");
           int a = int.Parse(Console.ReadLine());   //有可能会抛出异常
           Console.WriteLine("答案是{0}",++a);   //如果没有异常,程序才会进入这一步
        }
        catch (Exception)
        {
            Console.WriteLine("无法转换");  //如果捕获到异常,就说“无法转换”
        }
         Console.ReadKey();
    }
}

这样,如果我输入了 ,程序结果为:

无法转换

总结

重点:Convert.ToInt32() 、int.TryParse() 和 int.Parse() 、(int)的区别

C#学习汇总 - 总目录