c#與java對比


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,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM