C#第二节(类型转换、变量、常量)

一、C#类型转换
含义:把数据从一种类型转换为另一种类型(也叫类型铸造);在C#中有两种转换方式:

  • 隐式类型转换;eg:从小的整数转为大的整数类型,从派生类转换为基类;
  • 显示类型转换;即强制类型转换,其需要强制转换运算符,并且会造成数据丢失;
    下面的demo 展示了显示类型转换:
            double d = 1265.66;
            int i;
            i = (int)d;
            Console.WriteLine("强制类型转换的结果为:{0}", i);
            Console.ReadKey();

运行结果为:
这里写图片描述

二、C#强制类型转换方法
C#提供了下列内置的类型转换方法
这里写图片描述
这里写图片描述
下面的demo将不同的值类型转换为string类型

class Program
    {
        //JdJos.Rectangle rectangle = new JdJos.Rectangle();
        static void Main(string[] args)
        {
            int i = 88;
            float f = 56.25f;
            double d = 894.59489;
            bool b = true;
            Console.WriteLine("将整型转换为string类型:{0}", i.ToString());
            Console.WriteLine("将float转换为string类型:{0}", f.ToString());
            Console.WriteLine("将double转换为string类型:{0}", d.ToString());
            Console.WriteLine("将bool转换为string类型:{0}", b.ToString());

            Console.ReadKey();


        }
    }

运行结果为:
这里写图片描述

笔记:
类型之间的转换————-Convert和Parse

            String str = 666.ToString();
            //如果要将str转为整型

            //方法一:
            int istr = Convert.ToInt16(str);

            //方法二:
            int istr2 = int.Parse(str);
            Console.WriteLine("使用Convert将String类型转为int类型结果为:{0},使用Parse将同样数据转为int类型的结果为:{1}", istr, istr2);

            Console.ReadKey();

运行结果为:
这里写图片描述

 int.TryParse(string s, out int i);

该方式也是将数组内容的字符串转换为int类型,但是该方式比int.Parse(string s)好一些,它不会出现异常,最后一个参数result是输出值,如果转换成功则输出相应的值,转换失败则输出0.

            String s1 = "abcd";
            String s2 = "1234";
            int a, b;
            bool bol = int.TryParse(s1, out a);
            Console.WriteLine("====================将string类型的abcd转为int类型======================");
            if(bol ==true)
            {
                Console.WriteLine("转换成功,abcd转为int类型结果为:{0}", a);
            }else
            {
                Console.WriteLine("转换失败,abcd转为int类型转换失败:{0},转换结果为{1}",bol, a);
            }
            Console.WriteLine("====================将string类型的1234转为int类型====================");
            bool bol2 = int.TryParse( s2,out b);
            if (bol2 == true)
            {
                Console.WriteLine("转换成功,s2的{0}转为int类型结果为:{1}", s2, b);
            }
            else
            {
                Console.WriteLine("转换失败,1234转为int类型转换失败:{0},转换结果为{1}", bol2, a);
            }

            Console.ReadKey();

这里写图片描述

C#中对double类型的数据取整,可以使用convert.toint32()方法,也可使用int强制类型转换为整数,使用int时并不存在四舍五入的情况,而是直接将后面的小数位数丢掉,eg:

static void Main(string[] args)
        {
            double a = 1.256;
            double b = 826.66649;
            int a1 = Convert.ToInt32(a);
            int a2=(int)a;
            int b1 = Convert.ToInt32(b);
            int b2 = (int)b;
            Console.WriteLine("{0}使用了convert方式强制类型转换,结果为:{1}", a, a1);
            Console.WriteLine("{0}使用了int强制类型转换,结果为:{1}", a, a2);
            Console.WriteLine("{0}使用了convert方式进行强制类型转换,结果为{1}",b, b1);
            Console.WriteLine("{0}使用了int方式强制类型转换,结果为{1}", b, b2);
            Console.ReadKey();

    }

运行结果为:
这里写图片描述

