Java和C#语法对⽐引⾔
⼯作上需要⽤到Java和C#,两者语法⼤同⼩异,这⾥做⼀下简单对⽐。
语法对⽐
Java C#
访问修饰符public
修饰类、接⼝、变量、⽅法。
对所有类可见。修饰类、接⼝、变量、⽅法。对所有类可见。
internal⽆。修饰类、接⼝、变量、⽅法。类,接⼝的缺省访问修饰符。同⼀个程序集的对象可见。
protected⼦类可见。⼦类可见。
private类内部可见。
变量,⽅法的缺省访问修饰符
类内部可见。
default
类、接⼝、变量、⽅法的缺省修饰符。
同⼀包内可见。
⽆。
基本类型
基本类型,⽆⽅法可调⽤。
作为局部变量时,储存与栈。作为字段
时,跟随于实例。
值类型,继承object,具有ToString()等⽅法。
作为局部变量时,储存与栈。作为字段时,跟随
于实例。
布尔值 boolean bool
整形 short,int,long short,int,long
浮点数 float,double float,double
可空基本类型
例如:Integer是引⽤类型,Integer是int的
包装类。
例如: int?其实是Nullable<int>的语法糖,⽽
Nullable<int>依然是值类型。
布尔值 Boolean bool?
整形Short,Integer,Long short?,int?,long?
浮点数 Float,Double float?,double?
⾼精度
数值类型
BigDecimal decimal?
源⽂件组织导⼊使⽤包的概念,关键字import导⼊使⽤命名空间的概念,关键字using导⼊
类⽂件源⽂件名要和Public类名保持⼀致,
最多存在⼀个Public修饰的类,
⽂件名后缀是.java
没有java中的限制,
抽象类的使用
⽂件名后缀是.cs
枚举枚举关键字enum,
引⽤类型,
和class差不多,可以有字段和⽅法,
可以添加私有构造函数
关键字enum,
值类型,
默认继承int,可以继承其他值类型
关键字const修饰变量,字段,定义时赋值
常量常量关键字final修饰变量,字段,定义时赋值
关键字const修饰变量,字段,定义时赋值
关键字readonly修饰,可以在构造函数中赋值
密封密封关键字final修饰⽅法,类,表⽰不可继
承,不可重写
关键字sealed修饰⽅法,类,表⽰不可继承,
不可重写
属性属性只有字段概念,
⼀般情况下是要定义字段XX,⽅法getXX()
和setXX()
C#引⼊属性概念,简化了操作,
只需要定义XX{get;set;}
判断类型判断类
Instanceof              is
锁锁 Synchronized    Lock
接⼝接⼝关键字 implements,
使⽤注解@Override
和继承类⼀样,使⽤符号:
实现类中的⽅法,不需要使⽤override关键字,
⼀般命名需要⽤⼤写字母I开头
抽象类
abstract
使⽤注解@Override abstract,
重写⽅法需要使⽤override关键字
分部类⽆partial
可以将分布在不同⽂件,⽽在相同命名空间下,相同名称并⽤partial标识的类合并,多⽤于wpf,winform框架上。
匿名类如Runnable hello = new Runnable() {
public void run() {
System.out.println("hello"); } };
简化了定义⼦类的步骤。
⽆。类似的场景基本都是⽤委托的
内部类在new的使⽤上,内部类要和外部类关联起
在new的使⽤上,内部类和外部类⽤法⽆区别
匿名⽅法⽆。使⽤delegate声明匿名⽅法,
delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
};
虚拟⽅法默认都是虚拟⽅法virtual标识虚拟⽅法,⼦类⽤override重写
静态类使⽤关键字static 使⽤关键字static,
可以有静态构造函数,
引⽤传递⽆在⽅法参数加上ref,out,使参数按引⽤传递
即⽅法内改变参数的值,也会影响到⽅法外的值
不定长参
如如params int[]
流程控制循环关键字for有两种⽤法
for(初始化; 布尔表达式; 更新)
{
//代码语句
分别为for和foreach
for(初始化; 布尔表达式; 更新)
{
//代码语句
流程控制循环
}
for(声明语句 : 表达式) { //代码句⼦
}}
foreach (声明语句  in 表达式) {
//代码句⼦
}
字符字符String,引⽤类型,
需要使⽤⽅法equals⽐较是否相等
string,引⽤类型,
但⽤法和值类型类似,可以直接⽤==⽐较是否
相等,
实现原理就是微软重载了string的==运算符
委托委托⽆。使⽤关键字Delegate声明,是存有对某个⽅法的引⽤的⼀种引⽤类型。
使⽤+使⽤委托的多播。
泛型泛型 <T>声明泛型,
T只能是引⽤类型,
可以⽤extends和super限制T的类型,
<?> 表⽰通配,
实际上是假泛型。
<T>声明泛型,
T可以是引⽤类型也可以是值类型
使⽤:表⽰泛型约束,如T:new()表⽰T必须要有
⽆参构造函数,
真正的泛型。
注解与特性
注解与
特性
使⽤@声明注解,如
@Service
public class AgreementFacadeClientImpl
implements AgreementFacadeClient {
....
}
C#引⼊attribute作为特性,如
[Export(typeof(IPayModule))]
[Export(typeof(IModule))]
public class PayModule : IModule, IPayModule
{
......
}
索引器⽆。定义了索引器,就可以使⽤[]取值。
运算符重
⽆。
可以对+,-,==等内置的运⾏符重载,string的==⽐
较符就是运算符重载的结果。
集合列表 List是接⼝,ArrayList才是实现类 IList是接⼝,List是实现类字典 Map Dictionary
集合处理流式api,
对象.stream().filter(x-
&Count()>0).List())
Linq
对象.Where(x=>x.Count>0).ToList()
使⽤上⽅便很多
lambda ()->{},
⼊参类型为函数式接⼝,
实质上lambda表达式会在编译阶段被转换
为匿名内部类
()=>{},
⼊参类型为委托delegate
⽅法引⽤类::实例⽅法
类::静态⽅法
对象::实例⽅法
类.⽅法
扩展⽅法⽆。要实现类似功能,要编写Util类。扩展⽅法是定义在静态类的静态⽅法,⼊参中的this代表使⽤的对象,是单继承的⼀种补充。
命名规范接⼝命名和类命名⼀样,如Module。
私有字段⼩写字母开头,如test。
⽅法命名是⼩写字母开头,如
getSomeThing()
接⼝命名开头要加⼤写字母I,如IModule。
私有字段开头要加_,如_test。
⽅法命名都是单词⾸字母⼤写,如
GetSomeThing()
getSomeThing()GetSomeThing()
⼩结
基本把语法层⾯上的常见差异都列出来了,总的来说C#语法上还是先进⼀些,撸代码变得更加优雅。另外个⼈能⼒有限,有些遗漏和错误的,欢迎⼤家补充和指出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。