DEV 331 深度探索 Microsoft Visual C# 2.0

Slides:



Advertisements
Similar presentations
泛舆情管理平台 ——助力媒体业务创新 新模式 新格局 创新盈利增长点 2/26/2017 1:59 AM 屈伟: 创始人,总裁
Advertisements

中国银行业前置端操作系统移植研究.
吴峻 软件设计工程师组长 Exchange Server 微软有限公司
王书贵 资深分析师 CCW Research 计世资讯
深市协助执法及证券查询业务介绍 客户服务部 China Securities Depository
四資二甲 第三週作業 物件導向程式設計.
抱怨處理技巧 高雄捷運公司 公共事務處 胡宜萍 安全 ‧ 便捷 ‧舒適 ‧ 可靠
Memory Pool ACM Yanqing Peng.
1. 设定愿景,确定业务场景 Microsoft Corporation
广东省广州市花都区教育局教研室 汤少冰 优化评估方式, 促进中学英语的教与学 广东省广州市花都区教育局教研室 汤少冰
——打造科技金融升级版 中国建设银行顺德分行 2015年6月.
2017年9月14日12时3分 DEV349 Visual C 无缝集成,无限潜力 李建忠 微软特约讲师 上海祝成科技
第二章 JAVA语言基础.
四川省集体林权流转平台 中国西部林权交易网
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
BizTalk Server 2004.
C#程序设计 c# programming 泛型 C#程序设计课程组.
第二章 C# 基础知识.
解振宇 客户技术经理 客户售前技术部 微软中国有限公司广州办事处
11/17/2018 5:15 PM 病毒,间谍软件最新趋势 © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes.
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
第8章 列舉器與集合 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
卢斌 Software Development Engineer Microsoft Corporation
利用最新Hyper-V Replica 功能達成Hyper-V 災難備援機制
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
Ch13 集合與泛型 物件導向程式設計(2).
互聯網安全資訊 助您達至更安全的網上體驗.
JAVA程序设计 第5章 深入理解JAVA语言----补充.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
MBL 327 Windows Mobile开发中的异构系统集成
委派與執行緒 建國科技大學 資管系 饒瑞佶.
C#面向对象程序设计 $7 继承和多态性.
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
使徒行傳 21:17-23章「保羅的見證(一)」 引言 預言保羅為主的名受許多的苦難的實現
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
$10 可空类型.
第六章 属性、索引器、委托和事件.
P2P聊天工具.
第三章 C# 基础知识.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
利用 ASP.NET MVC 提升您的 Web 應用程式


劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
第五章 介面/集合/泛型 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
SQL Server Mobile 2005 程序开发(三)
补充:c#语言基础.
C#程序设计基础 $3 成员、变量和常量.
4/30/2019 7:40 AM 約翰福音 15:9;17:20-23 加拉太書 6:1-2 © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product.
第二章 Java基本语法 讲师:复凡.
DEV342 Visual Basic 2005: 应用程序框架 和高级语言特性
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
5/5/2019 7:06 PM 两跨框架梁截面配筋图的绘制 © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may.
SQL Server Mobile 2005 程序开发(二)
MBL302 设计Windows Mobile应用程序的用户界面
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
C#快速導讀 流程控制.
MSG 361 如何从Exchange 5.5迁移 胡义 咨询顾问 上海星移软件有限公司 2019年7月31日8时9分
第二章 Java基础语法 北京传智播客教育
Windows Workflow Foundation CON 230
Presentation transcript:

DEV 331 深度探索 Microsoft Visual C# 2.0 2018年11月21日6时44分 DEV 331 深度探索 Microsoft Visual C# 2.0 付仲恺 微软特邀开发专家 © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

C# 2.0增强 范型(Generics) 匿名方法(Anonymous methods) 可为空类型(Nullable types) 2018年11月21日6时44分 C# 2.0增强 范型(Generics) 匿名方法(Anonymous methods) 可为空类型(Nullable types) 迭代器(Iterators) 局部类型(Partial types) 等等 100%向后兼容 © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

范型(Generics) public class List { private object[] elements; 2018年11月21日6时44分 范型(Generics) public class List { private object[] elements; private int count; public void Add(object element) { if (count == elements.Length) Resize(count * 2); elements[count++] = element; } public object this[int index] { get { return elements[index]; } set { elements[index] = value; } public int Count { get { return count; } public class List<T> { private T[] elements; private int count; public void Add(T element) { if (count == elements.Length) Resize(count * 2); elements[count++] = element; } public T this[int index] { get { return elements[index]; } set { elements[index] = value; } public int Count { get { return count; } List<int> intList = new List<int>(); intList.Add(1); // No boxing intList.Add(2); // No boxing intList.Add("Three"); // Compile-time error int i = intList[0]; // No cast required List intList = new List(); intList.Add(1); intList.Add(2); intList.Add("Three"); int i = (int)intList[0]; List intList = new List(); intList.Add(1); // Argument is boxed intList.Add(2); // Argument is boxed intList.Add("Three"); // Should be an error int i = (int)intList[0]; // Cast required © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

范型(Generics) 为什么需要范型? C#如何实现范型? 类型检查,不进行拆箱和类型强制转换 增加了代码重用机会(类型集合) 2018年11月21日6时44分 范型(Generics) 为什么需要范型? 类型检查,不进行拆箱和类型强制转换 增加了代码重用机会(类型集合) C#如何实现范型? 在运行时实例化,而不是编译时 类型检查在声明时,而不是实例化时进行 同时支持引用和值类型 完整的运行时类型信息 © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

范型(Generics) 类型参数能够被应用于: 类,结构体,接口,委托类型 2018年11月21日6时44分 范型(Generics) 类型参数能够被应用于: 类,结构体,接口,委托类型 class Dictionary<K,V> {...} struct HashBucket<K,V> {...} interface IComparer<T> {...} delegate R Function<A,R>(A arg); Dictionary<string,Customer> customerLookupTable; Dictionary<string,List<Order>> orderLookupTable; Dictionary<string,int> wordCount; © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

范型(Generics) 类型参数能够被应用于: 类,结构体,接口,委托类型 方法 类型推断! class Utils { 2018年11月21日6时44分 范型(Generics) 类型参数能够被应用于: 类,结构体,接口,委托类型 方法 class Utils { public static T[] CreateArray<T>(T value, int size) { T[] result = new T[size]; for (int i = 0; i < size; i++) result[i] = value; return result; } string[] names = Utils.CreateArray<string>("", 10); int[] numbers = Utils.CreateArray<int>(-1, 100); string[] names = Utils.CreateArray("", 10); int[] numbers = Utils.CreateArray(-1, 100); 类型推断! © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

范型(Generics) 类型参数能够被应用于: 类型参数能够具有约束 类,结构体,接口,委托类型 方法 2018年11月21日6时44分 范型(Generics) 类型参数能够被应用于: 类,结构体,接口,委托类型 方法 类型参数能够具有约束 class Dictionary<K,V>: IDictionary<K,V> where K: IComparable<K> where V: IKeyProvider<K>, IPersistable, new() { public void Add(K key, V value) { ... } class Dictionary<K,V> where K: IComparable { public void Add(K key, V value) { ... if (key.CompareTo(x) == 0) {...} } class Dictionary<K,V> { public void Add(K key, V value) { ... if (((IComparable)key).CompareTo(x) == 0) {...} } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

范型(Generics) 只允许有一个基本约束 可以有多个次要约束 可以有一个构造约束 实际类,或者结构体 接口或者类型参数 new() 2018年11月21日6时44分 范型(Generics) 只允许有一个基本约束 实际类,或者结构体 可以有多个次要约束 接口或者类型参数 可以有一个构造约束 new() class Link<T> where T: class {...} class Nullable<T> where T: struct {...} class Relation<T,U> where T: class where U: T {...} © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

范型(Generics) default(T) 类型转换 Null检查 void Foo<T>() { 2018年11月21日6时44分 范型(Generics) void Foo<T>() { T x = null; // Error T y = default(T); // Ok } default(T) 类型转换 Null检查 void Foo<T>(T x) { int i = (int)x; // Error int j = (int)(object)x; // Ok } void Foo<T>(T x) { if ((object)x == null) {...} } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

范型(Generics) 集合类 集合接口 集合基本类 工具类 反射 List<T> Dictionary<K,V> 2018年11月21日6时44分 范型(Generics) List<T> Dictionary<K,V> SortedDictionary<K,V> Stack<T> Queue<T> 集合类 集合接口 集合基本类 工具类 反射 IList<T> IDictionary<K,V> ICollection<T> IEnumerable<T> IEnumerator<T> IComparable<T> IComparer<T> Collection<T> KeyedCollection<T> ReadOnlyCollection<T> Nullable<T> EventHandler<T> Comparer<T> © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

2018年11月21日6时44分 范型(Generics)性能 © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

匿名方法(Anonymous Methods) 2018年11月21日6时44分 匿名方法(Anonymous Methods) delegate bool Predicate<T>(T item); public class List<T> { public List<T> FindAll(Predicate<T> filter) { List<T> result = new List<T>(); foreach (T item in this) { if (filter(item)) result.Add(item); } return result; public class Bank { List<Account> accounts; List<Account> GetOverdrawnAccounts() { return accounts.FindAll( new Predicate<Account>(IsOverdrawn) ); } static bool IsOwerdrawn(Account a) { return a.Balance < 0; public class Bank { List<Account> accounts; List<Account> GetOverdrawnAccounts() { return accounts.FindAll( delegate(Account a) { return a.Balance < 0; } ); } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

匿名方法(Anonymous Methods) 2018年11月21日6时44分 匿名方法(Anonymous Methods) 代码块替代委托方法 自动推断委托类型 代码块可以忽略参数列表 button.Click += delegate { MessageBox.Show("Hello"); }; button.Click += delegate(object sender, EventArgs e) { MessageBox.Show(((Button)sender).Text); }; © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

匿名方法(Anonymous Methods) 2018年11月21日6时44分 匿名方法(Anonymous Methods) 支持Closures public class Bank { List<Account> accounts; List<Account> GetOverdrawnAccounts() { return accounts.FindAll( delegate(Account a) { return a.Balance < 0; } ); } List<Account> GetLargeAccounts(double minBal) { delegate(Account a) { return a.Balance >= minBal; } public class Bank { List<Account> accounts; List<Account> GetOverdrawnAccounts() { return accounts.FindAll( delegate(Account a) { return a.Balance < 0; } ); } public class Bank { List<Account> GetLargeAccounts(double minBal) { Helper helper = new Helper(); helper.minBal = minBal; return accounts.FindAll(helper.Matches); } internal class Helper internal double minBal; internal bool Matches(Account a) { return a.Balance >= minBal; } } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

匿名方法(Anonymous Methods) 2018年11月21日6时44分 匿名方法(Anonymous Methods) 方法组转换 在可能的情况下,推断出委托类型 using System; using System.Threading; class Program { static void Work() {...} static void Main() { Thread t = new Thread(new ThreadStart(Work)); t.Start(); } using System; using System.Threading; class Program { static void Work() {...} static void Main() { Thread t = new Thread(Work); t.Start(); } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

匿名方法 (Anonymous Methods) 2018年11月21日6时44分 匿名方法 (Anonymous Methods) © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

可为空类型(Nullable Types) 2018年11月21日6时44分 可为空类型(Nullable Types) System.Nullable<T> 为所有值类型提供可为空的能力 具有类型T和布尔值的结构体 int 123 public struct Nullable<T> where T: struct { private T value; private bool hasValue; public T Value { get { … } } public bool HasValue { get { … } } } Nullable<int> 123 ??? true false Non-null Null © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

Nullable Types T? 语法 null 赋值 不同类型转换 Lifted操作符 Null结合运算符 int? x = 123; 2018年11月21日6时44分 Nullable Types T? 语法 null 赋值 不同类型转换 Lifted操作符 Null结合运算符 int? x = 123; double? y = 1.0; int? x = null; double? y = null; int i = 123; int? x = i; // T  T? implicit int j = (int)x; // T?  T explicit int? x = GetNullableInt(); int? y = GetNullableInt(); int? z = x + y; int? x = GetNullableInt(); int i = x ?? 0; © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

迭代器(Iterators) foreach依赖于“枚举模式” foreach使得枚举变得更加方便 GetEnumerator() 方法 2018年11月21日6时44分 迭代器(Iterators) foreach依赖于“枚举模式” GetEnumerator() 方法 foreach使得枚举变得更加方便 但是枚举器的实现难度加大了! foreach (object obj in list) { DoSomething(obj); } Enumerator e = list.GetEnumerator(); while (e.MoveNext()) { object obj = e.Current; DoSomething(obj); } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

迭代器(Iterators) public class ListEnumerator : IEnumerator { List list; 2018年11月21日6时44分 迭代器(Iterators) public class ListEnumerator : IEnumerator { List list; int index; internal ListEnumerator(List list) { this.list = list; index = -1; } public bool MoveNext() { int i = index + 1; if (i >= list.count) return false; index = i; return true; public object Current { get { return list.elements[index]; } public class List { internal object[] elements; internal int count; public IEnumerator GetEnumerator() { return new ListEnumerator(this); } public class List { internal object[] elements; internal int count; public IEnumerator GetEnumerator() { for (int i = 0; i < count; i++) { yield return elements[i]; } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

迭代器(Iterators) 方法递增计算并且返回一系列数值 yield return和yield break 2018年11月21日6时44分 迭代器(Iterators) public IEnumerator GetEnumerator() { return new __Enumerator(this); } private class __Enumerator : IEnumerator { object current; int state; public bool MoveNext() { switch (state) { case 0: current = "Hello"; state = 1; return true; case 1: current = "World"; state = 2; return true; default: return false; public object Current { get { return current; } 方法递增计算并且返回一系列数值 yield return和yield break 必须返回IEnumerator或者IEnumerable public class Test { public IEnumerator GetEnumerator() { yield return "Hello"; yield return "World"; } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

迭代器(Iterators) public class List<T> { 2018年11月21日6时44分 迭代器(Iterators) public class List<T> { public IEnumerator<T> GetEnumerator() { for (int i = 0; i < count; i++) yield return elements[i]; } public IEnumerable<T> Descending() { for (int i = count - 1; i >= 0; i--) public IEnumerable<T> Subrange(int index, int n) { for (int i = 0; i < n; i++) yield return elements[index + i]; List<Item> items = GetItemList(); foreach (Item x in items) {...} foreach (Item x in items.Descending()) {...} foreach (Item x in Items.Subrange(10, 20)) {...} © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

2018年11月21日6时44分 迭代器(Iterators) © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

局部类型(Partial Types) public partial class Customer { private int id; 2018年11月21日6时44分 局部类型(Partial Types) public partial class Customer { private int id; private string name; private string address; private List<Orders> orders; } public class Customer { private int id; private string name; private string address; private List<Orders> orders; public void SubmitOrder(Order order) { orders.Add(order); } public bool HasOutstandingOrders() { return orders.Count > 0; public partial class Customer { public void SubmitOrder(Order order) { orders.Add(order); } public bool HasOutstandingOrders() { return orders.Count > 0; © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

静态类(Static Classes) 只有静态成员 不能被用于变量,参数,域,属性等类型 2018年11月21日6时44分 静态类(Static Classes) 只有静态成员 不能被用于变量,参数,域,属性等类型 例如:System.Console,System.Environment public static class Math { public static double Sin(double x) {...} public static double Cos(double x) {...} ... } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

属性访问器(Property Accessors) 2018年11月21日6时44分 属性访问器(Property Accessors) 不同的访问器访问权限 访问器能够被严格限制 一般来说,set{…}的权限更加严格 public class Customer { private string id; public string CustomerId { get { return id; } internal set { id = value; } } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

外部别名(External Aliases) 2018年11月21日6时44分 外部别名(External Aliases) 在不同的程序集中使用相同的命名类型 namespace Stuff { public class Utils public static void F() {...} } foo.dll extern alias Foo; extern alias Bar; class Program { static void Main() { Foo.Stuff.Utils.F(); Bar.Stuff.Utils.F(); } namespace Stuff { public class Utils public static void F() {...} } bar.dll C:\>csc /r:Foo=foo.dll /r:Bar=bar.dll test.cs © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

命名空间别名修饰符 (Namespace Alias Qualifiers) 2018年11月21日6时44分 命名空间别名修饰符 (Namespace Alias Qualifiers) 版本上更加有弹性的代码 A::B仅将A作为别名 global::X作为全局命名空间 using IO = System.IO; class Program { static void Main() { IO::Stream s = new IO::File.OpenRead("foo.txt"); global::System.Console.WriteLine("Hello"); } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

内联警告控制 (Inline Warning Control) 2018年11月21日6时44分 内联警告控制 (Inline Warning Control) #pragma warning using System; class Program { [Obsolete] static void Foo() {} static void Main() { #pragma warning disable 612 Foo(); #pragma warning restore 612 } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

固定大小缓冲区 (Fixed Size Buffers) 2018年11月21日6时44分 固定大小缓冲区 (Fixed Size Buffers) 在非安全代码中的C语言风格数组 public struct OFSTRUCT { public byte cBytes; public byte fFixedDisk; public short nErrCode; private int Reserved; public fixed char szPathName[128]; } © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.