C#總結(jié)
來源:程序員人生 發(fā)布時間:2015-03-27 08:02:36 閱讀次數(shù):3687次
ref http://www.w3cschool.cc/csharp/csharp-generic.html
https://msdn.microsoft.com/zh-cn/library/aa288460(v=vs.71).aspx
http://blog.csdn.net/hawksoft/article/details/7534332
- using
- 數(shù)組:
-
- int [] array = new int[10]
- int[,] tbl = new int[1,2]
- int[][] tbl = new int[1][]
- int[,] numbers = { {1, 2}, {3, 4}, {5, 6} }; numbers[1,1]
- int[][] numbers = { new int[] {2,3,4}, new int[] {5,6,7,8,9} }; numbers[0][2]
- System.Array 類提供許多有用的其他方法/屬性,如用于排序、搜索和復(fù)制數(shù)組的方法。
- foreach (int i in numbers)
- 屬性:
-
- public class A {}
- A中:public string Name{ get{return xx} set{xx = value}}
- 虛函數(shù):
-
- A中:public virtual void f()
- A的子類B:public class B : A {}
- B中:public override void f() 重寫
- public new void f() 覆蓋
- A a = new B()
- interal: 只能在程序集中訪問。你寫了1個記錄日志的DLL,任何項目只要援用此DLL就可以實現(xiàn)記錄日志的功能,這個DLL文件的程序就是1個程序集。
- 自定義1個可以foreach的集合類:https://msdn.microsoft.com/zh-cn/library/aa288462(v=vs.71).aspx
- 結(jié)構(gòu):
-
- 結(jié)構(gòu)可能看似類,但存在1些重要差異,應(yīng)引發(fā)注意。首先,類為援用類型,而結(jié)構(gòu)為值類型。使用結(jié)構(gòu),您可以創(chuàng)建行動類似內(nèi)置類型的對象,同時享有它們的好處。
- 在類上調(diào)用“新建”(New) 運算符時,它將在堆上進(jìn)行分配。但是,當(dāng)實例化結(jié)構(gòu)時,將在堆棧上創(chuàng)建結(jié)構(gòu)。這樣將產(chǎn)生性能增益。而且,您不會像對待類那樣處理對結(jié)構(gòu)實例的援用。您將直接對結(jié)構(gòu)實例進(jìn)行操作。鑒于此緣由,向方法傳遞結(jié)構(gòu)時,結(jié)構(gòu)將通過值傳遞,而不是作為援用傳遞。
- 當(dāng)向方法傳遞結(jié)構(gòu)時,將傳遞該結(jié)構(gòu)的副本,而傳遞類實例時,將傳遞1個援用。
- 結(jié)構(gòu)可以聲明構(gòu)造函數(shù),但它們必須帶參數(shù)。聲明結(jié)構(gòu)的默許(無參數(shù))構(gòu)造函數(shù)是毛病的。結(jié)構(gòu)成員不能有初始值設(shè)定項。總是提供默許構(gòu)造函數(shù)以將結(jié)構(gòu)成員初始化為它們的默許值。
- 如果不使用“新建”(new),那末在初始化所有字段之前,字段將保持未賦值狀態(tài),且對象不可用。
- 對結(jié)構(gòu),不像類那樣存在繼承。1個結(jié)構(gòu)不能從另外一個結(jié)構(gòu)或類繼承,而且不能作為1個類的基。但是,結(jié)構(gòu)從基類對象繼承。結(jié)構(gòu)可實現(xiàn)接口,而且實現(xiàn)方式與類實現(xiàn)接口的方式完全相同。
- 結(jié)構(gòu)控制:[FieldOffset(0)]
-
- 對象可以用[]訪問
- public int this[long index] {get{ ...} set{ ...} }
-
- 可以將轉(zhuǎn)換聲明為 implicit(需要時自動轉(zhuǎn)換)或 explicit(需要調(diào)用轉(zhuǎn)換)。所有轉(zhuǎn)換都必須為 static,并且必須采取在其上定義轉(zhuǎn)換的類型,或返回該類型。
- A中:static public implicit operator A(int value)
- static public explicit operator int(A a)
-
- public static Complex operator +(Complex c1, Complex c2)
- public override bool Equals(object o)
- public override int GetHashCode()
- public override string ToString()
-
- 拜托聲明定義1種類型,它用1組特定的參數(shù)和返回類型封裝方法。對靜態(tài)方法,拜托對象封裝要調(diào)用的方法。對實例方法,拜托對象同時封裝1個實例和該實例上的1個方法。
- public delegate void ProcessBookDelegate(Book book);//聲明1個拜托
- BookDB中,有Book列表:public void process(ProcessBookDelegate processBook){ processBook(b) } //調(diào)用拜托,可以通過使用
BeginInvoke 和 EndInvoke 方法同步或異步調(diào)用拜托。
- Processor中,有1系列的inter方法:void f1(Book b) ...
- 調(diào)用:bookDB.process(new ProcessBookDelegate (Processor.f1)) //實例化拜托
- 拜托的+和-: a = new ProcessBookDelegate (Processor.f1)
- b = new ProcessBookDelegate (Processor.f2)
- c = a + b =>調(diào)用c(book)時,同時調(diào)用f1和f2
- c = a - b
- 事件:利用拜托
-
- 有兩個對象:Listener和Subject
- Subject:持有event,當(dāng)產(chǎn)生變化時將主動調(diào)用event
- Listener:持有Subject的ref,并且負(fù)責(zé)向Subject中的event對象attach和dettach自己的方法
- --------------------視察者模式Observer----------------------

