$10 可空类型.

Slides:



Advertisements
Similar presentations
第6章 对象和类.
Advertisements

单元二:面向对象程序设计 任务二:借书卡程序设计.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目6 通用堆栈.
C语言程序设计 主讲教师 :张群燕 电话:
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
四資二甲 第三週作業 物件導向程式設計.
第一章 C语言概述 计算机公共教学部.
算法设计与分析 Algorithm Design and Analysis
南京理工大学 第2章 Java基本语法 本章我们将学习Java编程语言的基本语法,包括变量、操作符、表达式、语句、字符串、数组、控制流以及如何使用帮助文档。 使用下面的编程框架: public class Test{ public static void main(String []args){ //以下添加测试代码.
第二章 JAVA语言基础.
類別與物件 Class & Object.
数据结构与算法 数据结构与算法实验
C++程序设计 王希 图书馆三楼办公室.
AOP实践 演讲人:陈思荣.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
C#程序设计 c# programming 泛型 C#程序设计课程组.
物件導向程式設計 (Object-Oriented rogramming)
第二章 C# 基础知识.
卢斌 Software Development Engineer Microsoft Corporation
DEV 331 深度探索 Microsoft Visual C# 2.0
程式設計實作.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
變數命名 保留字(Reserved Word)
并发机制 结果应该为: 线程 1: 1 线程 1: 2 线程 1: 3 线程 1: 4 线程 1: 5 线程 2: 6 线程 2: 7
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
明解C++教學手冊 柴田望洋 博士 著 書號:PG20269
C#程序设计基础 第二章 数据类型.
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
第三章 C# 基础知识.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第二章Java基本程序设计.
第二章 Java基本语法 讲师:复凡.
Java變數 2014/6/24.
C#程序设计基础 $3 成员、变量和常量.
陳維魁 博士 儒林圖書公司 第三章 變數與繫結 陳維魁 博士 儒林圖書公司.
第二章 Java基本语法 讲师:复凡.
第四章 类 4.1 基础知识 4.2 构造函数 4.3 方法 4.4 属性与索引 4.5 String类
第5章 函 数.
C语言程序设计 李祥 QQ:
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第二章 类型、对象、运算符和表达式.
第11章 物件互動行為塑模.
第二章 基本数据类型 ——数据的表示.
Review 1~3.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
本节内容 指针类型.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
JAVA 程式設計與資料結構 第三章 物件的設計.
變數、資料型態、運算子.
第2章 Java语言基础.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二章 Java基本语法 讲师:复凡.
Summary
Presentation transcript:

$10 可空类型

可空类型 问题的提出:值类型允许取空值 可空类型声明: int+null  int? float+null  float? Size+null  Size? ……

可空类型 对每个可为空的值类型增加一个新定义? 泛型解决方案:T+null  Nullable<T> int? = Nullable<int> float? = Nullable<float> Size? = Nullable<Size> ……

可空类型 Nullable<T> where T: struct bool HasValue T Value operator == != == 指的是要么二者的值都为null,要么二者都含有相等的基础类型的值。

可空类型 类型转换 转换规则一 任何可空类型都可以显示地转换到它所对应的基础类型,而基础类型则可以隐式地转换到对应的可空类型。 int i = 10; int? j = i; //隐式转换 j = 20; //隐式转换 int k = (int)j; //显式转换

可空类型 类型转换 转换规则二 从可空类型到非可空类型只可能存在显式转换,能够转换的条件是:存在从可空类型对应的基础类型到非可空类型的隐式或显示转换。 int? i = 10; short s = (short)i; //存在从int到short的显示转换 long l = (long)l; //存在从int到long的显示转换

可空类型 类型转换 转换规则三 从非可空类型到可空类型可能存在隐式或显式转换,能够进行转换的条件是:存在从非可空类型到可空类型对应的基础类型的隐式或显示转换。 short s = 5; long l = 1000; int? i = s; //存在从short到int的隐示转换 i = (int?)l; //存在从long到int的显示转换

可空类型 类型转换 转换规则四 从可空类型到其他可空类型可能存在隐式或显式转换,且能够进行转换的条件是:在两个可空类型的基础类型之间存在隐式或显示转换。 int? i = 5; double? d = 3.14; d = i; //存在从int到double的隐式转换 i = (int?)d; //存在从double到int的显式转换 //相当于三次显示转换的组合 i = (int?)((int)((double)d));

可空类型 类型转换 转换规则五 常量null可以被隐式转换为任何可空类型。在将空值null赋给可空类型的变量时,其实就已经隐含地进行了这种转换。 int? i = null; DateTime? d = null; 该转换规则不适用于任何为null的变量 object obj = null; double? d = obj;//错误,虽然object类型的变量obj的值也是空值,但它不是一个常量

可空类型 类型检查 is和as操作符也能作用于可空类型。对于Nullable<T>类型的变量x,这两个操作符的规则如下: 当x的值不为null时,表达式x is T和x is Nullable<T>的值均为true。 当x的值为null时,表达式x is T和x is Nullable<T>的值均为false。 空值结合 T? t1; T t2; T t = t1 ?? t2;

可空类型 操作符提升 如果某个操作符能够作用于某个值类型,那么它同样能够作用于该类型所对应的可空类型。即操作符的作用范围能从基础类型“提升”到可空类型。 提升后的操作符作用于可空类型时,如果表达式中的所有操作数都不含null值,那么操作符的作用效果和没有提升之前是一样的,只是在最后将基础类型隐式地转换为可空类型。而当表达式中出现了值为null的操作数时,操作符的作用效果比较复杂,分为以下几种情况: 对于关系操作符“!-”“==”,表达式的返回类型为bool类型,两个操作数均为null时返回true,,只有一个为null时返回false。 对于一元操作符”+”, ”-”, ”++”, ”--”, ”!”, ”~”,表达式的返回类型和操作数相同,且返回值为null。 对于二元操作符”+”, ”-”, ”*”, ”/”, ”%”以及位操作符”&”、”|”、 ”^”、”<<”和 ”>>”,表达式的返回类型和两个操作数的类型都相同,且返回值为null。 对于关系操作符”<”, ”>”, ”<=”, ”>=” ,表达式的返回类型为bool值,且返回类型为false。

可空类型 可空布尔类型:不符合提升规则 能够作用于布尔类型的操作符有”&”、”|”、 ”^”以及条件逻辑操作符”!”。作用于bool?类型的操作数时,只有异或操作符 ”^”和逻辑非操作符”!”符合提升规则。 对于与操作符”&”,只要有一 个操作数的值为false,表达式的值 就为false;而只要有一个操作数的值为true,表达式的值就是另一个操作数的值;两个操作数都为null时,表达式的值为null。 对于或操作符”|”,只要有一个操作数的值为true,那么表达式的值就为true;而只要有一个操作数为false,而表达式的值就是另一个操作数的值;两个操作数都为null时,表达式的值为null 。

$11 泛型接口、方法和委托

泛型接口 泛型接口、方法和委托

泛型接口 定义 类型参数 类型限制 使用 类型限制:类型参数需在被限制类型中出现! 继承:类型参数需在派生类型中出现!

泛型接口 常用泛型接口 IEnumerator<T> IEnumerable<T> ICollection<T> Ilist<T> IComparable<T> IComparer<T> IEqualityComparer IDictionary<K, V>

泛型接口 泛型接口与类型限制 Demo

泛型方法 泛型接口、方法和委托

泛型方法 public class Math { static void Swap(ref int x, ref int y) {int t=x; x=y; y=t;} } public static void Main() double x = 0.5, y = 3;

泛型方法 public class Math<T> { static void Swap(ref T x, ref T y) { T t=x; x=y; y=t; } } public static void Main() double x = 0.5, y = 3; Math<double>.Swap(ref x, ref y); Math<double>.Sqrt(x); Math<double>.Power(x, y); ?

泛型方法 public class Math { static void Swap<T>(ref T x, ref T y) { T t=x; x=y; y=t; } } public static void Main() double x = 0.5, y = 3; Math.Swap<double>(ref x, ref y); Math.Power(x, y); Math.Swap(ref x, ref y);

泛型方法 同样可以进行类型限制 public T Max<T> (T x, T y) where T: IComparable { if(x.CompareTo(y) >= 0) return x; else return y; }

泛型方法 通过泛型方法实现多态性 Demo