2.C#1语言核心基础

C#1语言核心基础

本部分将重点讨论C#1语言中的几个核心基础,他们包括:委托、类型系统、值/引用类型

1.委托

委托类似与函数指针,是要在恰当的时间执行的一系列操作,如果代码想要执行操作,但不知道操作细节,就可以使用委托。

简单委托的构成

要执行一个委托必须满足一下4个条件

  • 申明委托类型
  • 创建一个方法包含要执行的代码
  • 创建一个委托实例
  • 调用委托实例

合并和删除委托

上面的例子委托实例都只是一个操作,但是真实情况要稍微复杂一些,委托实例实际有一个操作列表与之关联,这就是调用列表。

System.Delegate类型的静态方法Combine和Remove负责创建新的委托实例,Combine负责将两个委托实例的调用列表连接到一起,而Remove负责从一个委托实例中删除另一个实例的调用列表。

在C#代码中一般很少显示调用,Combine一般使用+或者+=操作符;而Remove一般使用-或者-=操作符。

调用委托实例时所有的操作都是按顺序执行,如果委托的签名具有非void返回值,这Inovke的返回值是最后一个值的返回值。如果调用列表中任何一个方法抛出异常,都会阻止执行后续的操作。

事件

事件和委托直接差异十分大,事件不是委托类型的字段。之所以会产生混淆是因为C#提供一种简写方式,允许使用字段风格的事件(C#编译器提供的语法糖)

event<委托类型> 事件名

