c#
Nagi_Way
这个作者很懒,什么都没留下…
展开
-
C#中的协变性与逆变性 - Part One
原文地址这篇博客很著名,应该有很多人翻译过了..但是忍住想自己翻译一下。“协变性”和“逆变性”是什么意思?首先,我们需要理解对于任意两个类型T和U,下面必有一个陈述是正确的(下文会用到这4个陈述):T比U要大 1T比U要小 2T和U相等 3T和U无关 4举个例子,想一下由Animal, Mammal, Reptile, Giraffe, Tiger, Snake和Turtl翻译 2017-04-07 20:25:42 · 599 阅读 · 0 评论 -
C#中的协变性与逆变性, Part Two: 数组协变性
C#用两种方式实现了可变性。今天,我们讲讲有缺陷的那种方法。自从C# 1.0,存储引用类型元素的Array是可变的。所以下面的代码是合法的:Animal[] animals = new Griaffe[10];因为Giraffe要比Animal小,并且“生成某种类型的Array”是协变操作,Giraffe[]比Aniaml[]小,所以实例可以被赋予那个变量。很不幸,在这种类型的可变性是有缺陷的。因为翻译 2017-04-07 21:13:02 · 606 阅读 · 0 评论 -
c#中的协变性与逆变性,Part Three:方法组转换的可变性
上一次我讨论了C#中的数组协变性如何会产生Bug(Java也是,还有很多其他语言)今天,我们讲讲一个C#2.0提供的健壮的可变性:从方法组到委托的转换。这是一种更复杂的可变性,所以我需要仔细地讲讲。假设你有一个方法返回Giraffe:static Giraffe MakeGiraffe() {...再假设你有一个委托类型,代表一个不接受参数并返回一个Animal的函数。比如,Func,下面的隐式转换翻译 2017-04-08 09:32:27 · 678 阅读 · 0 评论 -
CLR via C#笔记 - 第四章
所有类型都从System.Object派生“运行时”要求所有类型都从System.Object派生所有对象都用new操作运算符创建。没有和new操作符对应的delete运算符。不能显式释放对象。类型转换运行时,CLR总是知道对象是什么类型。CLR允许对象隐式向上转型,显式向下转型。在运行时,CLR检查转型操作,如果转换的类型不是对象的实际类型或者基类,那么会抛出InvalidCastE原创 2017-04-03 09:15:14 · 428 阅读 · 0 评论 -
拆箱解疑
《CLR via C#》中文第4版P112写道 “拆箱其实就是获取指针的过程,该指针包含在一个对象的原始值类型(数据字段)。其实,指针指向的是已装箱失利中的未装箱部分。所以和装箱不同,拆箱不要求在内存中赋值任何字节”我一开始的理解是,对于一个普通的表达式Point a = (Point) o, (Point)o 强制类型转换这部分是拆箱,然后赋值运算符导致了赋值,所以拆箱不要求在内存中赋值任何原创 2017-04-03 19:28:17 · 286 阅读 · 0 评论 -
认识托管堆
学习C#,你总会遇到“托管堆”这个术语,你知道堆是什么,但托管堆又是什么呢?为什么会有托管堆?内存管理是一件困难的事情,如果交给程序员来处理,那么可能会因为忘记释放内存而导致内存泄漏。于是,C#替我们管理一部分内存。托管堆是什么意思?托管堆(Managed heap)的意思就是被C#管理的堆。托管堆从哪里来?托管堆是从内存空间划分出来的一个地址空间区域。托管堆管理什么?托管堆管理着所有引用类型指向的原创 2017-04-13 14:44:26 · 1209 阅读 · 3 评论