Convert.ToInt32()与int.Parse()区别
举例来说:假如从url中取一个参数page的值,这个值是int类型的,所以既可以用Convert.ToInt32(Request.QueryString[“page”]),也可以用 int.Parse(Request.QueryString[“page”]),但是如果page这个参数在url中不存在,那么前者将返回0,0可能是一个有效的值,所以你不知道url中原来根本没有这个参数而继续进行下一步的处理,这就可能产生意想不到的效果,而用后一种办法的话,没有page这个参数会抛出异常,我们可以捕获异常然后再做出相应的处理,比如提示用户缺少参数,而不是把参数值当做0来处理。
(1)、这两个方法的最大不同是:他们对null值得处理方法:Convert.ToInt32(null)会返回0而不会产生任何异常,但是int.Parse(null)则会产生异常。
(2)、对数据四舍五入时候的区别
a、Convert.ToInt32(double value)如果value为两个整数中间的数字,则返回二者中的偶数;即3.5转换为4,4.5转换为4,而5.5转换位6.不过4.6可以转换为5,4.4转换为4.
b.int.Parse(“4.5”)直接报错:“输入的字符串格式不正确”。
c.int(4.6)=4 int转换其他数值类型为int时都没有四舍五入,强制转换。
(3)、对被转换类型的区别:int.Parse是转换String为int,Convert.ToInt32是转换继承自Object的对象为int的(可以有很多其他类型的数据)。你得到一个Object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32.

String 转int与抛异常
string字符串类型和int是可以转换的。但是下面demo的转换方式是错误的:

            string a = "123";
            int x = (int)a;

这里写图片描述

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

            string a = "123";
            int x = int.Parse(a);

如果仅仅是这样,是没有问题的,但是,我们下面来做一个实例。用户输入一个数字,然后计算机在输入的数字上加上1并显示。用户输入的东西,即Console.ReadLine(),一定是以字符串形式表现的

            Console.WriteLine("请输入一个数字:");
            int a = int.Parse(Console.ReadLine());//将用户输入的string类型转为int类型
            Console.WriteLine("您输入的数字为:{0},   返回结果为:{1}", a, ++a);
            Console.ReadKey();

运行结果:
这里写图片描述
但是用户如果输入的不是数字而是其他字符,如字符串,汉字,会发生什么呢?
输入任意一个字符串或者汉字,程序就报错无法再进行下去,因为int类型只能存储整数,不能存字符。
这里写图片描述
所以保险起见使用try,catch.顾名思义,try{}就是尝试进行下面的代码,catch{}部分,则是检查异常。这样,在出现异常时,catch就能捕获到异常,从而能程序并不会停止。

 try
            {
                Console.WriteLine("请输入一个数字:");
                int a = int.Parse(Console.ReadLine());//将用户输入的string类型转为int类型
                Console.WriteLine("您输入的数字为:{0},   返回结果为:{1}", a, ++a);
            }
            catch
            {
                Console.WriteLine("对不起,输入不合法,无法转换。");
            }


            Console.ReadKey();

运行结果:
这里写图片描述

C#变量

变量是一个供程序操作的存储区的名字。在C#中,每个变量都有特定的类型,类型决定了变量的内存大小和分布,范围内的值可以存储在内存中,可以对变量进行一系列操作。。C#中提供的基本的值类型大致可分为以下几类:
这里写图片描述
C#允许定义其他值的变量,比如:enum,也允许定义引用类型变量,比如class。
C#中变量的定义

<有效的C#数据类型{char,intfloat,double或其他用户自定义的数据类型}> <由一个或多个逗号分隔的标识符名称组成>

eg:一些有效变量名定义:

            int i, j, k;
            char c, ch;
            float f, f1;
            double d;
            int i1 = 100;//定义时候直接初始化

C#变量的初始化—-赋值
eg:

           int i = 66, k = 5;
            byte z = 66;
            double pi = 3.1415926;
            char x = 'x';//注意这里是单引号

接受来自用户的值
System命名空间中的Console类提供了一个函数ReadLine(),用于接收来自用户的输入,并把它存储到变量中,eg:

int num;
num = Convert.ToInt32(Console.ReadLine());

函数Convert.ToInt32()把用户输入的数据转换为int.

C#中的Lvalues和Rvalues
C#中两种表达式:
1、lvalue:lvalue表达式可以出现在赋值语句的左边或右边;
2、rvalue:rvalue表达式可以出现在赋值语句的右边,不能出现在左边。
变量是lvalue的,所以可以出现在赋值语句的左边。数值是rvalue的,因此不能被赋值,不能出现在赋值语句的左边;eg:

int g = 20;
33 = 60;//invalid assignment sentence

C#常量

常量是固定值,执行期间不会改变,可以是任何基本数据类型,eg:整数常量、浮点数常量、字符常量或字符串常量,枚举常量。它们的值在定义后不能被修改。
整数常量
可以为十进制、八进制、或者十六进制的常量,前缀指定技术:0x或0X表示十六进制,0表示八进制,没有前缀表示十进制。
常量可以有后缀,U和L组合,分别代表unsigned和long,后缀大小写任何,多个后缀以任意顺序进行组合。

