C#總結
來源:程序員人生 發布時間:2015-03-27 08:02:36 閱讀次數:3683次
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
- 數組:
-
- 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 類提供許多有用的其他方法/屬性,如用于排序、搜索和復制數組的方法。
- foreach (int i in numbers)
- 屬性:
-
- public class A {}
- A中:public string Name{ get{return xx} set{xx = value}}
- 虛函數:
-
- 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就可以實現記錄日志的功能,這個DLL文件的程序就是1個程序集。
- 自定義1個可以foreach的集合類:https://msdn.microsoft.com/zh-cn/library/aa288462(v=vs.71).aspx
- 結構:
-
- 結構可能看似類,但存在1些重要差異,應引發注意。首先,類為援用類型,而結構為值類型。使用結構,您可以創建行動類似內置類型的對象,同時享有它們的好處。
- 在類上調用“新建”(New) 運算符時,它將在堆上進行分配。但是,當實例化結構時,將在堆棧上創建結構。這樣將產生性能增益。而且,您不會像對待類那樣處理對結構實例的援用。您將直接對結構實例進行操作。鑒于此緣由,向方法傳遞結構時,結構將通過值傳遞,而不是作為援用傳遞。
- 當向方法傳遞結構時,將傳遞該結構的副本,而傳遞類實例時,將傳遞1個援用。
- 結構可以聲明構造函數,但它們必須帶參數。聲明結構的默許(無參數)構造函數是毛病的。結構成員不能有初始值設定項。總是提供默許構造函數以將結構成員初始化為它們的默許值。
- 如果不使用“新建”(new),那末在初始化所有字段之前,字段將保持未賦值狀態,且對象不可用。
- 對結構,不像類那樣存在繼承。1個結構不能從另外一個結構或類繼承,而且不能作為1個類的基。但是,結構從基類對象繼承。結構可實現接口,而且實現方式與類實現接口的方式完全相同。
- 結構控制:[FieldOffset(0)]
-
- 對象可以用[]訪問
- public int this[long index] {get{ ...} set{ ...} }
-
- 可以將轉換聲明為 implicit(需要時自動轉換)或 explicit(需要調用轉換)。所有轉換都必須為 static,并且必須采取在其上定義轉換的類型,或返回該類型。
- 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組特定的參數和返回類型封裝方法。對靜態方法,拜托對象封裝要調用的方法。對實例方法,拜托對象同時封裝1個實例和該實例上的1個方法。
- public delegate void ProcessBookDelegate(Book book);//聲明1個拜托
- BookDB中,有Book列表:public void process(ProcessBookDelegate processBook){ processBook(b) } //調用拜托,可以通過使用
BeginInvoke 和 EndInvoke 方法同步或異步調用拜托。
- Processor中,有1系列的inter方法:void f1(Book b) ...
- 調用:bookDB.process(new ProcessBookDelegate (Processor.f1)) //實例化拜托
- 拜托的+和-: a = new ProcessBookDelegate (Processor.f1)
- b = new ProcessBookDelegate (Processor.f2)
- c = a + b =>調用c(book)時,同時調用f1和f2
- c = a - b
- 事件:利用拜托
-
- 有兩個對象:Listener和Subject
- Subject:持有event,當產生變化時將主動調用event
- Listener:持有Subject的ref,并且負責向Subject中的event對象attach和dettach自己的方法
- --------------------視察者模式Observer----------------------

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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