目录
我(梦在旅途,http://zuowj.cnblogs.com; http://www.zuowenjun.cn)最近发表的一篇文章《.NET CORE与Spring Boot编写控制台程序应有的优雅姿势》看到都上48小时阅读排行榜(当然之前发表的文章也有哦!),说明关注.NET CORE及Spring Boot的人很多,也是目前的主流方向,于是我便决定系统性的总结一下C# 与JAVA 、ASP.NET CORE 与 Spring Boot MVC,让更多的人了解它们,消除之前可能存在的对.NET或JAVA的误解。
本文目的是通过全面简述C# 与JAVA 在基础语法以及ASP.NET CORE 与 Spring Boot MVC的在框架规范、部署、运行的异曲同工的实现方式,让大家更多的了解C#与JAVA,本文不会刻意说哪门语言好,我认为这是没有意义的,更多的是了解每种语言的特点、优点以及不同语言的共性,掌握编程内功(如:面向对象、DI、AOP、设计模式、算法),这样才能让自己更能适应社会及未来的变化。
本文主要以示例代码为主,辅以简单文字说明,不会细讲每个语法点,只会体现不同的实现方式而矣,全文无废话,全是干货,慢慢欣赏吧。
(注:本文内容是使用Markdown编辑器进行编辑完成!)
C# VS JAVA 基础语法类比篇:
一、匿名类
C#(直接new{},在{}中直接定义只读公开属性或委托方法,无需预先定义任何接口或类)
#region 1.匿名类
var helloWord = new
{
CodeBy = "C#匿名类",
Output = new Action<string, string>((name, codeBy) =>
{
System.Console.WriteLine($"Welcome:{name},Hello Word! by {codeBy}");
})
};
helloWord.Output("梦在旅途", helloWord.CodeBy);
#endregion
JAVA(需要先定义接口或类,然后 new 接口或类的构造函数{},{}内实现接口方法或重写父类接口)
//1.匿名类
IHelloWord helloWord=new IHelloWord() {
@Override
public void output(String name) {
System.out.printf("Welcome:%s,Hello Word! by %s\n",name,getCodeBy());
}
@Override
public String getCodeBy() {
return "JAVA匿名类";
}
};
helloWord.output("梦在旅途");
public interface IHelloWord {
void output(String name);
String getCodeBy();
}
二、类型初始化
C#(IList类型(Dictionary、List)直接在new 类型{},在{}内直接使用{key,value}或{value}方式添加集合元素,其实是隐式调用了add方法)
#region 2.类型初始化
Dictionary<string, string> map = new Dictionary<string, string>
{
{ "key1","value1" },//(隐式自动调用add方法)
{ "key2", "value2" },
{ "key3", "value3" }
};
foreach (var item in map)
{
System.Console.WriteLine($"key:{item.Key},value:{item.Value}");
}
List<string> list = new List<string>
{
"list-item1",//(隐式自动调用add方法)
"list-item2",
"list-item3"
};
foreach (string item in list)
{
System.Console.WriteLine(item);
}
String[] strArr = { "arr1", "arr2", "arr3" };
foreach (string item in strArr)
{
System.Console.WriteLine(item);
}
Person person = new Person
{
Name = "梦在旅途",
Age = 23,
Sex = "男"
};
string json = JsonConvert.SerializeObject(person);
System.Console.WriteLine("Person json:" + json);
#endregion
JAVA(new集合类型{},并在{}内再次使用{},即{ {赋值 }},在双大括号内进行赋值操作,省略类名,这个特点有点类似VB及VB.NET的with语句,大家有兴趣可以了解一下,数组的初始化与C#相同,都可以直接在定义数组的时候在{}中给定元素)
//2.类型初始化
Map<String,String> map=new HashMap(){
{
put("key1","value1");
put("key2","value2");
put("key3","value3");
}
};
for (Map.Entry<String, String> item:map.entrySet()) {
System.out.printf("key:%1$s,value:%2$s\n",item.getKey(),item.getValue());
}
List<String> list=new ArrayList(){
{
add("list-item1");
add("list-item2");
add("list-item3");
}
};
for (String item :list) {
System.out.printf("%s\n",item);
}
String[] strArr={"arr1","arr2","arr3"};
for (String item :strArr) {
System.out.printf("%s\n",item);
}
Person person=new Person(){
{
setName("zwj");
setAge(32);
setSex("男");
}
};
ObjectMapper jsonMapper=new ObjectMapper();
String json= jsonMapper.writeValueAsString(person);
System.out.println("Person json:" + json);
三、委托(方法引用)
C#(委托定义使用delegate关键字,后面就跟方法答名定义【不含方法体】,可委托普通方法,静态方法,有很多的现成的预定义委托类型,如:Action<T0...T16>,Func<T0...T16,TOut>各有16个重载)
#region 3.委托
delegate void HelloDelegate(string name);//定义委托类型(重点是方法签名)
//常规普通自定义委托类型及委托相应的方法
HelloWord helloWordObj = new HelloWord();
HelloDelegate helloDelegate = helloWordObj.Output; //委托实例方法
helloDelegate.Invoke("梦在旅途");// OR helloDelegate("梦在旅途");
HelloDelegate helloDelegate2 = HelloWord.OutputForStatic; //委托类的静态方法
helloDelegate2.Invoke("zuowenjun"); // OR helloDelegate2("zuowenjun");
//使用通用的已封装好的委托类型(如:Func、Action)并实例化
Func<int, int, int> multiplyFunc = new Func<int, int, int>(delegate (int a, int b)
{
return a * b;
});
int x = 12, y = 25;
int multiplyResult = multiplyFunc.Invoke(x, y); //OR multiplyFunc(x,y);
System.Console.WriteLine($"{x}乘以{y}等于:{multiplyResult}");
Action<string> helloAction = new Action<string>(delegate (string name)
{
System.Console.WriteLine($"hello,{name},how are you!");
System.Console.WriteLine("learning keep moving!");
});
helloAction.Invoke("www.zuowenjun.cn");
#endregion
JAVA(定义委托需要先定义委托类型【即:函数式接口,规则:接口+@FunctionalInterface+一个方法定义】,然后就可以普通方法,静态方法,有很多的现成的预定义委托类型【即:函数式接口】,如:BiFunction,Consumer等)
//3.委托
HelloWord helloWordObj = new HelloWord();
HelloWordDelegate helloWordDelegate = helloWordObj::output;
helloWordDelegate.invoke("梦在旅途");
HelloWordDelegate helloWordDelegate2 = HelloWord::outputForStatic;
helloWordDelegate2.invoke("zuowenjun");
//使用已封装好的委托方法(JAVA这边称:函