1. 程式人生 > >c#學習2

c#學習2

##類中的this和base
1.this可以用來檢視類裡面的方法和欄位
2.base可以用來檢視父類中的方法和欄位
##虛擬函式、抽象類、介面
當把類中的函式定義為虛擬函式(virtual)的時候,可以在子類中對虛擬函式進行重寫,如果子類進行了重寫(override)則派生類例項化呼叫的是子類的函式方法,如果沒有進行重寫呼叫的則是父類的方法,重寫後父類的方法沒有了。
抽象類的函式方法為抽象方法(abstract),當派生類對父類中的方法一定會重寫的時候,就沒有必要將父類方法定義為虛擬函式,而直接定義為抽象類。
介面(interface),介面中的方法不能進行定義,介面中不能包含欄位,當一個類繼承介面的時候需要對介面中的所有方法進行實現,介面可以繼承,當A介面繼承B介面後,繼承A介面的類要同時對A和B介面中的方法進行實現。
###stringBuilder和string的區別
string內容不可改變,stringBuilder可以頻繁的進行改變
###Action和Func
Action和Func是兩個委託,Action表示引數為int,無返回值得方法型別,如:

static void set(int){}
Action<int> a = set;

Func表示有返回值和引數的委託,當有返回值時,最後一個引數表示返回值型別,剩餘引數表示引數型別,必須有返回值型別如:

static string set(int,int){}
Func<int,int,string> b = set

###使用委託解決氣泡排序中的型別適用問題
假設有氣泡排序sort(int array[]){},示例如下:

//比較的型別employee
class employee{
      private string name{get;private set;}
      private int age{get;private set;}
      static bool Compare(employee a,employee b){
                  return a.age<b.age}
}
//適用於比較employee的氣泡排序
static void commonsort<T>(T[]sortArray,Func<T,T,bool> method){}
//使用時
commonsort(Employee[],employee.Compare){}

###多播委託
一個委託指向多個方法,假設委託的方法有返回值,多播委託只能呼叫最後新增的方法的返回值的結果,一般將多播委託設為無返回值;
如果多播委託中一個方法丟擲異常,停止

//方法1
static void method1(){}
//方法2
static void method2(){}

Action a=method1;
a+=method2;

Delegate[] delegate = a.GetInvocationList() //呼叫該方法能得到所有方法的列表

###匿名方法
當某一個方法並不需要在其他地方呼叫的時候,直接將方法的定義賦給一個委託,需要使用delegate關鍵字

Action<int,string> a=**delegate**(int a,string b){}

###lambda表示式
lambda表示式:

Func<int,int> a = (arg1,arg2)=>
{
return arg1+arg2
}
//當引數只有一個的時候不需要加括號
Func<int,int> test = a=>a+1

###事件
事件event的宣告只能放在類裡面,在類裡面宣告一個委託型別的變數。
事件是類或物件向其他類或物件通知發生的事情的一種特殊簽名的委託

//貓抓老鼠的例子
class cat{
private string name;
private string color;
public cat(string name,string color){
this.name = name;
this.color = color;
}
public void catcoming(){
Console.Writeline(color+"顏色的貓"+name+"來了")
if(catcome)
  catcome()//呼叫事件,該事件裡註冊了很多訂閱者的方法
}
**public event Action catcome**;//定義了一個委託型別的事件,如果不適用event修飾,則可以在類的外部通過物件呼叫訪問,這樣是不可以的,定義這樣一個事件的目的是為了產生一個訂閱/釋出的機制,這樣在訂閱者那裡可以通過註冊該事件,達到訂閱的目的。
}

//老鼠,訂閱者
class mouse{
private string name;
private string color;

public void mouse(string name,string color, cat cats){
this.name = name;
this.color = color;
cats.catcome+=this.runAway;//註冊
}

public void runAway(string name,string color){
Console.Writeline(..........);
}


}

###LINQ聯合查詢
假設有materlist和kongfulist兩個list表,需要對其中的資料進行查詢,方法:

//method 1
var res=from m in materlist
            from k in kongfulist
            where m.kongfu==k.name && m.power>90
    select m //返回m
    select new{master = m, kongfu = k}//先建兩個物件master和kongfu,生成聯合物件res

