.Net Framework 總結

 

代(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()獲得數據對象上的鎖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章