C# 从语法角度比 Java 优秀在哪里?
54 个回答
已有的回答都比较旧了,这里来说几个比较新的特性 C# 8~9,以及即将实装的特性(部分在今年年底的 C# 10 会到来,另一部分会在明年年底的 C# 11 到来)。
数组切片(C# 8)
取数组第 2 个元素到倒数第 2 个元素的切片(C# 的切片是借助
Span<T>
的零成本抽象),对于字符串或者其他集合也能用
array[1..^1];
返回引用(C# 8)
ref int GetElement(int[] array, int index) => ref array[index];
var array = new [] { 1, 2, 3, 4, 5 };
ref var v = ref GetElement(array, 2);
v = 0;
// 1 2 0 4 5
支持递归语义的模式匹配(C# 8 + C# 9)
如何化简双重否定
not not a
这个表达式?
Expression SimplifyDoubleNot(Expression expression)
=> expression is UnaryExpression
NodeType: ExpressionType.Not,
Operand: UnaryExpression
NodeType: ExpressionType.Not,
Operand: var innerExpression
} ? innerExpression : expression;
接口虚/抽象静态方法(C# 10)
如何表达支持
+
运算符的接口?
interface IAddable<T> where T : IAddable<T>
static abstract T operator +(T left, T right);
使用:
T Foo<T>(T left, T right) where T : IAddable<T> => left + right;
Type Classes(C# 11)
如何让已有但我不拥有的类型
MyFoo
支持
IAddable<T>
?
extension MyBar : MyFoo, IAddable<MyFoo>
public static MyFoo operator +(MyFoo left, MyFoo right) => ...;
使用:
MyFoo x = new(), y = new();
var result = x + y;
Records + Discriminated Unions(C# 8 + C# 11)
如何定义四则代数运算表达式?
enum class Operator { Add, Sub, Mul, Div }
enum class Expr<T> where T : IAddable<T>, ISubable<T>, IMulable<T>, IDivable<T>
ConstExpr(T val),
BinaryExpr(Expr<T> left, Expr<T> right, Operator op)
配合模式识别对表达式进行计算:
T Eval(Expr<T> expr) => expr switch
ConstExpr(var val) => val,
BinaryExpr(var left, var right, var op) => op switch
Add => Eval(left) + Eval(right),
Sub => Eval(left) - Eval(right),
Mul => Eval(left) * Eval(right),
Div => Eval(left) / Eval(right)