//method 2 擴充套件方法
var res = masterlist.SelectMany(m =>kongfulist,(m,k)=>new {master = m, kong =k}).Where(condition) //m=>kongfulist 將兩個list聯合,第二個引數(m,k)=>new {master = m, kong =k}表示返回兩個物件

//join on 連線
var res = from m in masterlist
              join k in kongfulist on m.kungfu equals k.name
              where k.power > 90
              select new{master = m,kongfo= k}
//group 分組查詢
 var res = from m in masterlist
              join k in kongfulist on m.kungfu equals k.name
              into groups
              orderby groups.Count()
              select new{kongfu = k,count = groups.Count()}
 //group
 var res = from m in masterlist
     group m by m.kongfu into g
     select new{count= g.Count(),Key = g.key} //g.Key()表示按照哪個屬性分的組

##特性
###Obsolete用來提示舊方法

[Obsolete(“舊方法已經棄用,請使用新方法newMethod”)]
void oldMethod(){}
void newMethod(){}
[Obsolete(“舊方法已經棄用,請使用新方法newMethod”),true] //將舊方法表示為錯誤

###Conditional將某個方法設定為不呼叫

[Conditional("isTest")]  //表示必須定義“isTest”,才能正確呼叫test1函式。否則不呼叫,定義方法為巨集定義: #define isTest
void test1(){}
void test2(){}
void test3(){}

###呼叫者資訊特性
呼叫者資訊特性可以訪問檔案路徑,程式碼行數,呼叫成員的名稱等原始碼資訊
[CallerFilePath]:輸出檔案路徑
[CallerLineNumber]:輸出行數
[CallerMemberName]:輸出成員名

void printOut(string str,[CallerFilePath] string fileName="",...)

###DebuggerStepThrough特性,該特性修飾的函式在debug除錯下,中斷會跳過該函式

相關推薦

C++學習2-命名空間

問題 頭文件 bool 函數庫 中間 應該 col 一起 沖突 C++語言引入命名空間(Namespace)這一概念主要是為了避免命名沖突,其關鍵字為 namespace。科技發展到如今,一個系統通常都不會僅由一個人來開發完成,不同的人開發同一個系統,不可避免地會出現變量或

c#學習2

##類中的this和base 1.this可以用來檢視類裡面的方法和欄位 2.base可以用來檢視父類中的方法和欄位 ##虛擬函式、抽象類、介面 當把類中的函式定義為虛擬函式(virtual)的時候,可以在子類中對虛擬函式進行重寫,如果子類進行了重寫(overr

[C#學習筆記之異步編程模式2]BeginInvoke和EndInvoke方法 (轉載)

cti otf 函數返回 編程模式 catch 數值 gin 單線程 blog 為什麽要進行異步回調?眾所周知,普通方法運行,是單線程的,如果中途有大型操作(如:讀取大文件,大批量操作數據庫,網絡傳輸等),都會導致方法阻塞,表現在界面上就是,程序卡或者死掉,界面元素不動了,

C++學習筆記----2.4 C++對象的內存模型

影響 sni 創建 clas esp cheng lac -c 如果 轉載自:http://c.biancheng.NET/cpp/biancheng/view/2995.html點擊打開鏈接 當對象被創建時,編譯器會為每個對象分配內存空間,包括成員變量和成員函數。直觀的認

C++學習筆記----2.4 C++引用在本質上是什麽,它和指針到底有什麽區別

times 數據 添加 eof 相關 參數 副本 span 符號 從概念上講。指針從本質上講就是存放變量地址的一個變量,在邏輯上是獨立的,它可以被改變,包括其所指向的地址的改變和其指向的地址中所存放的數據的改變。 而引用是一個別名,它在邏輯上不是獨立的,它的存在具有依附性,

9.8 C++學習總結2

方法 系統 返回 關於 當前位置 調用函數 bsp 參數 重復 經過幾天的學習 開始逐漸接觸到C++相對重要的部分。 1、內聯函數和函數重載 內聯函數:在函數前 +inline 在用到此函數的時候,直接將代碼嵌到當前位置,主要是避免函數在調用函數的過程中占用過多時間。 因

c++學習筆記---03---從一個小程序說起2

name 操作系統 簡單 sin clu sed close tchar 重載 從一個小程序說起2 要求:編寫一個程序,要求用戶輸入一串整數和任意數目的空格,這些整數必須位於同一行中,但允許出現在該行中的任何位置。當用戶按下鍵盤上的“Enter”鍵時,數據輸入結束。程序自

36、我的C#學習筆記2

c#類是一種數據結構,它可以封裝數據成員、函數成員和其它的類。類是創建對象的模板。C#中所有語句都必須位於類內。因此,類是C#語言的核心和基本構成模塊。C#支持自定義類,使用C#編程就是編寫自己的類來描述實際需要解決的問題。類就好比是醫院的各個部門,如:內科、骨科、泌尿科、眼科等,在各科室中都有自己的工作方法

C#學習筆記2

comm 保留 默認值 system AI sys In 命名空間 num C#數組 當創建一個數組時,C# 編譯器會根據數組類型隱式初始化每個數組元素為一個默認值。例如,int 數組的所有元素都會被初始化為 0。 Array類在 System 命名空間中定義,是所有數組的

C語言學習(2)

class inf bsp pri 分享圖片 http include ret start //求s=10!,即求10的階乘 start #include <stdio.h> int main(){ int s=1; for(int i=1;i<=1

C/C++學習筆記)2.C++中vector的使用