- Subject接口中有3類主要方法,分別注冊視察者(attatch)、刪除視察者(detach)和通知視察者(notify),
- ConcreteSubjects實現(xiàn)類存儲具體的狀態(tài)并持有多個ConceteObserver對象(可以組織成ArrayList),當(dāng)狀態(tài)改變時就調(diào)用notify方法,notify方法中遍歷所有的ConcreteObserver,調(diào)用其updata方法。
-
- Subject聲明事件:public delegate void EventHandler(object sender, EventArgs e); // 聲明該事件的拜托類型,拜托類型定義傳遞給處理該事件的方法的1組參數(shù)
- public event EventHandler Changed; //聲明事件本身,聲明事件的方法與聲明拜托類型的字段類似,只是關(guān)鍵字 event 在事件聲明前面,在修飾符后面。事件通常被聲明為公共事件,但允許任意可訪問修飾符
- Subject 調(diào)用事件: 類聲明了事件以后,可以就像處理所唆使的拜托類型的字段那樣處理該事件。如果沒有任何客戶將拜托與該事件掛鉤,該字段將為空;否則該字段援用應(yīng)在調(diào)用該事件時調(diào)用的拜托。因此,調(diào)用事件時通常先檢查是不是為空,然后再調(diào)用事件。
- if (Changed != null) Changed(this,
e); //調(diào)用方法,1般名為onChanged
- Listener與事件掛鉤:在該字段上撰寫新的拜托、從字段(多是復(fù)合字段)移除拜托。
- Subject.Changed += new EventHandler(Listener.f1)
- Subject.Changed -= new EventHandler(Lintener.f1)
- 總的來講,和拜托很像。只是添加了1個event Changed,可以集中管理所有EventHandler
- event可看作1個拜托的實例,當(dāng)沒有函數(shù)時,為null,否則就是綁定的函數(shù)
- 事件和繼承:由于事件只能從聲明它們的類中調(diào)用,因此派生類不能直接調(diào)用在基類內(nèi)聲明的事件。雖然這有時符合需要,但通常使派生類能夠自由調(diào)用事件更適合。這通常通過為事件創(chuàng)建受保護(hù)的調(diào)用方法來實現(xiàn)。通過調(diào)用該調(diào)用方法,派生類即可以調(diào)用此事件。為取得更大的靈活性,調(diào)用方法通常聲明為虛擬的,這允許派生類重寫調(diào)用方法。這使得派生類可以截獲基類正在調(diào)用的事件,有可能對這些事件履行它自己的處理。
- 接口中的事件:事件和字段之間的另外一個差異是,事件可放在接口中,而字段不能。當(dāng)實現(xiàn)接口時,實現(xiàn)類必須在實現(xiàn)接口的類中提供相應(yīng)的事件。
- 特性Attribute:
-
- 用于在運行時傳遞程序中各種元素(比如類、方法、結(jié)構(gòu)、枚舉、組件等)的行動信息的聲明性標(biāo)簽。您可以通過使用特性向程序添加聲明性信息。1個聲明性標(biāo)簽是通過放置在它所利用的元素前面的方括號([ ])來描寫的。
- 預(yù)定義特性:
- AttributeUsage:描寫了如何使用1個自定義特性類
- Conditional:這個預(yù)定義特性標(biāo)記了1個條件方法,其履行依賴于它頂?shù)念A(yù)處理標(biāo)識符。它會引發(fā)方法調(diào)用的條件編譯,取決于指定的值,比如 Debug 或 Trace。例如,當(dāng)調(diào)試代碼時顯示變量的值。
-
- Obsolete: 這個預(yù)定義特性標(biāo)記了不應(yīng)被使用的程序?qū)嶓w。
- 自定義特性:.Net
框架允許創(chuàng)建自定義特性,用于存儲聲明性的信息,且可在運行時被檢索。
- 創(chuàng)建并使用自定義特性包括4個步驟:
- 聲明自定義特性:1個新的自定義特性應(yīng)派生自 System.Attribute 類
-
-
- // 1個自定義特性 BugFix 被賦給類及其成員
- [AttributeUsage(AttributeTargets.Class |
- AttributeTargets.Constructor |
- AttributeTargets.Field |
- AttributeTargets.Method |
- AttributeTargets.Property,
- AllowMultiple = true)]
- public class DeBugInfo : System.Attribute
-
- 構(gòu)建自定義特性:和構(gòu)建類1樣,必須有構(gòu)造函數(shù),傳入必須(positional)的參數(shù)
- 在目標(biāo)程序元素上利用自定義特性:
-
-
- [DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]
-
-
-
- System.Reflection.MemberInfo info = typeof(MyClass);
- info.GetCustomAttributes
-
- 它允許在運行時查看屬性(attribute)信息。
- 它允許審查集合中的各種類型,和實例化這些類型。
- 它允許延遲綁定的方法和屬性(property)。
- 它允許在運行時創(chuàng)建新類型,然后使用這些類型履行1些任務(wù)。
-
- Type type = Type.GetType("System.Int32", false, true);
- object o = System.Activator.CreateInstance(type);
- Debug.Assert(o.GetType() == typeof(int));
-
- delegate void MyDelegate(int n);
- MyDelegate nc = delegate(int x) {...}
- 調(diào)用:nc(10)
- lambda表達(dá)式:Lambda 表達(dá)式的作用是為了使用更簡單的方式來編寫匿名方法,完全簡化拜托的使用方式。
-
- MyDelegate nc =(int x)=> {...}
- 當(dāng)中 “ => ” 是 Lambda 表達(dá)式的操作符,在左側(cè)用作定義1個參數(shù)列表,右側(cè)可以操作這些參數(shù)。
- 動態(tài)對象:利用DynamicObject
-
- 定義1個拜托,參數(shù)個數(shù)可變,參數(shù)都是object類型:這里的拜托有個dynamic參數(shù),代表調(diào)用這個拜托的動態(tài)對象本身.
-
-
- public delegate object MyDelegate(dynamic Sender, params object[] PMs);
-
- 定義1個拜托對象,以綁定匿名方法。由于dynamic對象不能直接用匿名方法,這里用對象去承載
-
-
- public class DelegateObj
- {
- private MyDelegate _delegate;
- public MyDelegate CallMethod//調(diào)用方法
- {
- get { return _delegate; }
- }
- private DelegateObj(MyDelegate d)//構(gòu)造函數(shù)
- {
- _delegate = d;
- }
- public static DelegateObj Function(MyDelegate D)// 構(gòu)造拜托對象
- {
- return new DelegateObj(D);
- }
- }
-
- public class DynObj : DynamicObject
- {
- private Dictionary<string, object> _values; //保存對象動態(tài)定義的屬性值
- public DynObj()
- {
- _values = new Dictionary<string, object>();
- }
- public object GetPropertyValue(string propertyName) //獲得屬性值
- {
- if (_values.ContainsKey(propertyName) == true)
- {
- return _values[propertyName];
- }
- return null;
- }
- public void SetPropertyValue(string propertyName,object value) // 設(shè)置屬性值
- {
- if (_values.ContainsKey(propertyName) == true)
- {
- _values[propertyName] = value;
- }
- else
- {
- _values.Add(propertyName, value);
- }
- }
- public override bool TryGetMember(GetMemberBinder binder, out object result)// 實現(xiàn)動態(tài)對象屬性成員訪問的方法,得到返回指定屬性的值
- {
- result = GetPropertyValue(binder.Name);
- return result == null ? false : true;
- }
- public override bool TrySetMember(SetMemberBinder binder, object value)// 實現(xiàn)動態(tài)對象屬性值設(shè)置的方法。
- {
- SetPropertyValue(binder.Name, value);
- return true;
- }
- public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)// 動態(tài)對象動態(tài)方法調(diào)用時履行的實際代碼
- {
- var theDelegateObj = GetPropertyValue(binder.Name) as DelegateObj;
- if (theDelegateObj == null || theDelegateObj.CallMethod == null)
- {
- result = null;
- return false;
- }
- result = theDelegateObj.CallMethod(this,args);
- return true;
- }
- public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
- {
- return base.TryInvoke(binder, args, out result);
- }
- }
-
- dynamic theObj = new DynObj();
- theObj.aaa = "this is a test";//動態(tài)屬性
- theObj.show = DelegateObj.Function((s, pms) =>
- { // 動態(tài)方法 }
- );//這里使用lambda表達(dá)式,實際上也能夠是由delegate定義的1個匿名函數(shù)
- theObj.show("hello");
- Linq
-
- 使用類似sql語句的方式查詢xml和集合中的數(shù)據(jù)
- IEnumerable<int> scoreQuery =
- from score in scores
- where score > 80
- select score;
-
- System.Collections.Generic.Dictionary<>; //鍵/值對集合
- System.Collections.Generic.KeyValuePair<>; //鍵/值對結(jié)構(gòu), 作為 Dictionary<> 的1個元素存在
- System.Collections.Generic.SortedDictionary<>; //相當(dāng)于 Key 能自動排序 Dictionary<>
- System.Collections.Generic.SortedList<>; //和 SortedDictionary<> 功能相似, 但內(nèi)部算法不同, 其 Keys、Values 可通過索引訪問
- System.Collections.Generic.HashSet<>; //無序、無重復(fù)的元素集合
- System.Collections.Generic.SortedSet<>; //相當(dāng)于能自動排序的 HashSet<>
- System.Collections.Generic.List<>; //相當(dāng)于泛型的 ArrayList, 元素可重復(fù)、可排序、可插入、可索引訪問
- System.Collections.Generic.Queue<>; //隊列, 先進(jìn)先出
- System.Collections.Generic.Stack<>; //堆棧, 落后先出
- System.Collections.Generic.LinkedList<>; //雙向鏈表
- System.Collections.Generic.LinkedListNode<>; //LinkedList<> 的節(jié)點
- System.Collections.Generic.SynchronizedCollection<>; //線程安全的集合
- System.Collections.Generic.SynchronizedReadOnlyCollection<>; //線程安全的只讀集合
- System.Collections.Generic.SynchronizedKeyedCollection<>; // 線程安全的鍵/ 值集合
- 字符串方法:http://www.w3cschool.cc/csharp/csharp-string.html

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