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

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

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

运行结果为:
C#第二节(类型转换、变量、常量)
文章图片

二、C#强制类型转换方法
C#提供了下列内置的类型转换方法
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(); } }

运行结果为:
C#第二节(类型转换、变量、常量)
文章图片

笔记:
类型之间的转换————-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();

运行结果为:
C#第二节(类型转换、变量、常量)
文章图片

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#第二节(类型转换、变量、常量)
文章图片

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(); }

运行结果为:
C#第二节(类型转换、变量、常量)
文章图片

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;

C#第二节(类型转换、变量、常量)
文章图片

这里我们需要应用到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();

运行结果:
C#第二节(类型转换、变量、常量)
文章图片

但是用户如果输入的不是数字而是其他字符,如字符串,汉字,会发生什么呢?
输入任意一个字符串或者汉字,程序就报错无法再进行下去,因为int类型只能存储整数,不能存字符。
C#第二节(类型转换、变量、常量)
文章图片

所以保险起见使用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#中提供的基本的值类型大致可分为以下几类:
C#第二节(类型转换、变量、常量)
文章图片

C#允许定义其他值的变量,比如:enum,也允许定义引用类型变量,比如class。
C#中变量的定义
<有效的C#数据类型{char,int,float,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)
C#第二节(类型转换、变量、常量)
文章图片

字符串常量
字符串常量是括在双引号“”里,或者是在@”“里。字符串常量包含字符与字符常量相似。可以是普通字符、转义字符、和通用字符
定义常量
常量使用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(); }

运行结果:
C#第二节(类型转换、变量、常量)
文章图片

【C#第二节(类型转换、变量、常量)】笔记:
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这类字符串通过三种方式转换:
C#第二节(类型转换、变量、常量)
文章图片

情况二:将null类型字符串进行三种方式转换:
C#第二节(类型转换、变量、常量)
文章图片

情况三:将“”类型字符串进行三种方式转换:
C#第二节(类型转换、变量、常量)
文章图片

测试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(); } }

    推荐阅读