ibcadmin 发表于 2019-8-16 10:53:20

浅学CLR via C#笔记之类型转换

<p>我们都知道CLR最重要的一个特性就是类型安全,它在运行时就知道对象类型。</p>
<p>但我们会经常用到将一种类型转换成另一种类型,CLR也允许将对象转成他的实际类型,或者是它的基类型。</p>
<p>在C#中,支持隐士转换成它的基类型。</p>
<p>类型转换会用到以下方式:</p>

1 public class EntityBase
2 {
3   public int Id {get; set;}
4 }
5 public class User
6 {
7   public string Name {get; set;}
8 }
9
10 .....
11 public static void Main()
12 {
13      var user = new User();
14      var entity = user;// 隐士转换
15      Object obj = user;
16      var user2 = (User) obj; // 显示转换
17      var user3 = obj as User; // as操作符转换      
18 }

<p>其中 <strong><em>(User) obj </em></strong>用了强制转换,如果原始类型不是User的时候,会抛出异常。</p>
<p>而<em><strong>obj as User</strong></em> 会先判断类型,然后才会转换,如果原始类型不是User的时候,会返回null,反而不会抛出异常。</p>
<p>有的时候为了处理异常,需要加一些判断,比如使用如下判断语句,先判断类型是否正确:</p>

1 if(obj is User){
2   var user2 = (User) obj;
3   // or
4   var user3 = obj as User;
5 }

<p>这样也可以实现,但是我们可以换另外一种给方式去写,会更简单。</p>
<p>因为对<em><strong>obj as User</strong></em>而言 会先判断类型,然后才会转换,那这样的话就会跟外层的<em><strong>is</strong></em>语句有重复判断的部分,在单条语句不会引起很大的性能方面的损耗,但是如果在一个比较大的循环语句中这样大量的重复判断,性能损耗将是一个很大的影响。</p>

1 var user3 = obj as User;
2 if(user3 is null)
3 {
4      // ....
5 }

<p>如上写法,依据<em><strong>as</strong></em>语法的特性,判断返回结果的方式。</p>
<p> </p><br><br /><br /><br />来源:<a href="https://www.cnblogs.com/bu-dong/p/11361912.html" target="_blank">https://www.cnblogs.com/bu-dong/p/11361912.html</a>
页: [1]
查看完整版本: 浅学CLR via C#笔记之类型转换