逛知乎時接觸到了.net core,之前雖然知道有c#這個語言,也瞭解一些和java之間的關聯性,但仍是雲裏霧裏,據說java崗和.net之間很容易互轉,那我也來試試。java
.net core 3.1web
c# 8.0shell
vs codec#
使用的是vs code環境,不如vs方便,可是輕量。數組
安裝好.net core sdk以及一些c#插件。數據結構
進入vscode的插件市場,找到c#(安裝最多的那個)。全名是:app
C# for Visual Studio Code (powered by OmniSharp).框架
安裝完插件,會默認加入兩個依賴包,稍等便可。webapp
我在.net core sdk中沒有找到單獨的c#編譯器,不過.net中含有c#編譯器,須要運行單文件的能夠獨立下載c#的編譯器函數
安裝完.net core sdk後,在命令行窗口下使用dotnet
命令,出現如下提示即安裝成功。
PS D:\> dotnet Usage: dotnet [options] Usage: dotnet [path-to-application] Options: -h|--help Display help. --info Display .NET Core information. --list-sdks Display the installed SDKs. --list-runtimes Display the installed runtimes.
使用dotnet new xxx可建立相關應用。
dotnet new console -output project_name //console應用 dotnet new webapp -o projrct_name //webapp ....
如控制檯應用,名爲helloworld;
dotnet new console --output helloworld
在目錄下會生成一個文件夾helloworld.有如下文件:
helloworld\helloworld.csproj//配置文件 helloworld\Program.cs//項目入口文件
項目入口文件以下:
using System;//使用系統命名空間 namespace helloworld//命名空間 { class Program//類名 { static void Main(string[] args)//主方法 { Console.WriteLine("Hello World!");//輸出 } } }
此時在控制檯運行dotnet run便可運行項目。
>dotnet run Hello world!
配置文件以下:
<Project Sdk="Microsoft.NET.Sdk">//sdk類型 <PropertyGroup> <OutputType>Exe</OutputType>//輸出類型爲exe <TargetFramework>netcoreapp3.1</TargetFramework>//目標框架 </PropertyGroup> </Project>
C#和Java語法基本類似,都和C++有聯繫。另外C#也是能夠代替JavaScript的,因此和Js的語法也有部分相同。接下來了解一下C#和Java的不一樣處。
Java中對不一樣文件的管理是經過package,而C#是沿用的C++的命名空間。
在進行變量聲明的時候,var
關鍵字能夠進行類型推斷,這和JS同樣。
C#經過$和{}執行模板語法。
var str="World!!!"; Console.WriteLine($"Hello {str}"); //Hello World!!!
C#和Java都爲for循壞提供了加強,用於支持數據結構類型(數組、集合等)。
C#中的foreach循環:
var s=new int[]{0,1,2,3}; foreach(var i in s){ Console.WriteLine(i); }
Java經過item:items的形式:
int[] s=new int[]{0,1,2,3}; for(int i:s){ System.out.println(i); }
C#中支持結構體,這和C++同樣。
以下所示;使用struct關鍵字聲明,擁有構造方法以及普通方法。
public struct Name { public string fName; public string lName; public Name(string fName,string lName){ this.lName=lName; this.fName=fName; } public string getname(){ return this.fName+" "+this.lName; } }
使用方法和類同樣。
var n=new Name("Tom","Blue"); Console.WriteLine(n.getname());
和類不一樣的是:
結構體是值類型,而且不支持繼承。
可是支持接口。
Java和C#都提供了Lambda表達式,Java從jdk1.7開始支持。
Java使用前須要有函數式接口,使用格式爲**->**
//使用前須要先定義一個函數式接口 @FunctionalInterface interface FuncIn{ void hello(String s); } //以後使用lambdab表達式實現這個接口,才能調用。 FuncIn f=s->{ System.out.println("hello "+s); }; f.hello("jim");
C#的Lambda表達式使用委託類型Action和Func來實現,無返回值使用Action類型,有返回值使用Func類型,須要泛型支持。
使用格式爲委託類型<...T> 函數名=(...T) =>{}
//無返回值使用Action類型 Action f=()=>Console.WriteLine("a func ...."); f(); Action<int> f1=x=>{ Console.WriteLine(x) }; f1(10); //有返回值使用Func類型 Func<int,int> f2=x=>x*x; Console.WriteLine(f2(2)); Func<string,string,string> f3=(a,b)=>a+"---"+b; Console.WriteLine(f3("hello","world"));
java中也有不少內置的函數式接口供選擇,不過仍是沒有C#使用委託機制的Lambda表達式比較簡潔。
Java中私有屬性經常使用的get\set方法,C#中稱爲訪問器,結構體和類都支持,格式以下:
public string FName{ get=>this.fName;//使用了lambda表達式 set=>this.fName=value; //get{return this.fName;}//實際格式 //set{this.fName=value;} //get; set;自動實現對訪問器的支持 } //外界能夠經過x.FName進行訪問,缺失get將沒法訪問,缺失set將沒法修改。
C#中的繼承使用:表示。如:
public class His:Hi{ } //此時His類已經繼承Hi類的全部公開部分。 //使用父類接收子類的實例,而且調用父類的方法。 Hi h=new His(); h.sayHi("sally");
C#中還有一些如事件、委託、索引器等概念。
C#開發者和Java開發者在語法上的轉換不吃力。