alt double space ons 說明 info 部分 所有 con 說明:vector是C++中一個非常方便的容器類,它用於存放類型相同的元素,利用成員函數及相關函數可以方便的對元素進行增加或刪除,排序或逆序等等,下面將對這些功能一一敘述。 一.vector的第一

c++學習之路:2.預設引數&函式過載&堆記憶體分配

預設引數 規則:程式從右向左延伸讀取 例子:如下sortarr函式,在創造函式的時候可以直接賦值,這樣執行的時候就執行預設值。 又如debug函式,不傳參就會列印------------------; 函式過載 理解:幾個同名函式,所設有的引數不一樣,就代表為不同函式。 所以傳參的時候

C++陣列(C++學習筆記 2

陣列(array) 陣列是相同型別元素的集合。例如,整型陣列,字串陣列等。 陣列是一種順序容器,它包含單一型別的元素。 C++資料型別 c++中資料型別分為兩種:預定義型別和自定義資料型別。 預定義型別:即預先定義的基本內建資料型別。 自定義資料型別:允許使用者進行資料型別的

C#學習2:過載和重寫 虛方法和抽象方法

本篇問轉載文章,僅供學習使用。。。 過載(overload): 在同一個作用域(一般指一個類)的兩個或多個方法函式名相同,引數列表不同的方法叫做過載,它們有三個特點(俗稱兩必須一可以): 方法名必須相同 引數列表必須不相同 返回值型別可以不相同 例如: publ

JAVA學習筆記(併發程式設計 - 柒)- J.U.C元件2

J.U.C-FutureTask 在Java中一般通過繼承Thread類或者實現Runnable介面這兩種方式來建立執行緒,但是這兩種方式都有個缺陷,就是不能在執行完成後獲取執行的結果,因此Java 1.5之後提供了Callable和Future介面,通過它們就可以在任務執行完畢之後得到

c#基礎學習2

繼承      實現繼承:表示一個型別派生於一個基型別,它擁有該基型別的所有的成員欄位和函式。在實現繼承中,派生型別採用基型別的每個函式的實現程式碼,除非在派生型別的定義中重新指定重寫某個函式的實現程式碼。在需要給現有的型別新增功能或許多相關的型別共享一組重要的公共功

C語言到C++ 物件和類的進一步學習2

1.淺拷貝 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Name { public: Name(const char *myp) { len = strle

在vs2015 中c++學習筆記(孫鑫視訊2

//#include<cstdlib> #include<iostream> using namespace std; //父類 class Animal { public://訪問方式三種:public、private、protected Animal(i

C++學習記錄2CC++的升級

C++繼承了所有的C特性; C++在C的基礎上提供了更多的語法和特性; C++的設計目標是執行效率和開發效率(比C語言還高)的統一。 (C++中++的體現)C++是C語言的進化和升級。最重要的是兩個方面,其一是型別的加強(型別檢查更嚴格),其二是天生面向物件的支援(內建天生支援面向物件軟

Object C學習筆記2-NSLog 格式化輸出資料

1 . 幾種常用型別變數宣告     int i =10;       BOOL isShow=YES;      BOOL isShow=1;       float f = 3.14159