{

Add{ //将函数注册到自己定义的委托实例 }

Remove{  //解除函数对自己定义的委托实例的注册 }

}

总结

  • 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法的接口;
  • 委托类型声明中所描述的类型签名决定哪个方法可以用于创建委托实例,同时决定调用的签名;
  • 为了创建委托实例,需要一个方法以及调用方法的目标;
  • 委托实例是不易变的;
  • 每个委托实例都包含一个调用列表(一个操作列表)
  • 委托实例可以合并到一起,也可以从一个委托实例中删除另一个;
  • 事件不是委托实例,只是成对的add/reamove方法

2.类型系统的特征

C#的类型系统

C#1的类型系统是静态的、显式的和安全的

  • 静态类型和动态类型

C#是静态类型:每一个变量都有一个特定的类型,而且该类型在编译时是已知的。只有类型已知的操作才是允许的,这是有编译器强制生效。

动态类型可能具有多种形式,动态类型的实质是变量中含有值,但那些值并不限定特定的类型,所以编译器不能执行相同形式的检查。C#4引入了动态类型,但是大多数C#4应用程序还是静态类

  • 显示类型和隐式类似

显示类型和隐式类型的区别只有在静态类型的语言中才有意义。

显示类型每个变量的类型都必须在声明中显示指明 string s="hello";

隐式类型则允许编译器根据变量的用途来推断变量的类型(var 类型推断) var s="hello"

  • 类型安全和类型不安全

类型安全:C#语言,CLR强制类型转换,不正确时会抛出异常,不允许直接操作内存等

类型不安全:C和C++语言,允许直接进行数据转换,操作内存,设备指针等。功能强大但是容易出错

总结

  • C#1是静态的、显示的、安全的
  • 静态类型任然不允许一个集合成为强类型的"字符串列表"或者"整数列表",除非针对不同的元素使用大量的重复代码
  • 方法覆盖和接口实现不允许协变性/逆变性

3.值类型与引用类型

Linq是C#3的核心,Linq是关于查询的,其目的是使用一致的语法和特性,以一种易阅读、可组合的方式,使对多数据源的查询变得简单。

值类型与引用类型

值类型:类似只有一份儿报纸,为了给朋友一份,需要影印报纸的全部内容并交给他,届时他拥有一份完整且与原本的没有关系的报纸。

引用类型:类似正在读一个网页,相比于报纸你只需要将URL地址发个朋友,两人读取的内容相同,URL就代替引用。

.Net 中大多数都是引用类型,其中常见的引用类型有:class、数组、枚举、委托、接口;常见值类型 int double float bool struct等。

误区

  1. 结构体是轻量级的类
  2. 引用类型保存在堆上,值类型保存在栈上

    引用类型的实例数据是保存在堆,但是值类型不一定保存在栈上,如果一个类中有值类型,那么该值类型也应该在堆上创建

  3. 对象在C#中默认是通过引用传递的

    引用类型变量的值是引用,而不是对象本身。不需要按引用来传递参数本身,就可以更改参数引用的那个对象内容。引用类型作为方法参数使用时,参数默认是以"值传递"方式来传递的,但值本身是一个引用。

装箱和拆箱

装箱:将值类型转换为引用类型

拆箱:将引用类型转换为值类型

总结

  • 对于引用类型的表达式,它的值是一个引用,而非对象,引用类似URL,允许你访问真实信息的一小片数据
  • 对于值类型的表达式,他的值是实际数据
  • 有时值类型比引用类型更有效,有时恰好相反
  • 引用类型的对象总是在堆上,值类型的值既可能在栈上,也可能在堆上

4.基于C#1基础之上的新特性

与委托有关特性

C#2中与委托有关的新特性:

泛型(泛型委托类型)

创建委托实例时使用的表达式

匿名方法

委托协变性/逆变性

C#3中与委托有关的新特性:

Lambda表达式

与类型系统有关特性

C#2中与系统类型有关的特性

泛型

受限的委托协变性/逆变性

C#3中与系统类型有关的特性

匿名类型

隐式类型

扩展方法

C#4中与系统类型有关的特性

受限的泛型协变/逆变

动态类型

与值类型有关特性

C#2中与值类型有关的特性

泛型

可空类型(可以为null的类型)

时间: 2024-12-20 02:49:35

2.C#1语言核心基础的相关文章

cocos-html5 JS 写法基础 语言核心

转载:http://blog.csdn.net/leasystu/article/details/18735797 cocos2dx 3.0 js继承:John Resiq的继承写法解析 CCClass.js cocos2d-html5/cocos2d/core/platform/CCClass.js ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

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

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

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

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

JS 语言核心(JavaScript权威指南第六版)(阅读笔记)

前言: 对于程序员,学习是无止境的,知识淘换非常快,能够快速稳固掌握一门新技术,是一个程序员应该具备的素质.这里将分享本人一点点不成熟的心得. 了解一门语言,了解它的概念非常重要,但是一些优秀的设计思想需要细心和大量实践才能慢慢参悟,在这之前需要做的是能够运用它来开发,那么了解一些基础特性非常有必要,通常这些特性是需要经验积累,从各种坑中累计出来,但是还有一种看似很笨却很有效的学习方法.那就是将别人的经验记录下来,有事没事都拿出来看看,集合开发中的经验,这会非常有效. 调试工具 firebug

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

C# 1的核心基础之二--类型系统 C# 1的核心基础之二--类型系统C#的类型特征C# 1类型系统的限制总结 C#的类型特征 C# 1的类型系统是静态的.显式的和安全的.大多数情况下说C#是"强类型"就是指静态类型. 静态类型和动态类型 静态类型:每个变量都有一个特定的类型,并且该类型在编译时是已知的. 动态类型:编译器不能执行类型检查,相反会试图采取一种合适的方式来理解引用值的给定表达式. C#从1到3都是完全静态的语言.C# 4引入了动态类型,然而大多数代码仍然是静态类型的. 显

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

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

001-C#1所搭建的核心基础

今天我们就要说两个东西:委托与值/引用类型. 1委托. 因为在unity中我们还是用的很少,所以这个委托我就一直不是很明白,所以今天就来说说这个委托到底是什么东西.我其实在unity中用的形式一般是这个样子的. btn.OnClick.AddListener(()=>{Debug.Log("Hello World")});这个形式是一个Lambda形式,但是在实际事情下还是用的很少,Unity有一点还是不好的,将大部分功能都封装给一个类,我们只需要调用API就行了,但是我们并不知

Android核心基础第五天

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

关于JS脚本语言的基础语法

JS脚本语言的基础语法:输出语法  alert("警告!");  confirm("确定吗?");   prompt("请输入密码");为弱类型语言: 开始时要嵌入JS代码:<script type="text/javascript"></script>: 关于写程序是需注意的基本语法:1.所有的字符全都是英文半角的:2.大部分情况下每条语句结束后要加分号:3.每一块代码结束后加换行:4.程序前呼后应: