第一单元 21世纪的程式执行
.net framework组成元素
基底类别库(BCL)
提供开发各种解决方案时所需使用的物件
所有的.net语言皆使用同一组
将各种不同解决方案的模型一致化
共同语言执行时期(CLR)
提供所有.net程序语言执行程式时的服务
提供自动记忆管理
提供与COM元件互通的能力
内建多执行绪执行能力@H_403_12@
中介语言格式IL
由微软所指定,是CLR的组合语言
所有.net程式语言编译器的目标格式皆为IL
可在不同平台,跨平台使用
编译成原生码之后的执行,仍被CLR管理@H_403_12@
组件的搜寻规则:
从GAC中找(搜寻组件公用快取)
如果没有找到,不过有组态设定档存在,则搜寻组态设定档所指定的位置。
如果还是没有找到,.net会搜寻执行档所在的目录
如果还是没有找到,应用程式将发生错误并结束执行、@H_403_12@
部署的选择
XCOPY Deployment
注册到GAC中
透过.Config@H_403_12@
单元2
物件的导向程式设计
物件——对象
属性——属性
行为——方法@H_403_12@
物件的复制
e.Clone()@H_403_12@
物件的产生
Dim e as employee
e=new employee();@H_403_12@
Dim e as new employee()
物件的毁灭(回收空间)
GC资源收集器来自动回收,会周期性地自动执行@H_403_12@
虽然GC帮我们减少了很多工作,但有时大文件空间的时候,最好还是要自己手动回收一下。 方法: Obj.Dispose() Obj=Nothing '让物件变成没有被参考
装箱(Boxing)
所有的东西不见得都是物件
实质型,放在堆点里面, 当成物件来看,tostring()装箱@H_403_12@
方法Method
用来执行一些动作的程式,就是Method@H_403_12@
多载(Overloading)其实就是函数的重载(可能版本有点老吧,说法都没跟上时代潮流)
多个名称相同的方法@H_403_12@
资料的保护(就是访问修饰符)
尽可能的将资料隐藏起来。(将内部成员限制访问)@H_403_12@
只读 ReadOnly 关键字 只写 WirteOnly 关键字 好处: 可以通过方法来对这个属性做一些判断或修改
Shallow copy
Deep copy(需要自己写两层复制)@H_403_12@
第三单元 类别与基底类别库
常量和共享
Const
Shared(共用成员)@H_403_12@
共用成员不用创建物件(不用实例化)直接用类名.属性或方法@H_403_12@
列举型别(Enum)
就是枚举类型@H_403_12@
模组@H_403_12@
Public Module _name
End Module
命名空间@H_403_12@
Namespace _name
End Namespace
命名空间可以嵌套,空间里可以有子空间。增加可读性,把一类的东西分到一个空间中,好区分,减少类名的冲突。@H_403_12@
使用:
完整参照(完整的名字)
优点:确保对象的类型正确
缺点:代码冗长@H_403_12@
导入命名空间
Imports
就可以只写最关键的类名
导入太多命名空间可能会:妨碍程序的可读性,增加名称冲突的风险
折衷方法:建立命名空间的别名。@H_403_12@
Imports BT=TeamX.BusinessTier
…
Dim c as BT.customs
集合
ArrayList 还可以排序
HashTable @H_403_12@
使用vs建立类别库,类别库将会编译成DLL@H_403_12@
方式1:加入DLL参考
执行起来较有效率,因为只有一个专案
当Dll变更之后,必须手动重新 编译@H_403_12@
方式2:加入专案
将自动编译DLL
会在背景编译变更过的元件,这会导致暂时停止回应。@H_403_12@
第四单元 事件驱动程序设计
多对一的事件处理 Private Sub form_load(…) Handles button1.click,button2.click Message.show("Changed!") End Sub 一对多的事件处理 在執行時期可以動態加入或移除事件與事件處理的關連 *範例: *在按鈕的事件中,呼叫 AddHandler 或是 RemoveHandler
Private Sub cmdMonitor_Click(…) Handles cmdMonitor.Click
Dim txt As TextBox,c As Control
For Each c in Me.Controls
If TypeOf c Is TextBox Then
txt = c
AddHandler txt.TextChanged,AddressOf Me.Common_TextChanged
End If
Next
End Sub
WinForms
AutoScroll属性
Anchor属性(固定控件的位置)@H_403_12@
窗体调用显示 窗体是类,引用时需要new Show 会可以往下执行 ShowDialog 会此窗体被关闭才会往下执行
物件的毁灭
无法自行毁灭物件
物件只能被garbate collector所毁灭@H_403_12@
我们可以选择释放资源 呼叫Dispose方法 表单物件为例,可以呼叫close或dispose方法
第五单元
明确型别转换
Option Strict On 开启明确型别转换
Option Explicit On 开启显示声明@H_403_12@
例外处理
发生了预期之外的状况
例如: 除零錯誤
數值溢位
存取陣列超過界限
物件參考不存在
檔案不存在
無法存取資料庫@H_403_12@
每一个例外都被视为物件,通过throw掷出,通过catch方式捕捉 例外的类别 System.SystemException系統定義的例外 System.ApplicationException使用者自訂的例外 处理 使用try-catch语法 Try statement1 statement2 Catch ex As Exception statement4 Statement5 Finally Statement6 Statement7 End Try (ps:Throw New System.ApplicationException(“File not found!”,ex) 扔出一个新的错误例外)
应用程式的追踪
追踪会记录有关从程式执行的讯息@H_403_12@
第六单元 资料库设计与sql
开放式资料库设计 栏位 栏位是具有型别的(string,int。。。) 主索引键(primary key) 关联 一对多 一对一 多对多 资料库正规化 第一阶正规化:一个栏位中只包含一个“原子”的资料 1NF,2NF,3NF,… 不要有重复的资料,资料只要储存一次 命名规则很重要 资料库管理系统(DBMS) 资料 资料库引擎JET 要求→ 资料库引擎 → 资料 类型:MS sql Server,Oracle,DB2,MysqL 工具 sql Server Query Analyzer : 執行 T-sql 語法 服務管理員 : 啟動或停止 sql Server Enterprise Manager : 管理 sql Server Microsoft Access 建立資料庫、查詢、… 使用 JET 引擎,免費 其它: 使用 Visual Studio .NET 中的伺服器總管 WebMatrix 整合開發環境 (http://www.asp.net/) 结构化查询语言(sql) DML:Data Manipulation Language (select,update,…) DDL:Data Definition Language (create,drop,…) DCL Join table_name on Outer join Insert Update Delete
删除记录的时候,最好多设置一个字段来标记已不被使用,不要真的删除,这会节省效率,也会减少不必要的麻烦。@H_403_12@
预储程序(存储过程) 可以接受參數 可以回傳資料表 預先編譯、最佳化過 – 幾乎是十倍快 优点: *執行快速 *將複雜的 sql 程式封裝起來 *提供另外一層的存取控制能力 *大部份的資料庫提供者都支援 *sql Server,etc. *缺點: *每個資料庫提供者的預儲程序語法都不一樣 *預儲程序不容易轉換成其它格式的程式
第七单元 资料库ADO.NET
ADO.NET架构 资料提供者 原生提供者: sql Server,Oracle 非原生提供者: OLEDB,ODBC 核心命名空间 一般: System.Data,System.Data.Common sql Server: System.Data.sqlClient Oracle: System.Data.OracleClient OleDB: System.Data.OleDb ODBC: System.Data.Odbc 存取方式 资料读取与写入 DataReader类可以逐一读取资料 只能下一个,唯独的游标 存取资料步骤 1、开放资料库连线 2、进行资料库操作(读取) 3、关闭资料库连线 DataSet 就是一个在记忆中的资料结构,用表格的方式来储存 DataSet = 離線式的 Recordset 資料是由伺服端複製回來 然後在用戶用端離線處理資料 允許你 : 減少資料庫伺服器的負載 關閉資料庫連線,並且離線處理資料 特別是在分散式應用程式中特別有用 使用DataAdapter类填满DataSet类 sql = "Select * From Products;" . . . Dim adapter As ss.sqlDataAdapter,ds As System.Data.DataSet dbConn = New ... dbCmd = New ... adapter = New ss.sqlDataAdapter(dbCmd) ds = New System.Data.DataSet() dbConn.Open() adapter.Fill(ds) dbConn.Close() ds.Tables(“Table”).TableName = “Products” ‘** 修改 DataSet 中表格的名稱 … DataSet : 可以儲存你想要處理的所有資料 可以搜尋、排序、修改 範例: 將整個 Sales 資料庫的資料填滿 DataSet sql = "Select * From Customers; Select * From Orders; " & _ "Select * From OrderItems; Select * From Products;" . . . dbConn.Open() adapter.Fill(ds) dbConn.Close() 工具
第八单元 界面:类别的设计(接口)
首先制定协定 Interface 使用implements 来实现 第二步才是实作 必须实现接口中的每一个方法,否则无法编译 优点: 统一了方法,当具体行为改变时,不用改变客户端的程序。 多型 就是声明接口,实例不同对象,就可以达到程序不用修改的效果 物件的复制 IClonable Public Class Customer: Implements IClonable Private m_Name As String Private m_Email As String Private m_Balance As Decimal ... Public Function Clone( ) As Object Implements ICloneable.Clone Return Me.MemberwiseClone( ) ‘** returns a shallow copy... End Function IComparable接口 比较两个物件,并传回一个数值(使用ASCII码来比较) < 0 表示 obj1 < obj2 = 0 表示 obj1 = obj2 > 0 表示 obj1 > obj2 Public Interface IComparable Function CompareTo(obj As Object) As Integer End Interface 泛用型资料层 通过选择判断来决定实例化具体的那个数据库对象连接。
第九章 继承:类别的设计
继承的基础 inherits继承 术语 Base/Super/Parent Derived/Sub/Child 特点:单继承。就是只能继承一个对象 重写与动态细节 Overridable:定义为可重写的方法 Overrides 来重写 就是动态方法和静态方法 静态方法比较快,因为要呼叫的方法已经预先决定。 动态方法比较有弹性,因为是动态的。 基底类别的设计 必须被继承和必须被重写 MustInherit MustOverride 限制不被继承 NotInheritable Equals和GetHashCode 如果物件是相等的,那么GetHashCode必须要相等
第10单元 资料库 商业层设计
资料存取的一般化 连线的开启与关闭 单一或少数使用者的情况:保持连线开启 多使用者的情况:用时开,用完就关闭。 连线集区(Pooling) 连线会存放到集区中 一般资料存取的问题 sql指令隐码攻击(注入) 验证输入 Regular expressions 友谊类别 Friend 资料层的设计 多层次设计:模组化、弹性、重复使用 重量化和轻量化 商业逻辑层的设计 支持流程中所有安全性、逻辑与资料存取(验证、维护、存储) 具型别DataSet Dim DS As System.Data.DataSet Dim customersDS As DataTier.CustomersDataSet . . . dataAdapter.Fill(DS) dataAdapter.Fill(customersDS) ‘ 一般的 dataset 存取方式 FirstName = DS.Tables(“Customers”).Rows(i).Item(“FirstName”).ToString() ‘ 具型別 dataset FirstName = customersDS.Customers(i).FirstName ORM Framework
第十一单元 以元件为基础的开发
组件 建立一个DLL组件 组件层级的attributes 强式名称 数字签章 .snk挡 com元件 互通机制 .net呼叫com元件 建立ccw interop的运作
第十二单元 应用程式设计与布置
应用程式设计 (1)整体的:布署单一的 .exe+ .net 到用户端 (2)分层结构的, .exe,DLLs,.net 到用户端 (3)远端,布署到用户端与服务端 (4)以web为基础的,布署web网页,DLLs+.net到web服务器 应用程式布署 .net必须安装 CLR + FxCL必须安装在 .exe执行的主机上 组件manifest AppBase .exe所在的位置称为AppBase,应用程式的主目录 布署选项 XCOPY布署 将exe,dlls+相关档案,全部拷贝到同一个资料夹 零接触布署 给exe一个url,用户直接透过ie浏览url NET 將 AppBase 設定到 Web 伺服器上的虛擬目錄 ! .NET 從 AppBase 下載 .EXE 和 .DLLs 問題: 安全性? 如何下載必要的檔案 (資料庫) 组建搜寻演算法 版本转向 应用程式的.config挡设计可以重写.exe manifest GAC Global Assembly Cache 位於 C:\Windows\Assembly 直接用檔案總管就可以檢視… 安装组件到GAC 组件必须有强式名称,使用gacutil.exe命令列工具(要有管理员权限) CodeBase 共用布署 将共用的各版本组件安装到GAC 具有强式命名的组件载入的效率比较快 下载布署 使用CodeBase来指定DLLs位置 潜在的问题: (1)config档hell问题 (2)程式码逆向工程 (3)程式码存取安全性 通过reflection机制手动布署 是一种在执行阶段针对组件进行处理的机制 载入组件 建立物件 检查栏位、方法、属性的规格 存取栏位、方法、属性
第十三单元 分散式程式设计
分散式设计 同步 用户端呼叫服务端,然后等待回应 简单,传统的程式设计模型 基于RPC的基础上 RPC架构 Proxy-stub物件用来建立爽法的同步呼叫机制 proxy是在用户端,stub在服务端 常见的同步设计 Form-based web 应用程式(webForms) 浏览器解决方案,要求某一页,等待服务器传回html Web service 呼叫web方法,等待xml资料传回来 连接不同平台的应用程式 Remoting 程式,呼叫方法,等待结果传回来 两端都是.net平台 连接.net平台下各层的元件(例如,java和.net) 例如: .NET on Linux & .NET on Windows .NET on WinXP & .NET/COM+ on Win2003 非同步 用户端传送要求,然后用户继续进行其它工作,服务端执行完后在将回应传给用户端 比较有弹性 比较难设计、实作、测试 Remoting设计 Sales物件是一个“single-call MBRO” 使用IIS(web server) 很容易开发和设定服务端 可以使用windows安全机制 Web services WSDL=web service description language .net web service 步骤: 1、建立一个asp.net web 服务专案 2、专案位置=http://localhost/SalesWebService 3、参考businessComponent.dll 4、将sercicel.asmx改名为Sales.asmx 5、撰写Sales.asmx的程式码Sales.asmx.vb
第十四单元 concurrent Programming
指的是有多个操作会同时执行的程式。@H_403_12@
Concurrency 多个操作同时执行 范例 web服务器慧颖多个浏览器的要求 资料库服务器处理多个查询 怎么办到? 实际上,一个cpu会在多个程式之间快速切换,看起来就像同时执行 cpu切换 由硬件切换 每隔一段时间,程式暂停、等候回应 行程(process) 多行程 多执行绪 多执行 设计上很困难 1、协调问题 通过执行绪通讯协调 等待彼此执行结束 join:值得就是等待执行绪执行完 一直等 等一段时间(带参数) 检查执行绪执行状况 IsAlive 2、通讯问题 参数 结果 执行过程中的变数值 使用队列 执行绪使用dequeue方法从队列取出资料 执行绪使用enqueue方法将资料加入队列 3、同步问题 使用syncLock指令 只有一个执行绪可以进入,其它执行绪要等 使用执行绪安全的队列物件 多执行绪很难设计 很多细节要注意 很难证明执行结果一定正确 很难进行侦错 可能产生死结(deadlock) 必须在执行绪中处理例外 delegates 是一种方法的指标,可以做呼叫端与被呼叫端的抽象化。 在执行绪上的另一层抽象化 内建支援多执行绪 更有效率:因为使用执行绪集区(thread pool) 支持参数传进与传回值
第十五单元 软体工程
所谓的“软体工程”其实就一个软体开发程序,依循这些程式就可以开发出稳定、可靠的软体系统,这些开发程序也可以不断重复使用、不断改良@H_403_12@
软体工程 背景: 软件越来越困难 软件应用在重要的系统上 软件甚至用在和生命相关的系统上 一般的做法: 传统“瀑布式”模型 1.需求分析 2.设计 3.实作 4.单元测试 5.整合测试 6.布署 7.维护 最近流行的“eXtreme Programming”模型 一个非常不同、比较精简快速的流程 主要原则: 把客户整合到软件开发流程中 随时设计 随时测试 不做过当的设计,越简单越好 工具 UML绘制工具 程式码分析工具: FxCop 测试工具: NUnit是一个免费的单元测试工具 原始码管理工具: 版本管理工具(Visual SourceSafe 、CVS 、 WinCVS) 文件产生工具: XML注解 Make工具: 是一个在Unix系统上常用的工具,用自动化整个软件的组建(编译)流程。 NMake是视窗版的
我好像学了一门古老的语言,而且跟语法都没有关系,介绍了从最初的程序设计到后来的软件工程,从软件设计到程序的编译会产生什么文件,需要那些系统工具的支持,比如CLR、DLL等等,再到软件的部署、维护用到的技术、工具和方法,从一个更加接触底层的角度去学习了软件的整个流程。 视频里面讲了好多都不认识的系统软件,原来我们编写的程序要真正的发布运行还需要学习很多的东西,不仅仅只是写完代码就ok了,还要考虑不同平台上的运行,并发操作带来的问题,需要有什么样的支撑环境等等一系列的工作。@H_403_12@