《DEV353.NETFramework更高效开发》由会员分享,可在线阅读,更多相关《DEV353.NETFramework更高效开发(50页珍藏版)》请在金锄头文库上搜索。
1、DEV353.NET Framework 更高效开发更高效开发李琪李琪开发合作经理开发合作经理平台及开发合作部平台及开发合作部微软微软(中国中国)有限公司有限公司Why This Talk? 大部分的文档和资源只关注技术大部分的文档和资源只关注技术本课程关注如何更好的应用本课程关注如何更好的应用 .NET经验、技巧、工具、应用、设计指导经验、技巧、工具、应用、设计指导经验、技巧、工具、应用、设计指导经验、技巧、工具、应用、设计指导目的在于增强你的开发效率目的在于增强你的开发效率目的在于增强你的开发效率目的在于增强你的开发效率除特殊声明外除特殊声明外 Microsoft Visual Basic
2、 和和 Visual C# 都适用都适用WinCV类似头文件的类型信息类似头文件的类型信息类似头文件的类型信息类似头文件的类型信息C:Program FilesMicrosoft Visual Studio C:Program FilesMicrosoft Visual Studio .NET 2003SDKv1.1BinWinCV.exe.NET 2003SDKv1.1BinWinCV.exeWinCV.NET 深藏的秘密深藏的秘密智能感知智能感知基本数据类型基本数据类型基本数据类型基本数据类型其他方法其他方法其他方法其他方法快速参考快速参考节省在节省在节省在节省在msdnmsdn上搜索的时
3、间上搜索的时间上搜索的时间上搜索的时间可以自定义的装配列表可以自定义的装配列表可以自定义的装配列表可以自定义的装配列表WinCV.exe.configWinCV.exe.config为大型项目节省时间为大型项目节省时间为大型项目节省时间为大型项目节省时间转到定义转到定义: Visual Studio 2005Visual Studio 2005Visual Studio 2005内建内建内建内建WinCVWinCV式的类型信息式的类型信息式的类型信息式的类型信息公共成员公共成员公共成员公共成员包括注释包括注释包括注释包括注释包括属性包括属性包括属性包括属性 Visual Studio 2005
4、代码定义窗口代码定义窗口(Code Definition Window)常量定义视图常量定义视图常量定义视图常量定义视图 保持当前的文档保持当前的文档保持当前的文档保持当前的文档只读只读只读只读WinDiff比较和分析文件的不同点比较和分析文件的不同点比较和分析文件的不同点比较和分析文件的不同点单个文件或整个目录单个文件或整个目录单个文件或整个目录单个文件或整个目录 智能的智能的智能的智能的比比比比 Microsoft Visual SourceSafeMicrosoft Visual SourceSafe比较器更好比较器更好比较器更好比较器更好隐藏速度隐藏速度自定义自动隐藏速度自定义自动隐藏
5、速度工具工具工具工具| |选项选项选项选项| |常规常规常规常规多工程启动多工程启动在一个解决方案中同时启动多个项目在一个解决方案中同时启动多个项目在一个解决方案中同时启动多个项目在一个解决方案中同时启动多个项目同一个同一个同一个同一个 debug debug 会话会话会话会话 (Start button(Start button, F5)F5)Solution|Properties|Startup Project Solution|Properties|Startup Project 链接文件链接文件链接方式开启文件链接方式开启文件链接方式开启文件链接方式开启文件以引用方式编译,而不拷贝文件
6、以引用方式编译,而不拷贝文件以引用方式编译,而不拷贝文件以引用方式编译,而不拷贝文件例如例如例如例如: : SolutionInfo.csSolutionInfo.cs, , 共享的文件共享的文件共享的文件共享的文件: :snk snk 文件文件文件文件版本信息版本信息版本信息版本信息安全策略安全策略安全策略安全策略版权信息版权信息版权信息版权信息公司名等公司名等公司名等公司名等 解决方案目录解决方案目录通常一个解决方案包含多个项目通常一个解决方案包含多个项目通常一个解决方案包含多个项目通常一个解决方案包含多个项目 解决方案文件不应被包含在任何一个特定的项目解决方案文件不应被包含在任何一个特定
7、的项目解决方案文件不应被包含在任何一个特定的项目解决方案文件不应被包含在任何一个特定的项目中中中中更多更多更多更多| |创建解决方案的目录创建解决方案的目录创建解决方案的目录创建解决方案的目录 其他方法其他方法其他方法其他方法文件文件文件文件| |新建新建新建新建| |空白解决方案空白解决方案空白解决方案空白解决方案 外部工具集成外部工具集成自动化引用外部工具自动化引用外部工具自动化引用外部工具自动化引用外部工具 ILDasmILDasmGacUtilGacUtil传递传递传递传递VSVS的宏变量的宏变量的宏变量的宏变量将警告视为错误将警告视为错误 项目属性项目属性项目属性项目属性| |配置属
8、性配置属性配置属性配置属性| |生成生成生成生成把警告等级设置成把警告等级设置成把警告等级设置成把警告等级设置成4 4发布之前必经步骤发布之前必经步骤发布之前必经步骤发布之前必经步骤 对对对对debugdebug也非常有用也非常有用也非常有用也非常有用可拖拽的对象可拖拽的对象Windows Form, Web Form, Web Services 都可以接收多拽对象都可以接收多拽对象SQL SQL 表格表格表格表格/ /数据源数据源数据源数据源 生成生成生成生成adaptor, connection, command, dataset, adaptor, connection, command
9、, dataset, binding binding 等对象等对象等对象等对象组件组件组件组件事件日至,目录监视器,计时器,等等事件日至,目录监视器,计时器,等等事件日至,目录监视器,计时器,等等事件日至,目录监视器,计时器,等等ImportsSystem.ComponentModelPublicClassMyDataAccessInheritsComponentEndClass可拖拽的对象可拖拽的对象通过组件,为自定义类添加拖拽支持通过组件,为自定义类添加拖拽支持System.ComponentModelSystem.ComponentModel用完后可去除继承用完后可去除继承用完后可去除继
10、承用完后可去除继承Visual Studio Visual Studio 显示不同的图标显示不同的图标显示不同的图标显示不同的图标矩形选择矩形选择选取前,先按住选取前,先按住 ALT 键键去除命名空间和重复的定义时特别有用去除命名空间和重复的定义时特别有用去除命名空间和重复的定义时特别有用去除命名空间和重复的定义时特别有用文档大纲文档大纲按层次浏览对象按层次浏览对象按层次浏览对象按层次浏览对象 支持支持支持支持 Microsoft ASP.NET forms, HTML, XML Microsoft ASP.NET forms, HTML, XML 对复杂的文件很有用对复杂的文件很有用对复杂的
11、文件很有用对复杂的文件很有用视图视图视图视图| |其他窗口其他窗口其他窗口其他窗口 | |文档大纲文档大纲文档大纲文档大纲搜索隐藏文本搜索隐藏文本缺省情况下,搜索和查找替换并不针对收缺省情况下,搜索和查找替换并不针对收起的文本起的文本 简单的方法改变默认值简单的方法改变默认值Visual Studio 2005搜索和查找替换默认包搜索和查找替换默认包括收起的文本括收起的文本 条件编译条件编译编译时不执行的方法调用编译时不执行的方法调用没有定义条件没有定义条件没有定义条件没有定义条件System.DiagnosticsSystem.Diagnostics#ConstMySpecialCondit
12、ion =TrueusuallyDEBUGClassSomeClass _publicSubSomeMethod()EndSubEndClassClientsidecodeDimobjasSomeClassobj=newSomeClass()Thislineisconditionalobj.SomeMethod()事件访问器事件访问器使用添加使用添加/删除删除accessors, 而不是直接访问而不是直接访问成员事件成员事件类似属性类似属性类似属性类似属性提倡封装和松耦合提倡封装和松耦合提倡封装和松耦合提倡封装和松耦合Visual C# 2002 - 2005仅仅Visual Basic 20
13、05事件访问器事件访问器publicclassMyPublisherEventHandlerm_MyEvent;public event EventHandler MyEventaddm_MyEvent+=value;removem_MyEvent-=value;事件访问器事件访问器PublicClassMyPublisherEventm_MyEventAsEventHandlerPublicCustomEventMyEventAsEventHandlerAddHandler(ByValvalueAsEventHandler)AddHandlerm_MyEvent,valueEndAddHan
14、dlerRemoveHandler(ByValvalueAsEventHandler)RemoveHandlerm_MyEvent,valueEndRemoveHandlerRaiseEvent(ByValsenderAsObject,ByValeaAsEventArgs)RaiseEventm_MyEvent(sender,ea)EndRaiseEventEndEventEndClass事件访问器事件访问器使用使用 “正常的正常的” 事件追加语法事件追加语法 MyPublisherpublisher=newMyPublisher();publisher.MyEvent+=newEventHa
15、ndler(OnMyEvent);voidOnMyEvent(objectsender,Eventargsargs).DimpublisherAsNewMyPublisher()AddHandlerpublisher.MyEvent,AddressOfOnMyEventSubOnMyEvent(ByValsenderAsObject,ByValargsAsEventargs).EndSubWindows 窗体透明窗体透明所有的可见倥件都有透明属性所有的可见倥件都有透明属性所有的可见倥件都有透明属性所有的可见倥件都有透明属性0-100%0-100%可视化效果可视化效果可视化效果可视化效果Wind
16、ows 窗体透明窗体透明渐暗窗体渐暗窗体组合组合组合组合 计时器计时器计时器计时器 和和和和Close 事件事件事件事件 线程命名不是必须,但是对于线程命名不是必须,但是对于debug非常有用非常有用ImportsSystem.ThreadingDimcurrentThreadAsThread=Thread.CurrentThreadDimthreadNameAsString=MainUIThreadcurrentThread.Name=threadNameThread Name线程名断点线程名断点 (.NET 1.1)用线程名作为中断条件用线程名作为中断条件设置条件中断设置条件中断设置条件中
17、断设置条件中断使用完全限定类型使用完全限定类型使用完全限定类型使用完全限定类型线程名中断线程名中断 (.NET 2.0)设置断点过滤设置断点过滤默认禁用默认禁用工具工具工具工具| |选项选项选项选项| |调试调试调试调试| |常规常规常规常规| |起用断点过滤起用断点过滤起用断点过滤起用断点过滤结束进程结束进程不要调用不要调用Abort()线程需要被清除线程需要被清除线程需要被清除线程需要被清除Abort() 不能彻底清除不能彻底清除不能彻底清除不能彻底清除线程方法需要检查标志线程方法需要检查标志保护性的互斥标志保护性的互斥标志保护性的互斥标志保护性的互斥标志Kill() 方法需要设置标志,并
18、等待进程方法需要设置标志,并等待进程终结终结Abort() 还有一个缺陷还有一个缺陷线程可能在线程可能在catch中进行未定义的处中进行未定义的处理理publicclassWorkerThread:IDisposableprotectedThreadm_ThreadObj;protectedboolm_EndLoop; protected Mutex m_EndLoopMutex;protectedboolEndLoopset m_EndLoopMutex.WaitOne();m_EndLoop=value; m_EndLoopMutex.ReleaseMutex();getboolresul
19、t=false; m_EndLoopMutex.WaitOne(); result = m_EndLoop; m_EndLoopMutex.ReleaseMutex();returnresult;publicWorkerThread()m_EndLoop=false;m_ThreadObj=null; m_EndLoopMutex = new Mutex();publicclassWorkerThread:IDisposablepublicvoidStart()m_ThreadObj = Thread.CurrentThread;inti=0;while(EndLoop=false)/dowo
20、rkhere/Killiscalledonclientthread-mustusecachedthreadobjectpublicvoidKill()Debug.Assert(m_ThreadObj!=null);if(m_ThreadObj.IsAlive=false)return; EndLoop = true;/Waitforthreadtodiem_ThreadObj.Join();if(m_EndLoopMutex!=null)m_EndLoopMutex.Close();/RestofWorkerThread编码标准编码标准 务必要使用广泛接受的编码标准务必要使用广泛接受的编码标准
21、命名约定和风格命名约定和风格命名约定和风格命名约定和风格编码实践编码实践编码实践编码实践工程设置和结构工程设置和结构工程设置和结构工程设置和结构Framework Framework 特定的指导建议特定的指导建议特定的指导建议特定的指导建议少问为什么少问为什么减少害处减少害处减少害处减少害处IDesign 编码标准编码标准标准标准导入导入/导出设置导出设置工具工具|导入导入/导出设置导出设置导入导入/导出设置导出设置支持团队设置文件支持团队设置文件模糊导入模糊导入 自动应用新版本的设置自动应用新版本的设置自动应用新版本的设置自动应用新版本的设置语言版本语言版本可以限定可以限定 Visual C
22、# 的版本的版本生成生成生成生成| |高级高级高级高级默认默认 Visual C# 2.0Visual C# 2.0ISO-1Visual C# 1.0 Visual C# 1.0 (Visual Studio(Visual Studio 2002) 2002)多平台多平台多平台多平台接口分解与设计接口分解与设计这是好的设计么?这是好的设计么?这是好的设计么?这是好的设计么?接口分解与设计接口分解与设计这是好的设计么?这是好的设计么?接口分解与设计接口分解与设计平衡模块大小与集成度平衡模块大小与集成度平衡模块大小与集成度平衡模块大小与集成度Number of modulesCost or Ef
23、fortMinimum costCost / moduleCost tointerfaceTotal cost接口分解与设计接口分解与设计从可重用的角度考虑接口分解问题从可重用的角度考虑接口分解问题例如:例如:“狗狗”接口接口 需求需求:叫叫叫叫捡捡捡捡户口号户口号户口号户口号打过预防针打过预防针打过预防针打过预防针接口分解与设计接口分解与设计可以这样定义可以这样定义 IDog这种设计并没有很好的分解接口这种设计并没有很好的分解接口Bark() Bark() 和和和和 Fetch() Fetch() 的关联性更强的关联性更强的关联性更强的关联性更强publicinterfaceIDogvoid
24、Fetch();voidBark();longVetClinicNumberget;set;boolHasShotsget;set;publicclassPoodle:IDogpublicclassGermanShepherd:IDog接口分解与设计接口分解与设计更好的分解方式更好的分解方式publicinterfaceIPetlongVetClinicNumberget;set;boolHasShotsget;set;publicinterfaceIDogvoidFetch();voidBark();publicinterfaceICatvoidPurr();voidCatchMouse()
25、;publicclassPoodle:IDog,IPetpublicclassSiamese:ICat,IPet接口分解与设计接口分解与设计publicinterfaceIMammalvoidShedFur();voidLactate();publicinterfaceIDog:IMammalvoidFetch();voidBark();publicinterfaceICat:IMammalvoidPurr();voidCatchMouse();层次划设计逻辑上关联且重复的方法层次划设计逻辑上关联且重复的方法接口分解与设计接口分解与设计Interface Factoring Metrics 接
26、口分解是其包含的方法更少接口分解是其包含的方法更少平衡对立面平衡对立面过于细腻的接口过于细腻的接口过于细腻的接口过于细腻的接口 vs.vs. 过于粗糙的分解过于粗糙的分解过于粗糙的分解过于粗糙的分解Interface Factoring Metrics 可能出现只有一个成员的接口,但是应该可能出现只有一个成员的接口,但是应该尽量避免尽量避免Dull facetDull facet过多的参数过多的参数过多的参数过多的参数过于粗糙过于粗糙过于粗糙过于粗糙: : 应被分解为多个接口应被分解为多个接口应被分解为多个接口应被分解为多个接口分解到多个已有接口分解到多个已有接口分解到多个已有接口分解到多个已
27、有接口理想的成员数量理想的成员数量最多不要超过最多不要超过20(12)Interface Factoring Metrics 方法、参数和属性的比例方法、参数和属性的比例接口中的方法应比属性多接口中的方法应比属性多接口中的方法应比属性多接口中的方法应比属性多搞好完全封装搞好完全封装搞好完全封装搞好完全封装比值至少比值至少比值至少比值至少 2:12:1异常是只有属性的接口异常是只有属性的接口异常是只有属性的接口异常是只有属性的接口不应有方法不应有方法不应有方法不应有方法避免定义时间避免定义时间避免定义时间避免定义时间.NET Factoring Metrics对对300+接口设计统计接口设计统计平均平均, 3.75 方法方法/接口接口 方法方法/属性比例属性比例 3.5:1事件成员的比例小于事件成员的比例小于3%On average, .NET interfaces are well factored Resources中文中文中文中文MSDNMSDN文档库文档库文档库文档库开发中心开发中心开发中心开发中心 WebcastWebcastExpress CenterExpress CenterISV CenterISV Centerhttp:/