本人多年 Java 和 go ,最近在学习 python ,感觉各种不适应。都说 python 语法优雅简洁,但是为什么感觉没有 Java 用起来舒服。 如果仅从语法上来评价,那么哪种语言看起来是最舒服最美的呢?
201
nevermoreluo 48 天前
我不知道最优雅的到底是不是 C#,但是 C#确实在前列。
我不常用 C#, 但是用 C#那一段时间工作明显轻松了,能有闲暇就已经非常非常优雅了。 我是搞了一些其他语言后接触 C#的,它在 VS 上提示就很符合直觉,属于那种完全不看文档,大概看下之前的框架直接能上手的程度。不管是语法糖,泛型,接口,都比较符合直觉。 除了 net 跨平台上有坑之外,其他基本没有什么心智负担,对我来说这已经足够优雅了。 泛型,partial class ,Task, SocketAsync, ThreadLocal 都是工程上用到的时候会足够舒服的东西。 |
202
INCerry 48 天前
C#
|
![]() |
203
yh7gdiaYW 48 天前
首先排除 Go
|
![]() |
204
liuliuliuliu PRO @v2er119 虽然但是,你看的是哪个榜单,TIOBE 常年前 5 名啊,2024 年还被评为年度语言
|
![]() |
205
DyingSwan 48 天前
C#
|
![]() |
206
afirefish 48 天前
C#
|
![]() |
207
shenjinpeng 48 天前
PHP
|
![]() |
208
SakuraYuki 48 天前
机器语言
|
![]() |
209
chf007 48 天前
Elixir
|
210
seakingii 48 天前 ![]() 我投 c#
我喜欢 C#的理由 1 强类型 2 语法优雅 3 系统内置的库非常全,而且比较规范 4 第三方库可能没有 JS,JAVA,PYTHON 那么多,但也一般够用 5 可以跨平台 6 默认性能就不错 7 可以利用语法特性写出非常强性能的代码 8 编译速度不错 9 有反射功能 10 有动态的语法 C# 的语法,在我看来,相当的符合人类的直觉,比如 1 前置类型 int a = 1; string name = "Jack"; string Hello(string name){ return "Hello," + name; } 2 也可以使用类型推断 var a = 1; var name = "Jack"; List<User> userList = new (); var userList = new List<User>(); 3 字符串插值 var first = "Ma"; var last = "Jack"; var name = $"{first} {last}"; 4 字符串可以直接相加.有些语言不是用加号 var name = "Ma" + " " + "Jack"; 5 扩展语法.可以直接扩展已有的类(就算是别人写的,第三方的库),最新的版本扩展更强,不过我还没用上. class MyClass { public string Name {get;set;} public MyClass(string name){ this.Name = name; } } static class MyClassExtensition { public static string GetName(this MyClass myClass){ return this.Name; } } 6 属性 Property.有机会在访问/更改字段的时候做一些操作,比起 setName,getName 调用起来优雅 class MyClass { private string name; public string Name { get { Console.Write(name); return Name; } set{ Console.Write(name); name = value; } } // 自动属性 public int Age { get; set; } = 99; // 只读属性初始化 public ICollection<int> Values { get; } = new List<int>(); public int Age { get; init; } // 只能在初始化时设置 } var m = new MyClass(); m.Name = "Ma Jack"; Console.Write(m.Name); 7 Attribute .可以做一些元编程 [ApiController] [Route("/api/user")] public class UserController { [Route("get_name")] [HttpGet] public string GetName(){ return "Ma Jack"; } } 8 linq, expression ,Lambda var userList = new List<MyClass>(); var filteredList = userList.Where(v=>v.Name.Contains("J")) .OrderBy(v=>v.Name) .Select(v=> "Hello," + v.Name) .Take(10) .ToList(); var results = from p in people where p.Age > 18 orderby p.Name select p.Name; 9 disposable 模式,释放资源比较优雅 class Db : IDioposable { private Connection connection; public Db(){ connection = new Connection(); } public List QueryList(string sql){ //.... } public Task<List> QueryListAsync(string sql){ //.... } public void Dispose(){ connection.Close(); } } //调用 DB 类访问数据并自动关闭数据库连接,即使中间有出现异常 using var db = new Db(); var userList = db.QueryList("select * from sys_user"); //--这里自动调用 db.Dispose(); 10 async/await //调用 DB 类访问数据并自动关闭数据库连接,即使中间有出现异常 using var db = new Db(); var userList = await db.QueryListAsync("select * from sys_user"); //--这里自动调用 db.Dispose(); 11 修饰 public private protected readonly static ... 12 静态类和静态构造 static class Tools { static string NewMd5(){ return ...; } } class class User { static List<User> cachedUserList = new (); //静态构造 static User(){ cachedUserList = GetUserListFromDatabase(); } } // 模块级初始化 [ModuleInitializer] internal static void Initialize() { // 模块加载时自动执行 } 13 模式匹配 (C# 7.0+) // 类型模式 if (obj is string s) { Console.WriteLine(s.Length); } // 常量 if (count is 0) { Console.WriteLine("Empty"); } // Switch 表达式 var result = shape switch { Circle c => $"Circle with radius {c.Radius}", Rectangle r => $"Rectangle {r.Width}x{r.Height}", _ => "Unknown shape" }; //递归 if (person is { Address: { City: "New York" } }) { Console.WriteLine("New Yorker"); } 14 元组和解构 (int x,int y) GetCoordinates(){ return (100,200); } // 元组解构 var (x, y) = GetCoordinates(); var (_, _, area) = GetShapeInfo(); // 忽略前两个返回值 15 字符串定义 var str = "1"; var str = @"1"; var str = $"now : {DateTime.Now}"; var json = """ { "name": "John", "age": 30 } """; 16 空条件运算符 (?. 和 ?[]) Customer? customer = GetCustomer(); var length = customer?.Orders?[0]?.Description?.Length; // 空合并运算符 var name = customer?.Name ?? "Unknown"; // 空合并赋值 (C# 8.0+) list ??= new List<int>(); 17 结构类型.高效 struct Point { public int X {get;set;} public int Y {get;set;} } 18 记录类型 (C# 9.0+) public record Person(string FirstName, string LastName); //clone var newPerson = person with { LastName = "Smith" }; if (person is not null and { Age: >= 18 }) { // ... } // 不可变且自带值语义比较 var person1 = new Person("John", "Doe"); var person2 = person1 with { LastName = "Smith" }; 19 索引与范围 (C# 8.0+) var lastItem = array[^1]; // 最后一个元素 var slice = array[1..4]; // 从索引 1 到 3 的元素 20 命名参数与可选参数 public void Configure(int width, int height = 600, string title = "App") { // ... } // 调用 Configure(width: 800, title: "My Application"); 21 重载 public class MyClass { private string name {get;set;} public MyClass(){ this.name = "---"; } public MyClass(string name){ this.name = name; } public string Hello(){ return "Hello," + name; } public string Hello(string s){ return s + name; } } 22 集合初始化 var numbers = new List<int> { 1, 2, 3, 4, 5 }; var dict = new Dictionary<int, string> { [1] = "One", [2] = "Two" }; 23 操作符可重载 24 局部函数 public int Factorial(int n) { return Compute(n); int Compute(int k) => k <= 1 ? 1 : k * Compute(k - 1); } 25 表达式成员 public override string ToString() => $"{FirstName} {LastName}"; public double Area => Width * Height; 26 nameof 表达式 Console.WriteLine(nameof(Person.Name)); // 输出 "Name" 27 调用方信息特性 void Log([CallerMemberName] string member = "", [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { Console.WriteLine($"{file}:{line} in {member}"); } |
211
seakingii 48 天前
28 分部类.可以将一个类文件,拆分成几个文件,可以达到
1) 将大类按功能拆分成多个文件,更好维护 2) 可以一部分是自动代码生成的,另一个部分是手动修改的,这样即可以利用机器自动产生代码,然后又可以定制这个产生的代码 |
![]() |
212
ouou0701 48 天前
c#好高的赞啊,都用来开发什么
|
213
zsqduke 48 天前
最优雅那当然是 machine code
|
![]() |
214
yafeilee 48 天前
推荐《七周七语言》这本书。
编程语言的本质是连接人类语言和机器语言的中间产物。设计者必然要进行取舍。 二进制 -> 汇编 -> C -> C++/Java -> Ruby/Python -> 人类 Go/Rust/TS 是对弱类型的改良。 好的语言要平衡两者:有自己一致性的哲学,又有对人类友好的一面。 举例: JavaScript 整体的平衡较好,它的基于对象的调用逻辑(哲学性),又像 C 一样易于理解(易用性)。 Lisp 过于哲学,在人类友好方面太多括号被诟病。 推荐: Ruby 是我见过两者平衡最好的语言,一切皆对象的哲学是所有语言中最极致的,语法优雅简洁又带有很强自由度。 后话: 这些都不重要,并不是说平衡最好就发展最好。在适合的历史发展阶段产生合适的语言最重要,就算有些问题只要不是硬伤都可以解决,比如 JavaScript 和 TypeScript 。 |
![]() |
216
idragonet 48 天前
C#程序员路过:应该是 C#吧,看过 JAVA 代码语法真是头大。
|
![]() |
217
alwaysol 48 天前
首先排除 Python 和 go,语法真是反人类
|
![]() |
218
flowerHeart 48 天前
C#
|
219
leeg810312 48 天前
写过 C# Java Javascript Python PHP ,最近几年写得最多是 C#,其次是 Python 和 Java ,以前工作 Javascript 也写不少,PHP 早就不写了。用下来 C#是最符合直觉,写代码体验最好,代码观感很舒服,如果项目结构设计合理,在 VS 里完全看着就是一件优雅的艺术品。Python 简单易用,Javascript 松散随意,Java 无论是代码本身,还是按行业规范和生态生成的项目文件都显得非常啰嗦,这些都跟优雅不沾边。
|
220
BinCats 48 天前
10 年程序员告诉帮你,Kotlin
|
![]() |
221
unco020511 48 天前
kotlin 和 C#
|
![]() |
222
zhouxiaoxiao 48 天前
PHP 是世界上最好的语音
|
223
w568w 48 天前
看到这么多人选 C# 就放心了,证明国内开发还没有烂完
@CodingIran 非常认同(主攻 Dart 开发)。每次看到同行写的 Swift ,都想把 Google 的头按过去叫他们多学学,尤其是 Actor Pattern 不过 if let 和 if case ,Dart 应该已经有了吧。Swift 我不是很喜欢的地方是注解太多,一眼看过去全是 @xxx@yyy@zzz…… |
224
RichardPlus 48 天前
喜欢 c#和喜欢 Kotlin 的人高度重合, 俺也一样嘿嘿嘿
|
![]() |
225
lichendaozhu 48 天前
c#
|
![]() |
226
montaro2017 48 天前
|
![]() |
227
chenxiansheng 48 天前
C#投一票
|
![]() |
228
coldle 48 天前
|
![]() |
229
lululau 48 天前 ![]() 20 年程序员告诉你,第一梯队:Ruby ,第二梯队:Swift / Kotlin ,第三梯队:Java / C#
Python 和 Golang 都是简单取向,不同之处是 Golang 为性能而生,但简单不等于优雅 Rust 是性能和安全取向,对于一个这类取向的语言来说,其类型系统设计得着实🐂🍺,不过优雅嘛,进不了前三梯队 TS 本来能算在第三梯队,但是它那个类型体操,不合我的口味 |
![]() |
230
guanzhangzhang 48 天前
投 golang 一票(相对于 c 对比,关键字和官方自带库,以及简单协程),除了 err ,不过非 web 和比较基础的层面每个 err 都要处理还是很好的,不然像 c 那样用 int 当错误码,结果 0-255 不够用
c#和 kotlin ,给已有加方法,kotlin 的协程要是想 golang 那样易用而不是很多关键字就是降维打击了 |
231
guaike 48 天前
C#
|
232
james122333 48 天前 via Android
@lululau
错误的 让我们查一下谷哥 "elegance dictionary" 给我们以下解释 1. the quality of being graceful and stylish in appearance or manner. 依照下方关键字这应该是指人的外貌姿态为多 2. the quality of being pleasingly ingenious and simple; neatness. 翻译一下就是"令人愉悦的巧妙和简单的品质;整洁。" 语言要兼具简单整洁和妙不可言 通常是动态语言才有后者 golang 是简单整洁和一点点小妙 你第一梯队还好理解 后面怎么回事... 很难说服别人简单巧妙 |
233
james122333 48 天前 via Android
|
235
james122333 48 天前 via Android
|
236
james122333 48 天前 via Android
|
![]() |
237
Bluecoda 47 天前
Ruby
Erlang Lisp C |
![]() |
238
richarddingcn 47 天前
haskell
|
![]() |
239
Al0rid4l 47 天前
虽然都说 C#, 但 C# 坏就坏在它太老了, 历史遗留问题比一些新的多不少, 比如什么 void 不是类型, switch 支持那么多模式匹配却不支持详尽检查等等, 所以肯定还是越新的语言越好(除了 Go
|
![]() |
240
shench 47 天前
说 PHP 可能许多人不服,但是 Laravel 是真的很优雅
|
241
Cbdy 47 天前
人人都爱 JavaScript
|
![]() |
242
glcolof 47 天前
我投 C#一票。
|
![]() |
243
Removable 47 天前
@ns09005264 三元表达式岂不是更优雅?
var key = condition ? <value1> : <value2>; |
244
dyncan 47 天前
PHP
|
![]() |
245
Removable 47 天前
@Al0rid4l 使用 switch 表达式的话倒是可以实现详尽性检查:
```c# var result = value switch { ... } ``` 这样写,如果枚举值没有完全覆盖,编译时会抛出 CS8509 警告,你可以通过配置将该警告改为编译时错误。 |
246
kakki 47 天前
C# 问题结束
|
![]() |
247
Removable 47 天前
|
![]() |
248
Iakihsoug 47 天前
c#
|
250
davehandong 47 天前
啥是优雅
|
![]() |
251
ns09005264 47 天前
@Removable #243
if 表达式里可以写其他逻辑,比如: let key = if condition { 一堆逻辑; value } else { 另一堆逻辑; 一堆操作; default_value }; 三元表达式比较倾向简单的二选一场景,想要在其中处理一些逻辑,得另写一个专门的函数。 |
![]() |
252
kimwang 47 天前 via Android
pascal 是 pascal
|
253
Xunit 47 天前
不带复杂宏和指针的 C
|
254
vrabe 47 天前
没人说 Prolog?
|
255
luodan 47 天前
吾有一言。曰「「春日宴。」」。書之。
有數九九。名之曰「酒數」。 批曰。「「请勾选输出汉字选项。」」 恆為是。若「酒數」等於零者乃止也。 吾有三言。曰「「與君」」。曰「酒數」。 曰「「杯酒。可以窮歡宴。綠酒一杯歌一遍。」」。書之。 減「酒數」以一。昔之「酒數」者。今其是矣云云。 吾有一言。曰「「綠酒千杯腸已爛。」」。書之。 |
![]() |
256
2024 47 天前
|
257
z00z 47 天前
C#
|
258
Alias4ck 47 天前
Haskell 一种特别的美
|
259
puppyxxx 47 天前
javascript 写的优雅,那就是真的优雅,我感觉写代码的这个人都优雅了
|