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

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

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

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

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

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

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

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

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

    确切得说,并没有大驼峰法跟小驼峰法的区别,而是“类型(类、接口等)名称用大驼峰法,保留关键字、成员、方法、变量等用小驼峰法”,跟“全部用大驼峰法(因为不好区分,通常要额外使用匈牙利命名风格)”的区别。C# 除了因为历史原因没法用前者之外,还有一个原因是除了保留关键字,别名(例如 String 的别名 string )、各种语法糖也用小写,导致即使变量用小驼峰还是有混淆,干脆就破罐子破摔了。
    dqzcwxb
        33
    dqzcwxb  
       77 天前
    @nothingistrue #32 "不是像 Java 那样完全推到重做"麻烦细说一下或者给个资料链接谢谢
    nothingistrue
        34
    nothingistrue  
       77 天前
    @ColinZeb 还是有区别的,比如 Java 当中可以用 People people 定义某人(即 people 隐含 some people 、a people 或者 one people 的意思),C# 就不行,People People 定义出来后你完全不知道 People 代表的是类型还是实例,只能换成 People OnePeople ,或者 CPeople People (万恶的匈牙利命名法)
    Mirage09
        35
    Mirage09  
       77 天前 via iPhone   ❤️ 1
    @dcsuibian
    不不不 我并不想表达哪种命名好哪种命名差 我只是觉得吵这件事很无聊
    frisktale
        36
    frisktale  
       77 天前
    @nothingistrue 啊? C#定义变量的时候不都是小写字母开头嘛,为啥会出现 People People 的情况啊。
    qW7bo2FbzbC0
        37
    qW7bo2FbzbC0  
       77 天前
    你可以入乡随俗,见人说人话,见鬼说鬼话,
    也可以定义 IDE 规则,全部按照你的风格来
    ColinZeb
        38
    ColinZeb  
       77 天前
    @nothingistrue 变量一般用 var people,至于属性用 Perple People 吴论如何都有歧义,不如写成 People One😀
    clino
        39
    clino  
       77 天前
    我投下划线一票,感觉这样阅读起来比较舒服,驼峰读起来比较费尽我本能地就是反感
    nothingistrue
        40
    nothingistrue  
       77 天前
    @frisktale #36 要是变量小写字母开头,楼主就不会来这里开贴了。
    @ColinZeb #38 变量名用小驼峰法,这在 Java 是基础规范,从最基础的 JDK ,到中间的各种框架,到高层应用开发,都用着一个规范。C# 的问题是,你可以在部分地方用小驼峰法,甚至可以团队规范硬性要求用小驼峰法表示变量,但是遇见基础类库和第三方框架就要抓瞎,所以还不如统一用大驼峰法表示变量,再用其他手段区分同名的类型和变量
    fkdog
        41
    fkdog  
       77 天前
    羊驼不是骆驼好不好?
    Bazingal
        42
    Bazingal  
       77 天前
    @nothingistrue 这不是规范的问题,是人的问题,C#一向都是建议变量用小驼峰的
    ragnaroks
        43
    ragnaroks  
       77 天前
    @frisktale 成员变量
    ComputerIdiot
        44
    ComputerIdiot  
       77 天前 via Android
    所以 F#用小驼峰,C#用大驼峰该怎么办呢?
    akatquas
        45
    akatquas  
       77 天前
    习惯就好,都是草台班子,别太较真。
    nothingistrue
        46
    nothingistrue  
       77 天前
    @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  
       77 天前
    c++ 默认还是下划线呢
    wdwwtzy
        49
    wdwwtzy  
       77 天前 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  
       77 天前
    下划线有的时候会跟下边框或者带下划线的字体重复,比较恶心...
    frisktale
        51
    frisktale  
       77 天前
    @ragnaroks 我写 c#的时候,无论是方法内的变量,还是类的成员变量都是小写字母开头的,也就在类内部定义方法和属性是大写字母开头的。看了这个贴子我感觉我学了个假的 c#
    zed1018
        52
    zed1018  
       77 天前   ❤️ 1
    看标题我以为是 VS 不让用别的风格了还是咋,原来只是自己不习惯罢了。自己不习惯就把别人批斗一番也是有意思。

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

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