212         /* 合法 */
215u        /* 合法 */
0xFeeL      /* 合法 */
078         /* 非法:8 不是一个八进制数字 */
032UU       /* 非法:不能重复后缀 */

以下是各种类型的整数常量实例:

            85//十进制
            0213 //八进制
            0xbd4  //十六进制
            30     //int
            66u     //无符号int
            99l     //long
            99ul    //无符号long

浮点常量
eg:

            3.1415926       //合法
            314159E -5L     //合法
            510E            //非法,不完全指数
            210f            //非法,没有小数或指数
            .e55            //非法,缺少整数或小数

使用小数形式表示时,必须包含小数点、指数或同时包含两者,使用指数形式表示时,必须包含整数部分、小数部分或同时包含两者。有符号的指数是用e或E表示的。

字符常量

字符常量是括在单引号里,eg:’x’,且可存储在一个简单的字符类型变量中。一个字符常量可以是一个普通字符(eg’X’)、一个转义序列(eg’\t’)或者一个通用字符(eg’\u02c0’).
有一些特定字符,当它们签名带有反斜杠时有特殊意义,可表示换行符(\n)或制表符tab(\t)
这里写图片描述

字符串常量
字符串常量是括在双引号“”里,或者是在@”“里。字符串常量包含字符与字符常量相似。可以是普通字符、转义字符、和通用字符
定义常量
常量使用const关键字来定义。语法如下:

const <类型> <常量名>=value;

下面demo演示如何使用常量:

static void Main(string[] args)
        {
            const double pi = 3.141592653;
            double r;
            Console.WriteLine("Enter Radius of Integer:");
            r = Convert.ToInt32(Console.ReadLine());
            double areaCircle = pi * r * r;
            Console.WriteLine("Radius:{0},Area:{1}", r, areaCircle);
            Console.ReadKey();

}

运行结果:
这里写图片描述

笔记:
1、Convert.ToDouble与Double.Parse的区别。实际上,Convert.ToDouble内部调用了Double.Parse:
(1)、对于参数为null时候:
Convert.ToDouble参数为null是,返回0.0;
Double.Parse参数为null时,抛出异常;
(2)、对于参数为“”时:
Convert.ToDouble参数为”“时,抛出异常;
Double.Parse参数为“”时,抛出异常。
(3)、其他区别:
Convert.ToDouble可以转换的类型较多;
Double.Parse只能转换数字类型的字符串。
Double.TryParse与Double.Parse又较为类似,但它不会产生异常,转换成功返回true,转换失败返回false.最后一个参数为输出值,如果转换失败,输出值为0.0;
情况一:将0.2这类字符串通过三种方式转换:
这里写图片描述
情况二:将null类型字符串进行三种方式转换:
这里写图片描述
情况三:将“”类型字符串进行三种方式转换:
这里写图片描述
测试demo为:

static void Main(string[] args)
        {
            try
            {
                //string a = "0.2";//没有走try里面的数据
                //String a = null;
                string a = "";
                Console.WriteLine("将字符串为空通过下面三种方式进行转换为double类型:",a);
                try
                {
                    double d1 = Double.Parse(a);
                    Console.WriteLine("{0}通过Double.Parse转换成功结果为:{1}。", a,d1);
                }
                catch(Exception e)
                {
                    Console.WriteLine("{0}通过Double.Parse转换出错信息:{1}。", a, e.Message);
                }

                Console.WriteLine();
                Console.WriteLine("使用Double.Parse转换进行转换:");
                try
                {
                    double d2 = Convert.ToDouble(a);
                    Console.WriteLine("{0}通过Double.Parse转换成功结果为:{1}", a, d2);
                }
                catch(Exception e)
                {
                    Console.WriteLine("{0}通过Convert.ToDouble方式转换错误:{1}", a, e.Message);
                }
                Console.WriteLine();
                Console.WriteLine("使用Double.TryParse进行转换:");
                try
                {
                    double d3;
                    Double.TryParse(a, out d3);
                    Console.WriteLine("{0}通过Double.TryParse转换成功结果为:{1}", a, d3);
                }
                catch(Exception e)
                {
                    Console.WriteLine("{0}通过Double.TryParse方式转换错误:{1}", a,e.Message);
                }

            }finally
            {
                Console.WriteLine();
                Console.WriteLine("finally方法一定走");
                Console.ReadKey();
            }
 }           

猜你喜欢

转载自blog.csdn.net/weixin_39885282/article/details/80135277
今日推荐