java到c#入門(.net core)
前言
逛知乎時接觸到了.net core,以前雖然知道有c#這個語言,也了解一些和java之間的關聯性,但還是雲里霧里,聽說java崗和.net之間很容易互轉,那我也來試試。
環境
.net core 3.1
c# 8.0
vs code
使用的是vs code環境,不如vs方便,但是輕量。
安裝好.net core sdk以及一些c#插件。
進入vscode的插件市場,找到c#(安裝最多的那個)。全名是:
C# for Visual Studio Code (powered by OmniSharp).
安裝完插件,會默認加入兩個依賴包,稍等即可。
我在.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>
從java到c#
C#和Java語法基本相似,都和C++有聯系。另外C#也是可以代替JavaScript的,所以和Js的語法也有部分相同。接下來了解一下C#和Java的不同處。
1、模塊管理
Java中對不同文件的管理是通過package,而C#是沿用的C++的命名空間。
2、類型推斷
在進行變量聲明的時候,var關鍵字可以進行類型推斷,這和JS一樣。
3、字符串內插
C#通過$和{}執行模板語法。
var str="World!!!";
Console.WriteLine($"Hello {str}");
//Hello World!!!
4、foreach循環
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);
}
5、結構體
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());
和類不同的是:
結構體是值類型,並且不支持繼承。
但是支持接口。
6、lambda表達式
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表達式比較簡潔。
7、訪問器
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將無法修改。
8、繼承
C#中的繼承使用:表示。如:
public class His:Hi{
}
//此時His類已經繼承Hi類的所有公開部分。
//使用父類接收子類的實例,並且調用父類的方法。
Hi h=new His();
h.sayHi("sally");
C#中還有一些如事件、委托、索引器等概念。
C#開發者和Java開發者在語法上的轉換不吃力。
