第二部分 在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格式的文件。