介紹:泛型介紹,索引,Foreach遍歷的解釋,yield方法,path文件操作,Directory類基本操作<目錄>
一:泛型
百度資料:泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個新功能。泛型將類型參數的概念引入 .NET Framework,類型參數使得設計如下類和方法成為可能:這些類和方法將一個或多個類型的指定推遲到客戶端代碼聲明并實例化該類或方法的時候。例如,通過使用泛型類型參數 T,您可以編寫其他客戶端代碼能夠使用的單個類,而不致引入運行時強制轉換或裝箱操作的成本或風險,
使用泛型類型可以最大限度地重用代碼、保護類型的安全以及提高性能。泛型最常見的用途是創建集合類。.NET Framework 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。應盡可能地使用這些類來代替普通的類,如 System.Collections 命名空間中的 ArrayList。您可以創建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托。可以對泛型類進行約束以訪問特定數據類型的方法。關于泛型數據類型中使用的類型的信息可在運行時通過反射獲取。
* 泛型的好處:代碼的重用。通過使用<T>來進行重用。可以往里面傳遞不同的參數類型,我們也可以將其定義為泛型方法,泛型類,泛型接口。
* 自定義泛型
里面有泛型類,泛型方法,泛型接口。
eg 1:
/// 自定義泛型類 public class MyClass1<T> { public void SayHi(T teg) { Console.WriteLine(teg); } } //泛型方法 public class Myclass2 { public void Say<T>(T er) { Console.WriteLine(er); } } //泛型接口 public interface IMyClass3<T> { T Sayhi(); //返回值類型 void SayHello(T msg); //參數類型 } //實現泛型接口的兩種情況 //1:普通類實現泛型接口 public class Class2 : IMyClass3<String> { public void SayHello(string msg) { Console.WriteLine(msg); } public string Sayhi() { throw new NotImplementedException(); } } //2:泛型類實現泛型接口 //這里的IMyClass3<U>的U是根據類接口中的U來決定的。 public class Class3<U> : IMyClass3<U> { public void SayHello(U msg) { Console.WriteLine(msg); } public U Sayhi() { throw new NotImplementedException(); } }
二:創建一個索引
public class MyClass { PRivate string[] _data = new string[5]; /// <summary> /// 定義一個索引 /// </summary> public string this[int index] { get { return _data[index]; } set { _data[index] = value; } } }
創建泛型索引
public class MyClass<T> { private T[] _data = new T[5]; /// <summary> /// 定義一個索引 /// </summary> /// public T this[int index] { get { return _data[index]; } set { _data[index] = value; } } }
三:泛型約束
就是在泛型的后面加上where T:struct/class等。說明泛型以后會在定義的這個約束中來進行T的更換。
四:foreach(*) 是只讀方法
使用條件:凡是具有GetEnumerator()方法的類型都可以進行遍歷。
定義:調用枚舉器來實現的。
通過上面的解釋,我們應該知道只要實現了具有GetEnumerator()方法就可以實現froeach的遍歷。
實例
1:先在類中實現IEnumerable接口,擁有GetEnumerator()方法,接著在寫個Enumerator(枚舉器)類且此類實現IEnumerator(枚舉器接口)接口,這樣我們這個類中就有了枚舉器的所有的功能。
//不使用foreach來實現遍歷。 foreach主要是調用了枚舉器這個方法,我們只需要自己重新寫個方法就行。實現IEnumerable接口就可以實現GetEnumerator
Main()中的寫法
var p = new Person(); var etor = p.GetEnumerator(); while(etor.MoveNext()) { Console.WriteLine(etor.Current.ToString()); } Console.WriteLine("OK"); Console.ReadKey();
具體類的實現
public class Person:IEnumerable { private string [] friends=new string[]{"11","22","33"}; public string Name { get; set; } public int Age { get; set; } public IEnumerator GetEnumerator() { return new PersonEnumerator(this.friends); //這里返回的是Object類型 } } public class PersonEnumerator:IEnumerator { private string[] _friends; public PersonEnumerator(string[] fs) { _friends = fs; } private int index = -1; //下標 指代0號前面位 //獲取數據 public object Current { get { if(index>=0&&index<_friends.Length) { return _friends[index]; //通過下標來返回值。 } else { throw new Exception(); } } } //移動下標 public bool MoveNext() { if(index+1<_friends.Length) { index++; return true; } return false; } //將下標還原,初始化 public void Reset() { index = -1; } }
五:yield方法
yield 關鍵字向編譯器指示它所在的方法是迭代器塊。編譯器生成一個類來實現迭代器塊中表示的行為。在迭代器塊中,yield 關鍵字與 return 關鍵字結合使用,向枚舉器對象提供值。這是一個返回值,例如,在 foreach 語句的每一次循環中返回的值。yield 關鍵字也可與 break 結合使用,表示迭代結束。
六:文件操作
*:File:操作文件,靜態類,對文件整體操作。(拷貝,賦值,剪切等)
*:Directory:操作目錄的類,目錄夾
*:DirectoryInfo:文件夾的一個類,用來描述文件夾對象,(獲取指定目錄下所有目錄時返回一個DirectoryInfo數組)
*:FileInfo:文件夾,用來描述一個文件對象。獲取指定目錄下的所有文件時,返回一個FileInfo數組。
*:Path:對文件”目錄和路徑”進行操作,<字符串>。
*:Stream :文件流,抽象類。
1:FileStream 文件流 MemoryStream內存流 NetworkStream網絡流
2:StreamReader:快速讀取文本文件
3:StreamWriter:快速寫入文本文件
* Path文件操作
我們通過使用Path類來獲取我們文件名,路徑,修改文件名等。
string path = @"F:/VS2008/Projects/ShipinJiChu__HeiMa/文件操作/bin/Debug/文件操作.exe.config"; //獲取文件名 Console.WriteLine(Path.GetFileName(path)); //獲取文件的后綴 Console.WriteLine(Path.GetExtension(path)); //獲取不帶后綴的文件名 Console.WriteLine(Path.GetFileNameWithoutExtension(path)); //獲取該路徑的目錄部分 Console.WriteLine(Path.GetDirectoryName(path)); //更改文件后綴名 Console.WriteLine(Path.ChangeExtension(path, "dll")); //合并兩個路徑 string path1 = @"F:/VS2008/Projects/"; string path2 = "xiaohui.exe"; Console.WriteLine(Path.Combine(path1 + path2)); //返回當前用戶的臨時文件夾的路徑。 Console.WriteLine(Path.GetTempPath()); //創建磁盤上唯一命名的零字節的臨時文件并返回該文件的完整路徑。 Console.WriteLine(Path.GetTempFileName()); Console.ReadKey();
* Directory類基本操作<目錄>
//創建目錄 for (int i = 0; i < 10; i++) { Directory.CreateDirectory(@"C:/" + i); } Console.WriteLine("OK"); Console.ReadKey(); //刪除目錄 for (int i = 0; i < 10; i++) { //Directory.Delete(@"C:/" + i); //只能刪除空目錄 Directory.Delete(@"C:/" + i, true); } Console.WriteLine("OK"); Console.ReadKey(); //剪切 Directory.Move(@"C:/11", @"C:/222/11"); //重命名 <利用剪切來實現> Directory.Move(@"C:/222", @"C:/333"); Console.WriteLine("OK"); Console.ReadKey(); //獲取文件下面的所有的子目錄 string path = @"C:/333/11"; var file= Directory.GetFiles(path); foreach (var item in file) { Console.WriteLine(item); } //刪除目錄 Directory.Delete(@"C:/333",true); Console.WriteLine("OK"); Console.ReadKey();
新聞熱點
疑難解答