V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ShikiSuen
V2EX  ›  程序员

我不明白为什么微软 VS 预设让 C# 使用大写草泥马命名风格。

  •  
  •   ShikiSuen · 2022-05-26 22:26:13 +08:00 · 8082 次点击
    这是一个创建于 662 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我不明白为什么微软 VS 预设让 C# 使用大写草泥马命名风格。

    之前我 Swift 用小写草泥马命名风格夹杂匈牙利命名风格已经习惯了, 结果现在得在命名方面另外动脑筋了。

    第 1 条附言  ·  2022-05-27 13:24:51 +08:00
    只是不明白而已,没有强迫推广自己的习惯的意思。请勿借题发挥。
    84 条回复    2023-06-24 17:11:32 +08:00
    villivateur
        1
    villivateur  
       2022-05-26 22:34:51 +08:00
    ……也许微软的开发者心里还在骂你为啥不用大驼峰呢
    ……“草泥马”风格是什么鬼,另外匈牙利风格是异端,经常让变量名莫名其妙的
    Biwood
        2
    Biwood  
       2022-05-26 23:51:53 +08:00 via Android   ❤️ 43
    CamelCase 叫大驼峰就好,乱起名字只会增加阅读屏障,简体中文已经够乱的了。再说草泥马也没有驼峰啊。
    ShikiSuen
        3
    ShikiSuen  
    OP
       2022-05-27 00:14:09 +08:00
    @villivateur 我轻易不用匈牙利,除非某些私有变数我会用 mut 或者 cst 开头(分别表示常数与变数;好像之前流行用下画线开头)。偶尔我会用 int 或者 str 开头。总之只要不引起歧异就好。对我而言匈牙利是符合变种的小写草泥马命名规则的。
    forgottencoast
        4
    forgottencoast  
       2022-05-27 00:24:50 +08:00
    为什么?因为官方的设计规范就是这样约定的,所有的.Net 官方类库源代码也是遵循这个约定的。
    绝大部分的 C#语言的使用者也都遵循这个约定。
    你不想用这个风格可以自己改的。
    Rocketer
        5
    Rocketer  
       2022-05-27 01:04:28 +08:00 via iPhone   ❤️ 11
    嗯,C#出身的程序员也会觉得 Java 命名习惯很奇怪。

    反正不符合自己多年养成的习惯的东西都是草泥马。
    SMGdcAt4kPPQ
        6
    SMGdcAt4kPPQ  
       2022-05-27 01:07:24 +08:00 via Android
    C#和 F#命名习惯还不一样
    Jwyt
        7
    Jwyt  
       2022-05-27 01:16:38 +08:00
    @ShikiSuen 匈牙利命名发才是迂腐过时的东西
    dangyuluo
        8
    dangyuluo  
       2022-05-27 01:22:16 +08:00   ❤️ 24
    “为什么世界不围着我转”这个系列
    neoblackcap
        9
    neoblackcap  
       2022-05-27 01:25:08 +08:00
    匈牙利命名法是已经过时的东西,但是 C#刚诞生的时候,编译工具以及静态分析工具并不那么强悍。工具并不能在你编写代码的时候就提示你或者帮你推导出类型。那个时候,匈牙利命名法的确起到一定的作用。
    C#已经很多年历史了,总不可能把所有的东西推倒重来。但是微软并没有强制你使用特定的代码风格。用 C++写 Windows 程序一样会遇到大量匈牙利命名法的代码,但是一样可以用新的规范。封装好,团队内部有规范统一就可以了。
    ysc3839
        10
    ysc3839  
       2022-05-27 05:23:24 +08:00
    大概是微软的历史习惯
    jjx
        11
    jjx  
       2022-05-27 06:43:35 +08:00   ❤️ 2
    这个, lz 连 c#的历史都不了解一下就来喷
    Mirage09
        12
    Mirage09  
       2022-05-27 06:51:19 +08:00 via iPhone
    无聊..那我还说 python 下划线命名很反人类
    Daming
        13
    Daming  
       2022-05-27 07:25:31 +08:00
    为什么 C#默认风格的 { 要单起一行,就不能学 java 放在行尾吗 [doge]
    dcsuibian
        14
    dcsuibian  
       2022-05-27 07:56:10 +08:00 via Android
    @Mirage09
    Python 的下划线命名法确实很讨厌,不过倒不是因为它本身。
    主要是搜到的不少参考代码甚至第三方库都不太遵守这种约定。例如 cv2.waitKey(),cv2.destroyAllWindows()。
    看着 PyCharm 里一堆黄色波浪线脑壳疼。
    liaohongxing
        15
    liaohongxing  
       2022-05-27 08:07:06 +08:00
    我觉得大写开头挺好的
    bthulu
        16
    bthulu  
       2022-05-27 08:08:44 +08:00   ❤️ 4
    我不管写什么语言都用大驼峰命名类,小驼峰命名变量。
    统一语言变量命名规范,从我做起!!!
    xuanbg
        17
    xuanbg  
       2022-05-27 08:16:42 +08:00
    啊……这……世界是围着我转的。吧?确认一下,微软 VS 预设让 C# 使用帕斯卡命名法是不是很奇怪?

    什么!你们居然说这是正常的。嘤嘤嘤……这个世界居然没有围着我转。你们就不能哄我一下吗。
    cozof
        18
    cozof  
       2022-05-27 08:33:19 +08:00 via iPhone
    C#用大驼峰,又叫帕斯卡命名法。
    makelove
        19
    makelove  
       2022-05-27 08:34:04 +08:00   ❤️ 1
    py 和 c 这种下划线命名看起来最美观

    C#的命名我最受不了,甚至变量和类都是大写开头没有区分,恶心到家了
    geelaw
        20
    geelaw  
       2022-05-27 08:44:15 +08:00 via iPhone   ❤️ 1
    @ShikiSuen #3 用 int/str 做匈牙利命名无意义,匈牙利命名的前缀需要体现的是编程语言类型系统外的类型信息,比如一个 ushort * 到底是 bstr ( BASIC 风格字符串)还是 sz (以 0 结尾的字符串),再比如一个 int 到底是 cb (字节的个数)还是 n (对象的个数)……
    yolee599
        21
    yolee599  
       2022-05-27 08:56:43 +08:00 via Android
    C# 那个是帕斯卡命名法,比匈牙利命名法好看多了
    nba2k9
        22
    nba2k9  
       2022-05-27 09:01:26 +08:00   ❤️ 2
    万能喷射战士
    ShikiSuen
        23
    ShikiSuen  
    OP
       2022-05-27 09:05:19 +08:00
    @Daming C#默认风格的 { 要单起一行,是因为那是微软公司内部的 clang-format 风格。
    我就用这套风格整 ObjC 的档案正文,读起来超方便。不過 Mozilla 風格也不錯就是了。
    ColinZeb
        24
    ColinZeb  
       2022-05-27 09:07:02 +08:00
    @makelove 变量,形参、实参都是小写开头,属性是大写开头,字段下划线开头
    litguy
        25
    litguy  
       2022-05-27 09:07:45 +08:00
    上世纪末我们大学时候学 WIN32 编程就是匈牙利命名法
    这个是历史遗留问题
    不是 C# 的问题
    而且匈牙利命名法也不是你说的那样一无是处
    sunmker
        26
    sunmker  
       2022-05-27 09:10:50 +08:00
    其实微软自己也不怎么遵守的,我以前看 C#高级教程的时候,书中提到过
    Saxton
        27
    Saxton  
       2022-05-27 09:11:40 +08:00
    @Biwood 你这草泥马没有驼峰给我整破防了
    makelove
        28
    makelove  
       2022-05-27 09:13:04 +08:00
    @ColinZeb 对对,我说的是类的属性和方法是大写开头,真的欣赏不能
    ColinZeb
        29
    ColinZeb  
       2022-05-27 09:18:10 +08:00
    @makelove 先入为主的习惯问题,我觉得 c#的命名方式已经很丰富了。实际使用中类大写开头(如 new Class 、Class.Static ),方法小括号结尾,属性不带小括号结尾,基本没有分不清的情况
    lower
        30
    lower  
       2022-05-27 09:20:32 +08:00   ❤️ 1
    @makelove go 更屌,用第一个驼峰的大小写来表示属性的可访问性😂
    Helsing
        31
    Helsing  
       2022-05-27 09:29:46 +08:00 via iPhone
    @bthulu #16 +1
    nothingistrue
        32
    nothingistrue  
       2022-05-27 09:33:50 +08:00
    在微软在设计 C# 的时候,全世界都在用大驼峰法风格(除了当时还处于新生阶段的 Java ),而 C# 是在 VB 、MFC 的基础上改良,不是像 Java 那样完全推到重做,自然就顺延了之前的大驼峰风格。所以并不是微软让 C# 用大驼峰法风格,而是微软在大驼峰风格下诞生了 C#。

    确切得说,并没有大驼峰法跟小驼峰法的区别,而是“类型(类、接口等)名称用大驼峰法,保留关键字、成员、方法、变量等用小驼峰法”,跟“全部用大驼峰法(因为不好区分,通常要额外使用匈牙利命名风格)”的区别。C# 除了因为历史原因没法用前者之外,还有一个原因是除了保留关键字,别名(例如 String 的别名 string )、各种语法糖也用小写,导致即使变量用小驼峰还是有混淆,干脆就破罐子破摔了。
    dqzcwxb
        33
    dqzcwxb  
       2022-05-27 09:36:22 +08:00
    @nothingistrue #32 "不是像 Java 那样完全推到重做"麻烦细说一下或者给个资料链接谢谢
    nothingistrue
        34
    nothingistrue  
       2022-05-27 09:41:28 +08:00
    @ColinZeb 还是有区别的,比如 Java 当中可以用 People people 定义某人(即 people 隐含 some people 、a people 或者 one people 的意思),C# 就不行,People People 定义出来后你完全不知道 People 代表的是类型还是实例,只能换成 People OnePeople ,或者 CPeople People (万恶的匈牙利命名法)
    Mirage09
        35
    Mirage09  
       2022-05-27 09:49:10 +08:00 via iPhone   ❤️ 1
    @dcsuibian
    不不不 我并不想表达哪种命名好哪种命名差 我只是觉得吵这件事很无聊
    frisktale
        36
    frisktale  
       2022-05-27 09:52:39 +08:00
    @nothingistrue 啊? C#定义变量的时候不都是小写字母开头嘛,为啥会出现 People People 的情况啊。
    qW7bo2FbzbC0
        37
    qW7bo2FbzbC0  
       2022-05-27 09:52:40 +08:00
    你可以入乡随俗,见人说人话,见鬼说鬼话,
    也可以定义 IDE 规则,全部按照你的风格来
    ColinZeb
        38
    ColinZeb  
       2022-05-27 09:54:23 +08:00
    @nothingistrue 变量一般用 var people,至于属性用 Perple People 吴论如何都有歧义,不如写成 People One😀
    clino
        39
    clino  
       2022-05-27 09:55:33 +08:00
    我投下划线一票,感觉这样阅读起来比较舒服,驼峰读起来比较费尽我本能地就是反感
    nothingistrue
        40
    nothingistrue  
       2022-05-27 10:01:21 +08:00
    @frisktale #36 要是变量小写字母开头,楼主就不会来这里开贴了。
    @ColinZeb #38 变量名用小驼峰法,这在 Java 是基础规范,从最基础的 JDK ,到中间的各种框架,到高层应用开发,都用着一个规范。C# 的问题是,你可以在部分地方用小驼峰法,甚至可以团队规范硬性要求用小驼峰法表示变量,但是遇见基础类库和第三方框架就要抓瞎,所以还不如统一用大驼峰法表示变量,再用其他手段区分同名的类型和变量
    fkdog
        41
    fkdog  
       2022-05-27 10:05:23 +08:00
    羊驼不是骆驼好不好?
    Bazingal
        42
    Bazingal  
       2022-05-27 10:08:39 +08:00
    @nothingistrue 这不是规范的问题,是人的问题,C#一向都是建议变量用小驼峰的
    ragnaroks
        43
    ragnaroks  
       2022-05-27 10:10:24 +08:00
    @frisktale 成员变量
    SMGdcAt4kPPQ
        44
    SMGdcAt4kPPQ  
       2022-05-27 10:11:21 +08:00 via Android
    所以 F#用小驼峰,C#用大驼峰该怎么办呢?
    akatquas
        45
    akatquas  
       2022-05-27 10:13:16 +08:00
    习惯就好,都是草台班子,别太较真。
    nothingistrue
        46
    nothingistrue  
       2022-05-27 10:20:08 +08:00
    @frisktale #36
    @Bazingal #42
    用得少,记差了。https://github.com/xamarin/xamarin-forms-samples/blob/main/Todo/Todo/Todo/Models/TodoItem.cs ,现在区别不是太大了,就包( Java)—命名空间( C#),成员 /方法( Java)—字段 /属性 /方法( C#)风格上有区别,不过这上面设计理念就有区别,可能不适应,但适应过去也就没事了。
    ychost
        47
    ychost  
       2022-05-27 10:21:12 +08:00
    c++ 默认还是下划线呢
    VictorJing94
        48
    VictorJing94  
       2022-05-27 10:21:24 +08:00   ❤️ 1
    wdwwtzy
        49
    wdwwtzy  
       2022-05-27 10:21:27 +08:00 via iPhone
    @neoblackcap 太能乱说了,c#从来没有推荐过匈牙利命名法,一直是驼峰
    C#命名规范

    Type Method Example
    Namespace Pascal namespace AutofacDemo
    Class Pascal public class MovieFinder
    Interface Pascal public interface IFileFinder
    Pascal public string Name{get;set;}
    Method Pascal public void Update()
    Event Pascal event EventHander Change
    Event Pascal enum Fruits{Apple,Banana}
    Enum Pascal static string Issuer
    Controls Pascal btnConfirm, txtBondName
    Private Camel public int Add(int totalAmt)
    Parameter Camel var firstName = "Steven"
    Private Camel private string _firstName
    Const Upper const int MAX_NUM
    luckyrayyy
        50
    luckyrayyy  
       2022-05-27 10:22:14 +08:00
    下划线有的时候会跟下边框或者带下划线的字体重复,比较恶心...
    frisktale
        51
    frisktale  
       2022-05-27 10:23:25 +08:00
    @ragnaroks 我写 c#的时候,无论是方法内的变量,还是类的成员变量都是小写字母开头的,也就在类内部定义方法和属性是大写字母开头的。看了这个贴子我感觉我学了个假的 c#
    zed1018
        52
    zed1018  
       2022-05-27 10:26:03 +08:00   ❤️ 1
    看标题我以为是 VS 不让用别的风格了还是咋,原来只是自己不习惯罢了。自己不习惯就把别人批斗一番也是有意思。

    “顺我者昌,逆我者亡”
    ragnaroks
        53
    ragnaroks  
       2022-05-27 10:31:08 +08:00
    @frisktale 成员变量“需要”帕斯卡,否则分析器会 warning 的,如果你不开分析器的话倒是不用管了
    reallittoma
        54
    reallittoma  
       2022-05-27 10:31:17 +08:00
    @makelove #19 重新定义美观
    PerFectTime
        55
    PerFectTime  
       2022-05-27 10:32:06 +08:00
    啊对对对,你说的都对
    ragnaroks
        56
    ragnaroks  
       2022-05-27 10:32:47 +08:00
    @frisktale
    这里我加个限定,成员变量是属性的话才会这样

    public Int32 value1;
    public Int32 Value2{get;init}
    elintwenty
        57
    elintwenty  
       2022-05-27 10:40:50 +08:00
    还是 php 比较好,哪种命名规则都有
    pkoukk
        58
    pkoukk  
       2022-05-27 10:55:13 +08:00
    2022 年了,居然还能遇到用匈牙利的活化石
    userforg2021
        59
    userforg2021  
       2022-05-27 11:01:09 +08:00
    @ragnaroks 风格可以自定义,不仅能 warning ,甚至能直接 error 。右键项目添加 editorconfig ,可以配置项目的风格。或者 VS 里面 "工具"->"选项"->"文本编辑器"->"C#"->"代码样式",配置全局风格。
    sutra
        60
    sutra  
       2022-05-27 11:13:38 +08:00
    和 Anders Hejlsberg 的经历有关吧,以前在 Borland 搞 Delphi 的。
    beyondex
        61
    beyondex  
       2022-05-27 11:14:31 +08:00
    @elintwenty 哈哈哈
    sutra
        62
    sutra  
       2022-05-27 11:16:40 +08:00
    大驼峰式命名法( upper camel case ),也被称为 Pascal 命名法(英语:Pascal Case )。估计应该和 Anders Hejlsberg 之前在 Borland 搞 Turbo Pascal 的经历更相关。
    WebKit
        63
    WebKit  
       2022-05-27 11:24:00 +08:00
    草泥马????我有点蒙了。
    ragnaroks
        64
    ragnaroks  
       2022-05-27 11:27:04 +08:00
    @userforg2021 你回错人了
    thinkershare
        65
    thinkershare  
       2022-05-27 11:33:54 +08:00   ❤️ 1
    这个破帖子一看就是骗积分的:
    一切都是权衡, 微软官方有出过书籍, 详细讲解过.NET Framework 的命名规则的各种来源, 非常详细, 也说明了各种权衡的利弊. 不学无术就不要想当然的瞎猜.
    对于命名规范这种东西, 只有一致性最重要.
    另外每个人都有自己的先入为主, 总是感觉自己最初接触的东西才是最自然最舒服的.
    有时间去看看这本书: <<Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries>>.
    另外这个世界不是围绕你转的, 每个领域都有自己的约定和习俗, 想当然的强迫别人和自己保持一致属于即幼稚还暴戾.
    userforg2021
        66
    userforg2021  
       2022-05-27 11:36:48 +08:00
    @ragnaroks
    "成员变量“需要”帕斯卡,否则分析器会 warning 的,"
    ragnaroks
        67
    ragnaroks  
       2022-05-27 12:29:25 +08:00
    @userforg2021 你再理解一下这行文本的意思?
    userforg2021
        68
    userforg2021  
       2022-05-27 13:41:38 +08:00
    @ragnaroks 分析器是否 warning 是依据代码是否符合配置的命名风格来的,只是辅组代码风格统一。你可以设置属性使用小驼峰命名,分析器会报非小驼峰命名的属性 warning
    ragnaroks
        69
    ragnaroks  
       2022-05-27 13:47:00 +08:00
    @userforg2021 这里的语境是默认设置,标题已经明确“VS 预设”,我已经提出关于分析器的内容,你后面的回复相当于让一个大学老师教一线码畜该怎么写代码;如果你实在不能理解,可以在看到此行文本后忽略我
    nothingistrue
        70
    nothingistrue  
       2022-05-27 14:06:21 +08:00
    @userforg2021 编译 waring ,跟代码风格问题是两码事,你最好还是先确认一下成员变量小驼峰法命名,是编译警告,还是代码风格警告。Java 这边,警告( Error )和错误( Waring )是只能由编译器报的,IDE 额外分析出来的问题,必须用其他类型来标识,我不清除 VS 那片是如何。隐藏编译警告,是一种极度危险的行为,因为你在这个 IDE 上隐藏了,换个 IDE 就又出来了。
    xFrye
        71
    xFrye  
       2022-05-27 14:07:01 +08:00
    平时下划线、驼峰混用的表示,c#那种 pascal 命名也不是不行,匈牙利命名法才是真的反人类好吗。。。
    secondwtq
        72
    secondwtq  
       2022-05-27 17:56:23 +08:00
    我喜欢使用法兰西命名法,a ,a2 ,a3 ... a18
    dajj
        73
    dajj  
       2022-05-27 17:58:19 +08:00
    各有各的理由,建议宽容点, 即使一个语言用多种风格我都能接受。
    ShikiSuen
        74
    ShikiSuen  
    OP
       2022-05-27 18:20:19 +08:00
    @secondwtq 我写交响时遇到单谱表多个金管 /木管乐手吹奏雷同内容的时候也会写 a2 标记:
    https://www.bilibili.com/video/av847136989/
    第 46 小节的 Trombone 就写着 a2 。
    dingyx99
        75
    dingyx99  
       2022-05-27 20:33:35 +08:00
    @dangyuluo 补充一句,“为什么不写 editorconfig 而是直接喷语言”系列
    thtznet
        76
    thtznet  
       2022-05-27 22:42:55 +08:00
    Pascal 命名法 挺好啊,每个单词都很清晰
    ShikiSuen
        77
    ShikiSuen  
    OP
       2022-05-27 22:43:34 +08:00
    @dingyx99 EditorConfig 是什麼?
    asuraa
        78
    asuraa  
       2022-05-27 23:11:38 +08:00
    我觉得都不好 我喜欢下划线那种
    charlie21
        79
    charlie21  
       2022-05-28 11:52:37 +08:00 via iPhone
    你可以付钱给微软,微软将为你改变
    1217950746
        80
    1217950746  
       2022-05-28 20:44:33 +08:00
    C# 什么规范都可以,editorconfig 配置一波就可以了
    byzod
        81
    byzod  
       2022-05-29 13:07:50 +08:00
    说到这个,id 开头的到底要怎么写
    比如 id table
    见过 idTable ,iDTable ,IdTable 和 IDTable
    thinkershare
        82
    thinkershare  
       272 天前   ❤️ 1
    @byzod 没一门语言都有自己的官方推荐命名风格。
    C#中 id table 标准的命名方式是:idTable / IdTable / _idTable
    idTable 用在局部变量(函数参数),IdTable 用于属性, _idTable 用于私有字段,
    因为 ID 并不是一个缩写词语,所以它使用 Pascal 命令方法时候只有首字母需要大写。
    IO 则都需要大写,因为它是 2 个单词的首字母缩写形式。XML 使用 Xml ,因为超过 2 个单词的缩写形式被视为一个普通单词。
    byzod
        83
    byzod  
       269 天前
    @thinkershare id 不是缩写?是拉丁语吗
    thinkershare
        84
    thinkershare  
       268 天前
    @byzod id 是 identity 的缩写,而不是 2 个单词的缩写,这和 XML/HTML/IO 等首字母缩写形式有明显的区别。英文单词的各种不同习惯的缩写在我看开来对英语为母语的编写人员是极度不友好的,所以我喜欢 Swifit/C#着完整的长命名风格,讨厌 Unix like 的各种奇葩缩写模式,不过这只是个人喜欢,一致性始终是最重要的,选择使用某一种风格就坚持某一种好了,不要混用就行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5395 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:37 · PVG 16:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.