V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
gufeng311
V2EX  ›  程序员

语法最优雅的编程语言是什么?

  •  
  •   gufeng311 · 49 天前 · 18778 次点击
    这是一个创建于 49 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人多年 Java 和 go ,最近在学习 python ,感觉各种不适应。都说 python 语法优雅简洁,但是为什么感觉没有 Java 用起来舒服。 如果仅从语法上来评价,那么哪种语言看起来是最舒服最美的呢?

    262 条回复    2025-08-30 13:45:12 +08:00
    1  2  3  
    nevermoreluo
        201
    nevermoreluo  
       48 天前
    我不知道最优雅的到底是不是 C#,但是 C#确实在前列。
    我不常用 C#, 但是用 C#那一段时间工作明显轻松了,能有闲暇就已经非常非常优雅了。

    我是搞了一些其他语言后接触 C#的,它在 VS 上提示就很符合直觉,属于那种完全不看文档,大概看下之前的框架直接能上手的程度。不管是语法糖,泛型,接口,都比较符合直觉。
    除了 net 跨平台上有坑之外,其他基本没有什么心智负担,对我来说这已经足够优雅了。
    泛型,partial class ,Task, SocketAsync, ThreadLocal 都是工程上用到的时候会足够舒服的东西。
    INCerry
        202
    INCerry  
       48 天前
    C#
    yh7gdiaYW
        203
    yh7gdiaYW  
       48 天前
    首先排除 Go
    liuliuliuliu
        204
    liuliuliuliu  
    PRO
       48 天前
    @v2er119 虽然但是,你看的是哪个榜单,TIOBE 常年前 5 名啊,2024 年还被评为年度语言
    DyingSwan
        205
    DyingSwan  
       48 天前
    C#
    afirefish
        206
    afirefish  
       48 天前
    C#
    shenjinpeng
        207
    shenjinpeng  
       48 天前
    PHP
    SakuraYuki
        208
    SakuraYuki  
       48 天前
    机器语言
    chf007
        209
    chf007  
       48 天前
    Elixir
    seakingii
        210
    seakingii  
       48 天前   ❤️ 3
    我投 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}");
    }
    seakingii
        211
    seakingii  
       48 天前
    28 分部类.可以将一个类文件,拆分成几个文件,可以达到
    1) 将大类按功能拆分成多个文件,更好维护
    2) 可以一部分是自动代码生成的,另一个部分是手动修改的,这样即可以利用机器自动产生代码,然后又可以定制这个产生的代码
    ouou0701
        212
    ouou0701  
       48 天前
    c#好高的赞啊,都用来开发什么
    zsqduke
        213
    zsqduke  
       48 天前
    最优雅那当然是 machine code
    yafeilee
        214
    yafeilee  
       48 天前
    推荐《七周七语言》这本书。

    编程语言的本质是连接人类语言和机器语言的中间产物。设计者必然要进行取舍。

    二进制 -> 汇编 -> C -> C++/Java -> Ruby/Python -> 人类

    Go/Rust/TS 是对弱类型的改良。

    好的语言要平衡两者:有自己一致性的哲学,又有对人类友好的一面。

    举例:
    JavaScript 整体的平衡较好,它的基于对象的调用逻辑(哲学性),又像 C 一样易于理解(易用性)。
    Lisp 过于哲学,在人类友好方面太多括号被诟病。

    推荐:
    Ruby 是我见过两者平衡最好的语言,一切皆对象的哲学是所有语言中最极致的,语法优雅简洁又带有很强自由度。

    后话:
    这些都不重要,并不是说平衡最好就发展最好。在适合的历史发展阶段产生合适的语言最重要,就算有些问题只要不是硬伤都可以解决,比如 JavaScript 和 TypeScript 。
    seakingii
        215
    seakingii  
       48 天前
    @ouou0701 WEB 的前端(Blazor),后端, 桌面端,工控软件,ERP 之类.基本上 JAVA 能搞的 C#也能搞,手机端不怎么行
    idragonet
        216
    idragonet  
       48 天前
    C#程序员路过:应该是 C#吧,看过 JAVA 代码语法真是头大。
    alwaysol
        217
    alwaysol  
       48 天前
    首先排除 Python 和 go,语法真是反人类
    flowerHeart
        218
    flowerHeart  
       48 天前
    C#
    leeg810312
        219
    leeg810312  
       48 天前
    写过 C# Java Javascript Python PHP ,最近几年写得最多是 C#,其次是 Python 和 Java ,以前工作 Javascript 也写不少,PHP 早就不写了。用下来 C#是最符合直觉,写代码体验最好,代码观感很舒服,如果项目结构设计合理,在 VS 里完全看着就是一件优雅的艺术品。Python 简单易用,Javascript 松散随意,Java 无论是代码本身,还是按行业规范和生态生成的项目文件都显得非常啰嗦,这些都跟优雅不沾边。
    BinCats
        220
    BinCats  
       48 天前
    10 年程序员告诉帮你,Kotlin
    unco020511
        221
    unco020511  
       48 天前
    kotlin 和 C#
    zhouxiaoxiao
        222
    zhouxiaoxiao  
       48 天前
    PHP 是世界上最好的语音
    w568w
        223
    w568w  
       48 天前
    看到这么多人选 C# 就放心了,证明国内开发还没有烂完

    @CodingIran 非常认同(主攻 Dart 开发)。每次看到同行写的 Swift ,都想把 Google 的头按过去叫他们多学学,尤其是 Actor Pattern

    不过 if let 和 if case ,Dart 应该已经有了吧。Swift 我不是很喜欢的地方是注解太多,一眼看过去全是 @xxx@yyy@zzz……
    RichardPlus
        224
    RichardPlus  
       48 天前
    喜欢 c#和喜欢 Kotlin 的人高度重合, 俺也一样嘿嘿嘿
    lichendaozhu
        225
    lichendaozhu  
       48 天前
    c#
    montaro2017
        226
    montaro2017  
       48 天前
    @coldle #15 应该是),
    ),
    ),
    ),
    )
    chenxiansheng
        227
    chenxiansheng  
       48 天前
    C#投一票
    coldle
        228
    coldle  
       48 天前
    @montaro2017 #226
    其实我指的是 lisp ,但我能感觉到点赞的很多人以为是 dart 🤣

    老天,dart 怎么会用「一类」指代
    lululau
        229
    lululau  
       48 天前   ❤️ 1
    20 年程序员告诉你,第一梯队:Ruby ,第二梯队:Swift / Kotlin ,第三梯队:Java / C#

    Python 和 Golang 都是简单取向,不同之处是 Golang 为性能而生,但简单不等于优雅

    Rust 是性能和安全取向,对于一个这类取向的语言来说,其类型系统设计得着实🐂🍺,不过优雅嘛,进不了前三梯队

    TS 本来能算在第三梯队,但是它那个类型体操,不合我的口味
    guanzhangzhang
        230
    guanzhangzhang  
       48 天前
    投 golang 一票(相对于 c 对比,关键字和官方自带库,以及简单协程),除了 err ,不过非 web 和比较基础的层面每个 err 都要处理还是很好的,不然像 c 那样用 int 当错误码,结果 0-255 不够用
    c#和 kotlin ,给已有加方法,kotlin 的协程要是想 golang 那样易用而不是很多关键字就是降维打击了
    guaike
        231
    guaike  
       48 天前
    C#
    james122333
        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 是简单整洁和一点点小妙 你第一梯队还好理解 后面怎么回事... 很难说服别人简单巧妙
    james122333
        233
    james122333  
       48 天前 via Android
    @lululau

    以武功路数来讲就是简炼却暗含巧劲揉合形成的美感
    zhwguest
        234
    zhwguest  
       48 天前
    @kenvix 是的,用到 kotlin,swift 和 rust ,觉得这些语言才是该准确的准确,该精简的精简,go 的确是太让人觉得老土了,虽然出活儿快。
    james122333
        235
    james122333  
       48 天前 via Android
    @zhwguest

    这种语法糖过多的其实就是雕花华丽 并非是优雅
    james122333
        236
    james122333  
       48 天前 via Android
    @zhwguest

    雕花这个词也很准确 你写 rust 难道不是在雕花吗 特讲究细节 不然编译器不通过
    Bluecoda
        237
    Bluecoda  
       47 天前
    Ruby
    Erlang
    Lisp
    C
    richarddingcn
        238
    richarddingcn  
       47 天前
    haskell
    Al0rid4l
        239
    Al0rid4l  
       47 天前
    虽然都说 C#, 但 C# 坏就坏在它太老了, 历史遗留问题比一些新的多不少, 比如什么 void 不是类型, switch 支持那么多模式匹配却不支持详尽检查等等, 所以肯定还是越新的语言越好(除了 Go
    shench
        240
    shench  
       47 天前
    说 PHP 可能许多人不服,但是 Laravel 是真的很优雅
    Cbdy
        241
    Cbdy  
       47 天前
    人人都爱 JavaScript
    glcolof
        242
    glcolof  
       47 天前
    我投 C#一票。
    Removable
        243
    Removable  
       47 天前
    @ns09005264 三元表达式岂不是更优雅?
    var key = condition ? <value1> : <value2>;
    dyncan
        244
    dyncan  
       47 天前
    PHP
    Removable
        245
    Removable  
       47 天前
    @Al0rid4l 使用 switch 表达式的话倒是可以实现详尽性检查:
    ```c#
    var result = value switch
    {
    ...
    }
    ```
    这样写,如果枚举值没有完全覆盖,编译时会抛出 CS8509 警告,你可以通过配置将该警告改为编译时错误。
    kakki
        246
    kakki  
       47 天前
    C# 问题结束
    Removable
        247
    Removable  
       47 天前
    @v2er119 你看的是啥榜? Tiobe 现在就是第五呢,我记得之前到过第四的
    https://www.tiobe.com/tiobe-index/
    Iakihsoug
        248
    Iakihsoug  
       47 天前
    c#
    Al0rid4l
        249
    Al0rid4l  
       47 天前
    @Removable 是, 但是 switch 表达式强制要求返回值, 对于只需要根据枚举做一些操作而不用返回值的时候还是无法覆盖到...
    davehandong
        250
    davehandong  
       47 天前
    啥是优雅
    ns09005264
        251
    ns09005264  
       47 天前
    @Removable #243
    if 表达式里可以写其他逻辑,比如:
    let key = if condition {
    一堆逻辑;
    value
    } else {
    另一堆逻辑;
    一堆操作;
    default_value
    };
    三元表达式比较倾向简单的二选一场景,想要在其中处理一些逻辑,得另写一个专门的函数。
    kimwang
        252
    kimwang  
       47 天前 via Android
    pascal 是 pascal
    Xunit
        253
    Xunit  
       47 天前
    不带复杂宏和指针的 C
    vrabe
        254
    vrabe  
       47 天前
    没人说 Prolog?
    luodan
        255
    luodan  
       47 天前
    吾有一言。曰「「春日宴。」」。書之。
    有數九九。名之曰「酒數」。
    批曰。「「请勾选输出汉字选项。」」

    恆為是。若「酒數」等於零者乃止也。

    吾有三言。曰「「與君」」。曰「酒數」。
    曰「「杯酒。可以窮歡宴。綠酒一杯歌一遍。」」。書之。

    減「酒數」以一。昔之「酒數」者。今其是矣云云。

    吾有一言。曰「「綠酒千杯腸已爛。」」。書之。
    2024
        256
    2024  
       47 天前
    我觉得最优雅的是 go 部分语法+协程,然后加上 php 的快速调试;

    所以自己造一个 https://github.com/php-any/origami
    z00z
        257
    z00z  
       47 天前
    C#
    Alias4ck
        258
    Alias4ck  
       47 天前
    Haskell 一种特别的美
    puppyxxx
        259
    puppyxxx  
       47 天前
    javascript 写的优雅,那就是真的优雅,我感觉写代码的这个人都优雅了
    maladaxia
        260
    maladaxia  
       43 天前
    @kenvix go 一点也不新
    kenvix
        261
    kenvix  
       42 天前
    @maladaxia #260 冷知识:rust 只比 go 晚出生几个月,kotlin 只比 go 晚一年半
    Ranglage
        262
    Ranglage  
       18 天前
    @bigtear 我一直觉得最优雅的就 c#
    1  2  3  
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2852 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:46 · PVG 20:46 · LAX 05:46 · JFK 08:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.