C# 1的核心基础之二——类型系统

C# 1的核心基础之二——类型系统

C# 1的核心基础之二——类型系统
C#的类型特征
C# 1类型系统的限制
总结

C#的类型特征

C# 1的类型系统是静态的、显式的和安全的。大多数情况下说C#是“强类型”就是指静态类型。

  1. 静态类型和动态类型

    静态类型:每个变量都有一个特定的类型,并且该类型在编译时是已知的。

    动态类型:编译器不能执行类型检查,相反会试图采取一种合适的方式来理解引用值的给定表达式。

    C#从1到3都是完全静态的语言。C# 4引入了动态类型,然而大多数代码仍然是静态类型的。

  2. 显式类型和隐式类型

    这两个概念只有在静态类型语言中才有意义——因为类型在编译时都是已知的。

    显式类型:每个变量的类型必须在声明中显式指明。

    隐式类型:允许编译器根据变量用途来推断变量的类型。

  3. 类型安全与类型不安全

    有些语言(尤其是C和C++)允许做一些“不正当”的事,号称功能强大,但大多数情况下都“搬起石头砸自己的脚”。

    类型安全:强制类型转换时,编译器会检查转换是否可行,不行会触发编译时错误。如果理论上可行,执行时发现不正确,CLR也会抛出异常。

    类型不安全:允许在完全不相干的类型将进行强制类型转换,容易造成严重的后果。

C# 1类型系统的限制

  1. 集合,强和弱

    .NET 1.1内建的三种集合类型:

    • 数组——强类型——内建到语言和运行时中;
    • System.Collections命名空间——弱类型——无法得到编译时的类型安全;
    • System.Collections.Specialized命名空间——强类型集合——为每种类型创建新的强类型集合不是很理想。
  2. 缺乏协变的返回类型

    协变->“和谐的变”->“很自然的变化”->string到object:协变;

    逆变->“逆常的变”->“不正常的变化”->object到string:逆变。

    由于缺乏协变的返回类型,所以不得不在实现接口时选择实现一个返回指定类型的方法,然后显式实现接口来调用它——虽然可行,但是一点都不优雅。

    其实也缺乏参数类型的逆变性,对于接口解决方案是一样的,对于虚方法,解决方案是进行普通的方法重载——确实很烦人。

总结

C# 1的类型特征:

  1. 静态类型的——编译器知道你使用那些类型;
  2. 显式的——必须告诉编译器变量的类型是什么;
  3. 安全的——除非存在真是的转换关系,否则不能将一种类型当另一种类型使用;
  4. 集合不是强类型的,除非针对特定元素使用大量的重复代码;
  5. 方法覆盖和接口实现不允许协变性/逆变性。

来自为知笔记(Wiz)

时间: 2024-10-17 13:28:56

C# 1的核心基础之二——类型系统的相关文章

C#复习笔记(2)--C#1所搭建的核心基础

通过对C#1所搭建的核心基础的深入了解,可以知道之后的C#版本在C#1的基础上做了很多扩展,而这些扩展都是基于C#搭建的核心基础而来的. 委托 一.编写委托的过程 委托经常和C语言的"函数指针"挂钩.委托是方法参数化.函数式语言一个重要的表达方式.C#1中编写一个委托要经过四部: 1.声明委托类型 delegate void StringProcessor(string param1); 这个委托指定了一种无返回值,有一个string类型的参数的方法. 这个委托继承自System.Mu

Android核心基础第五天

一.学习目标及要求 课程目标 课程内容(必须讲的内容,就是讲课的知识点的顺序) * 掌握Activity 配置 * 掌握 Intent 显示意图 * 掌握 Intent 隐式意图 * 掌握两种意图的使用场景 * 掌握 activity 开启的数据传递 * 掌握activity的生命周期 * 掌握横竖屏切换的生命周期 * 掌握不同android版本 生命周期的细微差别 * 掌握开启activity获取返回值 * 掌握请求码 结果码的作用 * 掌握程序入口activity配置参数 * 掌握显示意图 

2.C#1语言核心基础

C#1语言核心基础 本部分将重点讨论C#1语言中的几个核心基础,他们包括:委托.类型系统.值/引用类型 1.委托 委托类似与函数指针,是要在恰当的时间执行的一系列操作,如果代码想要执行操作,但不知道操作细节,就可以使用委托. 简单委托的构成 要执行一个委托必须满足一下4个条件 申明委托类型 创建一个方法包含要执行的代码 创建一个委托实例 调用委托实例 合并和删除委托 上面的例子委托实例都只是一个操作,但是真实情况要稍微复杂一些,委托实例实际有一个操作列表与之关联,这就是调用列表. System.

java 基础(二)

java 基础(二)java 基础(二) 2016-2-1 by Damon 61. 编写多线程程序有几种实现方式 Java 5以前实现多线程有两种实现方法:一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活. 补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的

Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(一)

初学JavaWeb开发,请远离各种框架,从Servlet开始. Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践.很多Web框架是从实际的Web项目抽取出来的,仅和Web的请求和响应处理有关,形成一个基础,在开发别的应用项目的时候则可以从这个剥离出来的基础做起,让开发者更关注具体的业务问题,而不是Web的请求和响应的控制. 框架很多,但套路基本类似,帮你隐藏很多关于HTTP协议细节内容,专注功能开发. 但对于一个初学者来说,过早的接触框架往往事倍功半!同样一个问题,换一种

《跟老男孩学Linux运维之shell编程实战》-第二章 shell变量的核心基础

这篇文章主要讲解 shell变量的核心基础. 1.变量是什么? 变量是什么?可能有好多人不明白,简单地说,变量就是用一个固定的字符串(也可能是字符.数字等的组合)代替更多.更复杂的内容,该内容里可能还会包含变量.路径.字符串等其他的内容. 变量的赋值方式为:先写变量名称,紧接着是"="这个字符,最后是值,中间无任何空格(变量的内容一般要加双引号,以防止出错,特别是当值里的内容之间有空格时). 如何打印变量?通过echo命令加上$变量名 打印变量的值: 例如:定义变量和打印变量: [[e

Avaya Exrience Portal(AEP)基础介绍 二(四大组件总结)

什么是Avaya Exrience Portal(AEP)? 1:提供语音(或者多媒体)自动化用户体验的软件平台:  2:基于标准的VXML(定义了如何使用语音识别.语音合成.互联网访问.数据库访问.语音文件播放.DTMF输入等功能开发一个完整的语音应用系统.)和CCXML(它基于XML定义了一系列开放标准的呼叫控制API)的应用:  3:支持多媒体处理:  4:完全基于Web架构:  5:支持TTS文语转换和语音识别技术:     2)AEP包含的组件   EPM:AEP集成的管理,报表,监控

面向对象的核心基础

================ 面向对象的核心基础 ====================注意: 标识符    1.定义必须有意义    2.以字母,下划线,$符号开头,其他内容不能包含特征符号    3.类名首字母必须大写,方法名和属性名首字母必须小写,使用驼峰命名方式    4.常量所有字符都必须大写,如果多个单词之间使用下划线分割 一.什么是对象       现实:具有明确定义的行为和特征的一类事物       程序: 堆内存中分配内容空间       具体类的实例.二.什么类 类:

HBase框架基础(二)

* HBase框架基础(二) 上一节我们了解了HBase的架构原理和模块组成,这一节我们先来聊一聊HBase的读写数据的过程. * HBase的读写流程及3个机制 HBase的读数据流程: 1.HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在的位置信息,即找到这个meta表在哪个HRegionServer上保存着. 2.接着Client通过刚才获取到的HRegionServer的IP来访问M