多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > C#總結

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實現
    • delegate void MyDelegate(int n);
    • MyDelegate nc = delegate(int x) {...}
    • 調用:nc(10)
  • lambda表達式:Lambda 表達式的作用是為了使用更簡單的方式來編寫匿名方法,完全簡化拜托的使用方式。
    • MyDelegate nc =(int x)=> {...} 
    • 當中 “ => ” 是 Lambda 表達式的操作符,在左側用作定義1個參數列表,右側可以操作這些參數。
  • 動態對象:利用DynamicObject
    • 定義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);
      •         }
      • }
    • 定義1個動態對象:
    • 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.Generic
    • 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
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚欧中文字幕 | 欧美一级毛片免费看 | 亚洲 国产 日韩 欧美 | 福利区在线观看 | 久久毛片视频 | 国产精品揄拍100视频最近 | 真人性做爰aa毛片免费视频观看 | 理论片免费观看 | 精品国产欧美另类一区 | 欧美综合自拍亚洲综合 | 男女上下爽无遮挡午夜免费视频 | 亚洲国产二区三区久久 | 中文字幕最新 | 免费视频不卡一区二区三区 | 欧美成人一区二区三区不卡视频 | 一本大道卡一卡二卡三视频 | 亚洲天堂2016| 国产中文字幕在线免费观看 | 日韩欧美精品综合久久 | 国产成人鲁鲁免费视频a | 国产精品精品国产一区二区 | 日本护士xxxx视频免费 | 欧美午夜毛片a级在线 | 欧美一二区 | 国产69精品久久久久99不卡 | 午夜美女影院 | 亚洲综合一区二区三区四区 | 男人边吃奶边玩下面舒服 | 久久久久国产一级毛片高清版 | 美国一级毛片在线观看 | 爱爱亚洲 | 亚洲aⅴ天堂 | 欧美精品久久久久久久小说 | 国精品日韩欧美一区二区三区 | www.久久久| 中文字幕亚洲综合精品一区 | 另类一区二区三区 | 最新国产在线视频 | 亚洲综合黄色 | 免费视频h | 亚洲第一福利视频 |