1.c#一個類只能繼承一個類,繼承語法:
class Dog : Anilmal{
}
2.c#中的sealed關鍵字相當於java中的final關鍵字,定義的類不能被繼承,如:string類不能被繼承
3.c#中protected表示繼承類可以訪問,外部無法訪問
4.c#中的base關鍵字相當於java中的super關鍵字
5.c#中的構造函數
class A{ public A(){} public A(string a):this(){}//表示調用上面的無參構造,this就表示調用本類的方法 public A(int a):this("123"){} //表示調用上面的string參數類型的構造 }
6.c#中對象的多態性,如果父類Animal中有一個方法public void shout(){...},子類Dog中也有一個方法,這時候你想使用Animal animal=new Dog(),采用animal調用Dog類中的shout方法,就需要改代碼了,改成以下形式(各加一個關鍵字)
Animal類中的shout方法改成以下代碼: public virtual void shout(){...} Dog類中的shout方法改成以下代碼: public override void shout(){...}//即覆寫掉父類的屬性或方法
//如果Dog還有子類,想繼續覆寫就不用再在Dog類中的方法加virtual關鍵字了,直接使用override就行了
如:Dog類中還有一個子類Dog1,覆寫Dog中的shout方法
直接在Dog1中加下一代嗎即可:
public override void shout(){...}
7.c#中的抽象類:和java一樣使用abstract關鍵字,如:
public abstract class Animal{ public abstract void shout();//抽象方法也要使用abstract關鍵字,抽象類不能直接實例化,需要子類繼承並且子類必須覆寫抽象類的抽象方法(即在方法返回值前面加上override關鍵字,此時就不需要在抽象方法前面加上virtual關鍵字了) }
注意:抽象類中也可以寫普通方法
8.c#中set,get方法的寫法
public 返回值類型 屬性名稱{get;set;} 如下代碼: public string name{get;set;}
9.c#中的接口采用interface關鍵字
如下代碼: interface IFly{ public void Fly();//這里的public可以省略,因為接口中的方法或屬性只能是public權限 }
如果A類繼承B類,並且實現C接口,則代碼如下:
class A:B,C{ }
10.c#類是單繼承,接口可以多繼承一個類可以繼承多個接口,抽象類可以繼承接口,接口不能繼承抽象類。
11.struct值類型,用來定義結構體,如下代碼:
class Program{ struct Location//結構體 { public int X; public int Y; public Location(int x,int y){this.X=x;this.Y=y}//此處不允許定義無參構造 } static void Test(Location loc){ loc.X=1; loc.Y=1; } static void main(string[] args){ Location loc=new Location(0,0); Test(loc); } }
12.try{...} catch(Exception e){...}finally{...}快捷鍵,先打出來try再連續按兩次Tab建即可,如果異常此處處理不了也可以拋出來catch{throw;}
13.c#的泛型:
//1
static T Sum<T>(List<T> nums) where T:struct//這里的where是對泛型的約束,struct表示數值型 { T sum =default(T);//表示給sum賦初值(即數值型默認的值) return sum; }
//2
class Test{
public void X();
}
static void TestFunc<T>() where T:Test,new(){//如果這里不加new(),下面不能使用new T();如果這里
不加Test約束,下面不能調用Test類
T t=new T();
t.X();
}
14.c#中重載操作符(賦值符號不能重載):如下代碼重載
public static bool operator ==(Location lhs,Locations rhs){
return false;
}
15.VS
• VS結構:一個解決方案底下可以添加多個項目,可以認為一個項目對應一個命名空間
• VS中創建類庫,將鼠標光標放在"解決方案"上右鍵選擇"新建",然后選擇"類庫",類庫編譯之后生成的就是dll文件。
• VS中引用類庫,兩種引用方法:
• 引入整個dll文件
在需要引用的項目的目錄中有一個引用,將光標放在"引用"上面右鍵,選擇添加引用,選擇你要選擇的即可(如果選擇自定義的,就要選擇"解決方案"下的"項目"再進行查找)
• [DllImport(...)],僅用於方法
16.IDisposable接口結合using的使用
//1.IDisposable是一個自動釋放資源的接口,里面有一個Dispose方法 //在讀寫流或者需要使用close()關閉的地方使用using()結合此接口使用 static void Main(string args[]){ using(StreamWriter sq=new StreamWriter(new FileStream("777.txt",FileMode.Create,FileAccess.Write))){ sq.WriteLine("123"); } }//此時在執行using的時候,在using語句執行完畢之前會自動執行IDisposable接口的Dispose方法從而自動釋放資源
17.委托(引入委托也叫作匿名方法)
class Program { //1.聲明委托類型 delegate bool Function(int num); static Function BigThan10=delegate(int n){//此處的n與上面的num一一對應
return n>=10;
}; //2.修改形參列表 static List<int> Traverse(List<int> nums,Function function){ var list=new List<int>(); foreach(var num int nums){ if(function(num)){ list.Add(num); } } return list; } //3.傳入委托 static void Main(string[] args){ Traverse(new List<int>(){1,2,3,4,5},BigThan10);//傳入委托 Console.WriteLine(); Console.ReadLine(); } }
18.委托寫法的化簡——Lambda表達式
1.語句Lambda
//語法:(type var,...)=>{...}//加類型 (var,...)=>{...}//不加類型 var=>{...}//一個參數的時候 ()=>{...}//沒有參數的時候
//17中的第三部傳入委托也可以也成
Traverse(new List<int>(){1,2,3,4,5},delegate(int n){return n>=10;});//顯然這樣寫有點啰嗦,
使用Lambda表達式可以簡化成:
(1) Traverse(new List<int>(){1,2,3,4,5},(int n)=>{return n>=10;});
(2) Traverse(new List<int>(){1,2,3,4,5},(n)=>{return n>=10;});
(3)如果只有一個參數括號也不用寫了:Traverse(new List<int>(){1,2,3,4,5},n=>{return n>=10;});
2.表達式Lambda:沒有{},但是只能有一條語句
Traverse(new List<int>(){1,2,3,4,5},n=> n>=10);//將return也去掉
19.系統自帶的泛型委托
(1)Action<> 例:List<T>.ForEach() (2)Func<> 例List<T>.Sum() (3)Predicate<> 例 List<T>.FindAll() 例 List<T>.Find()
(1)的代碼:
var list=new List<int>(){1,2,3,4,5,6}; list.Foreach(i=>{Console.WriteLine(i)});//這里的i表示list集合中的一個個值
(2)的代碼:
class Program
{
//1.聲明委托類型
static Func<int, bool> BigThan10 = delegate(int n)
{
return n>=4;
};
//2.修改形參列表
static List<int> Traverse(List<int> nums, Func<int, bool> function){
var list=new List<int>();
foreach(var num in nums){
if(function(num)){
list.Add(num);
}
}
return list;
}
//3.傳入委托
static void Main(string[] args)
{
var list=new List<int>(){1,2,3,4,5,6};
var n=Traverse(list, BigThan10);
n.ForEach(i=>Console.WriteLine(i));
Console.ReadLine();
}
}
(3)的代碼
20.c#中的foreach是只讀的,不能給其賦值。
21.c#中的Dictionary相當於java中的map,實例化直接使用Dictionary,