c#学习,主要和java对比
c#学习
1,namespace,using不如package,import。命名空间别名,::,global::,alias,这些干啥呢,为了一点点的灵活性一个补丁接着一个。 java的ide让文件路径和package名称对应,简化了程序员的工作,不用选择了,package不能用相对路径访问子package单元。c#的这种灵活性我觉得没必要。
2,string,String2种写法,我有选择焦虑症
3,partial是好东西,为生成代码而生。对静态语言来说生成代码简直是标配。这个感觉非常好,因为基本上目的明确,你明确声明这个为partial。不怕这种灵活性。
但感觉扩展函数有点过了,估计主要是c#3为引入linq准备的机制,用来实现写dsl很酷,但易被滥用。
java8也加入default methods,来方便引入类似linq的stream。但java8是不允许放到不同文件里的啊
c#的扩展函数可以放到任意文件里,这个灵活性有点吓人。
4,访问级别默认private比java的默认package好。
5,static class不错,scala用object。java中没有对应的。但内嵌class不包含外部对象引用会不会不方便?
6,yield return搞迭代器不错,跟python迭代器一样了,很酷
7,值对象,又一个选择焦虑,这个对象不大,但用struct还是class呢?struct提供的那一点locality性能优势和复制劣势如何取舍?
struct A
{
private int a;
public A(int i) : this()
{
a = i;
}
}
可以直接A a;struct默认会有个无参构造函数,也就是说没有immutable的struct。初见也有点出人意料。真的有必要要struct吗?
8,property,不用生成getter,setter。简洁不少,最常用的估计是{get; private set;},就是set时占用了个value关键词。
9,delegate,本来要2个名字现在只要一个。java中的interface Runnable { void run() },变成了Action。本质上都是在模仿函数式编程中的函数,通过只有一个方法的接口来模拟高阶函数。
delegate少了个名字但引入了个新的概念和关键词。感觉亏了。不如java。
后来也都引入了lambda表达式。结合type inference。综合了lisp,schema这些函数语言的能力和静态类型的编译时检查。
10,event,a调用b,a依赖于b,能b依赖于a吗?依赖倒置对模块化设计来说很关键,订阅发布模式。event提供了语言级支持。结合lambda和method reference(java这么叫的),用这个写ui程序很爽。我觉得这个值得引入这个概念和占用一个关键词。
11,对象和集合的初始化,在需要常量集合,builder模式时挺有用的,并且还可以嵌套初始化,最后的数据格式挺漂亮,类似带类型信息的json。c# object notation。跟匿名类型格式有一样。
12,Nullable<T>,可空的值类型。引用类型永远可空。这不对称啊。应该是引用类型不可空。Nullable<T>这里的T可是值类型也可是引用类型。Tony-Hoare在微软啊,怎么允许c#的引用可为null?
13,Linq语法。这个为什么??我实在不懂,为了跟sql类似搞个这种东西出来,那种流式(链式)api不是挺爽吗?
14,可选参数,命名实参。java选择了不予支持,支持可选参数能省掉几个构造函数,但可能会引诱人写出比需求更多的构造接口。命名实参让形参的名字也关键起来了,java用builder模式部分解决这个问题,但有还是要好的。
15,enum只能数值,这个太狭隘了吧。不如java的enum。java enum就是instance数量限定的类。singlton模式用enum实现
1,namespace,using不如package,import。命名空间别名,::,global::,alias,这些干啥呢,为了一点点的灵活性一个补丁接着一个。 java的ide让文件路径和package名称对应,简化了程序员的工作,不用选择了,package不能用相对路径访问子package单元。c#的这种灵活性我觉得没必要。
2,string,String2种写法,我有选择焦虑症
3,partial是好东西,为生成代码而生。对静态语言来说生成代码简直是标配。这个感觉非常好,因为基本上目的明确,你明确声明这个为partial。不怕这种灵活性。
但感觉扩展函数有点过了,估计主要是c#3为引入linq准备的机制,用来实现写dsl很酷,但易被滥用。
java8也加入default methods,来方便引入类似linq的stream。但java8是不允许放到不同文件里的啊
c#的扩展函数可以放到任意文件里,这个灵活性有点吓人。
4,访问级别默认private比java的默认package好。
5,static class不错,scala用object。java中没有对应的。但内嵌class不包含外部对象引用会不会不方便?
6,yield return搞迭代器不错,跟python迭代器一样了,很酷
7,值对象,又一个选择焦虑,这个对象不大,但用struct还是class呢?struct提供的那一点locality性能优势和复制劣势如何取舍?
struct A
{
private int a;
public A(int i) : this()
{
a = i;
}
}
可以直接A a;struct默认会有个无参构造函数,也就是说没有immutable的struct。初见也有点出人意料。真的有必要要struct吗?
8,property,不用生成getter,setter。简洁不少,最常用的估计是{get; private set;},就是set时占用了个value关键词。
9,delegate,本来要2个名字现在只要一个。java中的interface Runnable { void run() },变成了Action。本质上都是在模仿函数式编程中的函数,通过只有一个方法的接口来模拟高阶函数。
delegate少了个名字但引入了个新的概念和关键词。感觉亏了。不如java。
后来也都引入了lambda表达式。结合type inference。综合了lisp,schema这些函数语言的能力和静态类型的编译时检查。
10,event,a调用b,a依赖于b,能b依赖于a吗?依赖倒置对模块化设计来说很关键,订阅发布模式。event提供了语言级支持。结合lambda和method reference(java这么叫的),用这个写ui程序很爽。我觉得这个值得引入这个概念和占用一个关键词。
11,对象和集合的初始化,在需要常量集合,builder模式时挺有用的,并且还可以嵌套初始化,最后的数据格式挺漂亮,类似带类型信息的json。c# object notation。跟匿名类型格式有一样。
12,Nullable<T>,可空的值类型。引用类型永远可空。这不对称啊。应该是引用类型不可空。Nullable<T>这里的T可是值类型也可是引用类型。Tony-Hoare在微软啊,怎么允许c#的引用可为null?
13,Linq语法。这个为什么??我实在不懂,为了跟sql类似搞个这种东西出来,那种流式(链式)api不是挺爽吗?
14,可选参数,命名实参。java选择了不予支持,支持可选参数能省掉几个构造函数,但可能会引诱人写出比需求更多的构造接口。命名实参让形参的名字也关键起来了,java用builder模式部分解决这个问题,但有还是要好的。
15,enum只能数值,这个太狭隘了吧。不如java的enum。java enum就是instance数量限定的类。singlton模式用enum实现
有关键情节透露