代(Generation)是CLR垃圾收集器的一种机制,它存在的惟一目的就是提高应用程序性能,支持3代对象。
执行的原理是:第一次初始化后又添加新对象,如果第0代满了就会进行处理回收不用的对象,再把第0代中的对象放入第一代中,新对象放入第0代中。当第0代中的对象满时,把第0代和第一代都进行处理然后扔出第0代中不用的对象,把第0代中剩余的对象放入第一代中,直到三代都装满为止。
文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合。文件操作有:Directory类、DirectoryInfo类、FileInfo类、File类、Path类。
Directory类的几种方法:Delect()有两个参数,若加true则删除指定目录并删除该目录中的任何子目录,不加true则删除指定目录。Move()要移动的文件或目录路径,两个参数第一个是要修改的文件路径和文件名,第二个是要移到的文件路径和文件名。Exists()有一个参数确定给定路径是否出现在磁盘上。GetFiles()返回指定目录的文件名。GetDirectories()返回指定目录的子文件夹名称。例如查找文件夹可以采用递归的方法:void DG (string path)
{ foreach(var str in Directory.GetDirectories(path))
{
 Console.WriteLine(str);
    DG(str);
}
}
I/O流:Stream、FileStream、StreamRead、StreamWrite
流涉及三个基本操作:
1.        可以读取流。读取是从流到数据结构(如字节数组)的数据传输。
2.        可以写入流。写入是从数据结构到流的数据传输。
3.        流可以支持查找。查找是对流内的当前位置进行查询和修改。查找功能取决于流具有的后备存储区类型。
   使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。例如以下代码
static void Main(string[] args)
        {string path1 = @"D:\demo\test1.txt";
            FileStream fs1 = new FileStream(path1, FileMode.Open);//打开文件
            Byte[] By_Arr1=new Byte[fs1.Length];
            fs1.Read(By_Arr1,0,By_Arr1 .Length);
            string path2 = @"D:\demo\test2.txt";
            FileStream fs2 = new FileStream(path2, FileMode.Open);
            Byte[] By_Arr2 = new Byte[fs2.Length];
            fs2.Read(By_Arr2, 0, By_Arr2.Length);
            fs2.SetLength(By_Arr1.Length + By_Arr2.Length);           
            fs2.Write(By_Arr2 ,0,By_Arr2 .Length );
        }
StreamReader 旨在以一种特定的编码输入字符,而 Stream 类用于字节的输入和输出。使用 StreamReader 读取标准文本文件的各行信息。以下代码就可以读取文本信息
StreamReader sr = new StreamReader(@"D:\demo\test1.txt", Encoding.Default);
            string str;
            Console.WriteLine(str = sr.ReadToEnd());
            sr.Close();
StreamWriter 旨在以一种特定的编码输出字符
StreamWriter sw = new StreamWriter(@"D:\demo\test2.txt", true, Encoding.Default);
            sw.Write(str + "在这里增加新的内容");          
            sw.Close();
泛型
泛型简单理解就是把类型当参数例如static void PrintType<T>(T i)
        {
            Console.WriteLine("类型:{0,-20}   值:{1}",i.GetType (),i);
        }
使用泛型时考虑使用 T 作为具有单个字母类型参数的类型的类型参数名。
将“T”作为描述性类型参数名的前缀。泛型有六种约束,使用where关键字。

约束
说明
T:结构
类型参数必须是值类型。可以指定除 以外的任何值类型。
T:类
类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
T:new()
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
T:<基类名>
类型参数必须是指定的基类或派生自指定的基类。
T:<接口名称>
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
T:U
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。
例如static void PrintType<T>(T i) where T: struct
 {
    Console.WriteLine("类型:{0,-20}   值:{1}",i.GetType (),i);
}     PrintType<int>(5); 
Tnew()
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
class Program
    {
        static void Main(string[] args)
        {
             PrintType<Demo>(new Demo());
        }
        static void PrintType<T>(T i) where T: new()
        {
            Console.WriteLine("类型:{0,-20}   值:{1}",i.GetType (),i);
        }    
    }
    class Demo
    {       
    }
                       
