java到c#入门(.net core)
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++一样。
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"));
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开发者在语法上的转换不吃力。