Pro visual c++cli and .net 2.0 platform2 学习笔记(11 第五章到第八章 )

    技术2022-05-11  121

    第二部分 在C++/CLI中的 .net框架开发 第五章 .net框架类库 虽然类库的名字空间看起来有继承的层次结构,实际上并没有真正的继承层次结构。 System::Collections::Generic与CLS不兼容。 debug只有在debug环境下执行,trace在任何环境下都执行。 System::Runtime::Remoting等于或代替了DCOM System::Security .net安全分为三部分:role-based security, code access security和加密 System::Web c++/CLI只支持web服务而不支持web应用程序。 第六章 集成的XML注释文档 ///注释:只能用在类上,不能用在类外的函数和变量,也不能用在名字空间上;也只能用在类声明上,不能用在类实现上。 cl.exe产生.xdc文件,xdcmake.exe将其转为.xml文件。 Intellisense将会自动显示///的注释。 拷贝xmk文件到程序集目录;或/doc指定目录;或IDE “<”用“<”代替 三类tag:描述;格式化;引用其它文档。 作者介绍了一款xml格式化工具NDoc。 <summary>标签被Intellisense和Object Browser支持。 <c>和<code>的区别:换行。 <param>和<paramref>的区别:独立成段(section)。 //很有用,很有缺,也很简单的一章。最后的一个例子list6-5很好。 //java也有类似的功能。 第七章 集合 System::Collections, System::Collections::Specialized, and System::Collections::Generic 注意,没有继承关系。 .net有许多其它的特殊的集合类在其它的名字空间中,如: System::Text::RegularExpressions::Group, System::Security::PermissionSet, System::Web::UI::WebControls::DataKeyCollection, and even System::Array等等。 注意:System::Collections::Generic不是同步的(不是线程安全的) 使用接口IEnumerable,IEnumerator(GetEnumerator,MoveNext,Current)或者for each(更易用,能用就用它)。 标准集合类 没有什么新的内容,主要是看.net的实现方法和他提供的接口。 ArrayList 缺省capacity=16.。加倍。加倍问题的解决:指定capacity大小,控制不超过capacity。 注意:设置的capacity小于count:ArgumentOutOfRangeException。         试图通过下标(缺省的index属性/*属性部分介绍过*/)访问不存在的元素,产生ArgumentOutOfRangeException。 contains线性搜索;binarysearch。 BitArray 三类构造函数。 BitArray ^barray3 = gcnew BitArray( 256, true );   array<bool>^ bools = gcnew array<bool> { true, false, true, true, false }; BitArray ^barray1 = gcnew BitArray( bools );   BitArray ^barray1 = gcnew BitArray( 8 ); BitArray ^barray2 = gcnew BitArray(barray1); Hashtable and SortedList SortedList是hashtable和array的结合形式。用缺省index访问像hashtable;用GetByIndex像数组。SortedList能做hashtable做的任何事,而且更多。可以用key也可以用index访问元素。 在insert updates delete,SortedList比hashtable慢。 构造函数:capacity一定要够大,这样元素增加时,防止rehash。 Load factor:0.1-1。越大查找越慢,但节省内存。 注意:null是有效的键值(数据库程序员注意了) 可以用key value或者两者都用来访问元素。两者都用要用到IDictionaryEnumerator而不是IEnumerator。 队列和栈 peek方法。 Enqueue,Dequeue。 Push,Pop。 特殊的集合类 using System::Collections::Specialized; ListDictionary 当元素count小于10用它,大于10用hashtable。 .net提供了HybridDictionary,它开始为ListDictionary,当元素增长后,自动变为hashtable。 对Add方法提供重复的键值:ArgumentException。 StringCollection 用StringEnumerator而不用 StringDictionary 专门处理字符串的hashtable。 NameValueCollection 与StringDictionary相似,但允许一键对多值(用add;set不能,只会覆盖)。 GetValues()返回字符串数组; Get()返回一个字符串(里面用逗号分隔)。 泛型集合类 都有相应的标准集合类(除了LinkedList) 用同一个空间System::Collections::Generic,在不同的dll内。 mscorlib.dll: List<T> Queue<T> Stack<T> Dictionary<K,V> SortedDictionary<K,V> LinkedList<T>        System.dll: Collection<T> ReadOnlyCollection<T>KeyedCollection<K,V> 注意:它们缺省都不支持IsSynchronized,SyncRoot属性和Synchronized()方法,除非你自己实现他。(不是线程安全的) List<T> 与arraylist对应,但功能更多。不同之处:可以固定长度。多出的功能:使用Action<T>委托操作元素和Predicate<T>委托查找和比较元素。 TrimToSize,加倍容量问题的另一个解决方法。 List<T>的ForEach()(对每个元素处理不同)不同于for each语句(对每个元素处理相同)。 用法:list->ForEach(gcnew Action<datatype>(datatype::ActionDelegate)); Predicate<T>用于List<T>的Exists()Find()FindAll()FindIndex()FindLast()FindLastIndex()TrueForAll() /*从例子list7-9看委托(函数指针)的用法模式: 类库程序员实现了泛型集合类,并用委托为泛型集合类提供了一个操作接口供 用户程序员写操作集合的元素的实现。 类库程序员实现泛型集合类的各种访问元素操作; 用户程序员实现操作元素。即实现了分别开发(通过委托)又重用了代码(通过泛型)*/ //各种各样的方法来实现分别开发和重用代码 LinkedList //不用再自己实现链表了 Queue<T> and Stack<T> Dictionary<K,V>, SortedDictionary<K,V> k需要实现IComparable<K> or System::IComparable,不然要用带IComparer<K>参数的 构造函数。 可以实现自定义的IComparable<K>,按照自己的想法来排序。 KeyCollection和:ValueCollection属性 for each ( KeyValuePair<K,T> pair in dictionary) Collection<T> and ReadOnlyCollection<T>KeyedCollection<K,V> 集合类的基类,用于返回值。 第八章 输入、输出和串行化 File和FileInfo的选择。 DirectoryInfo和FileInfo派生自FileSystemInfo Directory有DirectoryInfo没有::GetCurrentDirectory()SetCurrentDirectory(),GetLogicalDrives 注意:move moveto的目的地不能是directory。 IO操作 MemoryStream的writeto把MemoryStream的内容写到其它stream StreamReaders和StreamWriters 处理字符串更方便。 托管对象的串行化 BinaryReader和BinaryWriter处理小的对象还可以。 [Serializable]特性(attribute) 存储对象的格式:binary,soap(xml,),还可以自定义格式。 Binary: 紧凑快速。 SOAP :xml,可以用在非CLR环境。 using namespace System::Runtime::Serialization::Formatters::Binary; deserialize需要类型转换。   #using <system.runtime.serialization.formatters.soap.dll> using namespace System::Runtime::Serialization::Formatters::Soap; SOAP产生xml格式的文件。  

    最新回复(0)