反射是编程的读取与类型相关联的元数据的行为,命名空间为System.Reflection。
 Assembly:表示一个程序集,提供了一个LoadFrom方法。用法:
Assembly SampleAssembly=Assembly.LoadFrom("c:\\abc.dll");
还可以使用txt文本,但要把abc.dll文件的信息写入txt文本
例如abc.dll文件的路径,命名空间和类方法等
下面举一个反射的例子
static void Main(string[] args)
        { string[] DllArr = File.ReadAllLines(@"E:\1.txt", Encoding.Default);// 把读出的文件内容放入到数组中
   Assembly Ass = Assembly.LoadFile(DllArr[0]);//加载指定路径上的程序集文件内容
   object myobj = Ass.CreateInstance(DllArr[1]);//搜索指定类型创建实例
 Type mytype = Ass.GetType(DllArr[1]);//获取类型
 MethodInfo mymethod = mytype.GetMethod(DllArr[2]);//获取方法信息
object[] objarr = new object[DllArr.Length - 3];//创建新数组比DllArr数组的长度小三
            for (int i = 0; i < objarr.Length; i++)
            {
                objarr[i] = DllArr[i + 3];
            }
            mymethod.Invoke(myobj, objarr);//使用指定参数调用当前实例的方法或构造函数
 }
 
反射调用构造函数例子,
static void Main(string[] args)
 {    BindingFlags bf = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;//
Type t = typeof(Demo_Class);//获取类的类型
 ConstructorInfo Cons = t.GetConstructor(new Type[0]);   //构造函数无参,所以构造函数无类型参数。如有参数则写 (new Type[]{typeof(int)});
object Obj = Cons.Invoke(null);//传入的构造参数为空,得到对象,如有参数则写new object[] { 456 }
object[] MethodPar = new object[] { “a” }; //方法的参数
 MethodInfo mi = t.GetMethod(“Method”, bf);//得到方法
Console.WriteLine(mi.Invoke(Obj, MethodPar));
        }
Attribute:属性与程序实体关联后,即可在运行时使用名为“反射”的技术查询属性。
属性以两种形式出现:
1.    一种是在公共语言运行库 (CLR) 中定义的属性。
2.    另一种是可以创建的用于向代码中添加附加信息的自定义属性。此信息可在以后以编程方式检索。
属性具有以下特点:
1.    属性可向程序中添加元数据。元数据是嵌入程序中的信息,如编译器指令或数据描述。
2.    程序可以使用反射检查自己的元数据。
3.    通常使用属性与 COM 交互。
特性类实例化时需要放在括号“[ ]”中,语法:[attributeClass(定位参数1,… 命名参数1,…)]指定参数对应着特征类的实例公有域或实例属性,但它在实例化的时候并非必须,可以省略。位置参数和指定参数只可以为如下数据类型 :基本数据类型中的值类型:×××,浮点类型,字符, BoolSystem.object, System.Type,System.string
枚举类型,以上任何类型的一维数组。
有三个特殊的属性AttributeUsage、Conditional、Obsolete
条件方法必须是类或结构声明中的方法,而且必须具有 void 返回类型。
#define TRACE_ON//这行标识代码决定着红色代码的执行与否。若注释它Msg方法不能执行
[Conditional("TRACE_ON")]
public static void Msg(string msg)
{ Console.WriteLine(msg); }
#if TRACE_ON
        public static void Msg(string msg)
        {Console.WriteLine(msg);}
#endif   这是另一种用法
[System.Obsolete(“use class B”)] //类会被在实例化时警告过期
 class A
    {
        public void Method() { }
    }
    class B
    {
        [System.Obsolete("use NewMethod", false )] //方法调用时提示信息
        public void OldMethod() { }
 [System.Obsolete("use NewMethod", true)] //不可编译
        public void NewMethod() { }}
   
多线程
.NET用Thread创建并控制线程,设置做强先级并获取其状态。Start()表示线程运行,Priority()获取或设置一个值表示线程的优先级,Abort中止线程执行,Sleep使线程睡眠一段时间,方法的参数为睡眠的毫秒数
Monitor 类通过向单个线程授予对象锁来控制对对象的访问,Exit()释放锁,Enter()获得数据对象上的锁