一起学习《C#高级编程》1--类型的安全性_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 一起学习《C#高级编程》1--类型的安全性

一起学习《C#高级编程》1--类型的安全性

 2014/12/19 11:24:53  90kankan  程序员俱乐部  我要评论(0)
  • 摘要:感觉写随笔第一天就遇到了困难,感觉好费时间啊,回宿舍就得8点多,然后只能看一点书。之后写随笔,首先得回忆,然后组织,最后打字。还有就是宿舍迎来的断网的日子,特别不方便,只能第二天去公司发。本人目前是.net开发实习生,之前零零散散学了些.net知识,如今打算好好巩固下C#,看了《C#高级编程》后感觉知识庞大,还有好些分支没掌握,虽然不知道有些东西值不值得学习,还是先学着吧。好了,步入正题:从《C#高级编程》第7章运算符和类型强制转换开始类型的安全性类型转换首先看一段代码
  • 标签:C# 一起 学习 编程 安全性

  感觉写随笔第一天就遇到了困难,感觉好费时间啊,回宿舍就得8点多,然后只能看一点书。之后写随笔,首先得回忆,然后组织,最后打字。还有就是宿舍迎来的断网的日子,特别不方便,只能第二天去公司发。本人目前是.net开发实习生,之前零零散散学了些.net知识,如今打算好好巩固下C#,看了《C#高级编程》后感觉知识庞大,还有好些分支没掌握,虽然不知道有些东西值不值得学习,还是先学着吧。

好了,步入正题:从《C#高级编程》第7章运算符和类型强制转换开始

类型的安全性

类型转换

首先看一段代码:

Byte value1=10;

Byte value2=20;

Byte total=value1+value2;

Console.WriteLine(total);

初看似乎没有错误,但此时VS会弹出下面一段错误提示:

 

  错误 :    无法将类型“int”隐式转换为“byte”。存在一个显式转换(是否缺少强制转换?)      

这是因为byte只能为8位,两个byte类型相加很容易得到超出8位大小的数值,这体现了C#类型的强安全性;

 

这时,把Byte total=value1+value2;

改为Byte value3 = (byte)(value1 + value2);  //显示转换

或者Int value3 = value1 + value2;   //隐士转换

 

以上就用到了两种类型转换,隐式转换显式转换

隐式转换:

就是从较小的数据类型可以转换为较大的数据类型

注意:

无符号的变量可以转换为有符号的变量,只要无符号的变量值在有符号的变量值内即可

 

·要类型转换中的可空类型(类型符后面带“?”,可空类型就是允许为Null的类型):

·可空类型转换规则遵循非可空类型的转换规则,即较小类型向较大类型转换

·非可空类型可以隐式转换为可空类型,但可空类型不能隐式转换为非可空类型。这是因为可空类型值允许为null,但非可空类型不允许为null。

 

 

显式转换:

就是强制转换,要说的就是数值溢出的问题

例如:

    long val=3000000000;

    int i=(int)val;

算术溢出,可以用unchecked和checked检测

默认情况下是unchecked,即对数值溢出不检测

使用checked,会迫使运行时抛出异常

    long val=3000000000;

    int i=checked((int)val);

或者checked用{}包住需要验证溢出的语句

    Checked

    {

        int i=checked((int)val);

    }

 

后面还会用异常 try}{} catch{}来引入异常处理

 

之前提到的,可空类型转换为非可空类型,必须用到显示转换。如int?转换为int。这是因为可空类型允许为null。

    如果可空类型为null,转换为非可空类型,就会抛出异常。

    int? a=null;

    int b=(int)a;       //将抛出异常

 

如果需要在数字和字符串之间转换,可以试用.Net类库中提供的方法:ToString();

    int i=10;

    string s=i.ToString();

 

关于类型转换,.Net还提供了两种安全带转换方法:Parse()和Convert方法。

    例如:

    string someString = "22";

     int value1 = Int32.Parse(someString);

     int value2 = Convert.ToInt32(someString);

 

还提到了一点,就是装箱拆箱

    装箱,就是把值类型转换为引用类型Object类型。而拆箱就是把Object类型重新转换为值类型。

    例:

    int myInt=10;

    object myObject=myInt;  //装箱,值类型都可以转换为引用Object类型

    int myInt2=(int)myObject;   //拆箱,装箱的相反过程,需要强制转换

 

    装箱,拆箱可用于:比如一个方法需要引用类型参数,此时把值类型装箱成为引用类型,之后可拆箱为值类型。

 

    23:37,今天先写到这了,由于看书的时间本身就比较晚,之后写随笔的进度比较慢,远远落后于看书的进度。留下了点小尾巴,是关于 比较对象之间的相等性 的。

    明天接着写运算符的重载

  以后会争取每天写一点C#学习的内容分享,也希望大家一起努力,把C#发扬光大,哈哈。欢迎多多指教!

发表评论
用户名: 匿名