我不明白为什么微软 VS 预设让 C# 使用大写草泥马命名风格。
之前我 Swift 用小写草泥马命名风格夹杂匈牙利命名风格已经习惯了, 结果现在得在命名方面另外动脑筋了。
1
villivateur 2022-05-26 22:34:51 +08:00
……也许微软的开发者心里还在骂你为啥不用大驼峰呢
……“草泥马”风格是什么鬼,另外匈牙利风格是异端,经常让变量名莫名其妙的 |
2
Biwood 2022-05-26 23:51:53 +08:00 via Android 43
CamelCase 叫大驼峰就好,乱起名字只会增加阅读屏障,简体中文已经够乱的了。再说草泥马也没有驼峰啊。
|
3
ShikiSuen OP @villivateur 我轻易不用匈牙利,除非某些私有变数我会用 mut 或者 cst 开头(分别表示常数与变数;好像之前流行用下画线开头)。偶尔我会用 int 或者 str 开头。总之只要不引起歧异就好。对我而言匈牙利是符合变种的小写草泥马命名规则的。
|
4
forgottencoast 2022-05-27 00:24:50 +08:00
|
5
Rocketer 2022-05-27 01:04:28 +08:00 via iPhone 11
嗯,C#出身的程序员也会觉得 Java 命名习惯很奇怪。
反正不符合自己多年养成的习惯的东西都是草泥马。 |
6
SMGdcAt4kPPQ 2022-05-27 01:07:24 +08:00 via Android
C#和 F#命名习惯还不一样
|
8
dangyuluo 2022-05-27 01:22:16 +08:00 24
“为什么世界不围着我转”这个系列
|
9
neoblackcap 2022-05-27 01:25:08 +08:00
匈牙利命名法是已经过时的东西,但是 C#刚诞生的时候,编译工具以及静态分析工具并不那么强悍。工具并不能在你编写代码的时候就提示你或者帮你推导出类型。那个时候,匈牙利命名法的确起到一定的作用。
C#已经很多年历史了,总不可能把所有的东西推倒重来。但是微软并没有强制你使用特定的代码风格。用 C++写 Windows 程序一样会遇到大量匈牙利命名法的代码,但是一样可以用新的规范。封装好,团队内部有规范统一就可以了。 |
10
ysc3839 2022-05-27 05:23:24 +08:00
大概是微软的历史习惯
|
11
jjx 2022-05-27 06:43:35 +08:00 2
这个, lz 连 c#的历史都不了解一下就来喷
|
12
Mirage09 2022-05-27 06:51:19 +08:00 via iPhone
无聊..那我还说 python 下划线命名很反人类
|
13
Daming 2022-05-27 07:25:31 +08:00
为什么 C#默认风格的 { 要单起一行,就不能学 java 放在行尾吗 [doge]
|
14
dcsuibian 2022-05-27 07:56:10 +08:00 via Android
@Mirage09
Python 的下划线命名法确实很讨厌,不过倒不是因为它本身。 主要是搜到的不少参考代码甚至第三方库都不太遵守这种约定。例如 cv2.waitKey(),cv2.destroyAllWindows()。 看着 PyCharm 里一堆黄色波浪线脑壳疼。 |
15
liaohongxing 2022-05-27 08:07:06 +08:00
我觉得大写开头挺好的
|
16
bthulu 2022-05-27 08:08:44 +08:00 4
我不管写什么语言都用大驼峰命名类,小驼峰命名变量。
统一语言变量命名规范,从我做起!!! |
17
xuanbg 2022-05-27 08:16:42 +08:00
啊……这……世界是围着我转的。吧?确认一下,微软 VS 预设让 C# 使用帕斯卡命名法是不是很奇怪?
什么!你们居然说这是正常的。嘤嘤嘤……这个世界居然没有围着我转。你们就不能哄我一下吗。 |
18
cozof 2022-05-27 08:33:19 +08:00 via iPhone
C#用大驼峰,又叫帕斯卡命名法。
|
19
makelove 2022-05-27 08:34:04 +08:00 1
py 和 c 这种下划线命名看起来最美观
C#的命名我最受不了,甚至变量和类都是大写开头没有区分,恶心到家了 |
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 (对象的个数)……
|
21
yolee599 2022-05-27 08:56:43 +08:00 via Android
C# 那个是帕斯卡命名法,比匈牙利命名法好看多了
|
22
nba2k9 2022-05-27 09:01:26 +08:00 2
万能喷射战士
|
23
ShikiSuen OP @Daming C#默认风格的 { 要单起一行,是因为那是微软公司内部的 clang-format 风格。
我就用这套风格整 ObjC 的档案正文,读起来超方便。不過 Mozilla 風格也不錯就是了。 |
25
litguy 2022-05-27 09:07:45 +08:00
上世纪末我们大学时候学 WIN32 编程就是匈牙利命名法
这个是历史遗留问题 不是 C# 的问题 而且匈牙利命名法也不是你说的那样一无是处 |
26
sunmker 2022-05-27 09:10:50 +08:00
其实微软自己也不怎么遵守的,我以前看 C#高级教程的时候,书中提到过
|
29
ColinZeb 2022-05-27 09:18:10 +08:00
@makelove 先入为主的习惯问题,我觉得 c#的命名方式已经很丰富了。实际使用中类大写开头(如 new Class 、Class.Static ),方法小括号结尾,属性不带小括号结尾,基本没有分不清的情况
|
32
nothingistrue 2022-05-27 09:33:50 +08:00
在微软在设计 C# 的时候,全世界都在用大驼峰法风格(除了当时还处于新生阶段的 Java ),而 C# 是在 VB 、MFC 的基础上改良,不是像 Java 那样完全推到重做,自然就顺延了之前的大驼峰风格。所以并不是微软让 C# 用大驼峰法风格,而是微软在大驼峰风格下诞生了 C#。
确切得说,并没有大驼峰法跟小驼峰法的区别,而是“类型(类、接口等)名称用大驼峰法,保留关键字、成员、方法、变量等用小驼峰法”,跟“全部用大驼峰法(因为不好区分,通常要额外使用匈牙利命名风格)”的区别。C# 除了因为历史原因没法用前者之外,还有一个原因是除了保留关键字,别名(例如 String 的别名 string )、各种语法糖也用小写,导致即使变量用小驼峰还是有混淆,干脆就破罐子破摔了。 |
33
dqzcwxb 2022-05-27 09:36:22 +08:00
@nothingistrue #32 "不是像 Java 那样完全推到重做"麻烦细说一下或者给个资料链接谢谢
|
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 (万恶的匈牙利命名法)
|
36
frisktale 2022-05-27 09:52:39 +08:00
@nothingistrue 啊? C#定义变量的时候不都是小写字母开头嘛,为啥会出现 People People 的情况啊。
|
37
qW7bo2FbzbC0 2022-05-27 09:52:40 +08:00
你可以入乡随俗,见人说人话,见鬼说鬼话,
也可以定义 IDE 规则,全部按照你的风格来 |
38
ColinZeb 2022-05-27 09:54:23 +08:00
@nothingistrue 变量一般用 var people,至于属性用 Perple People 吴论如何都有歧义,不如写成 People One😀
|
39
clino 2022-05-27 09:55:33 +08:00
我投下划线一票,感觉这样阅读起来比较舒服,驼峰读起来比较费尽我本能地就是反感
|
40
nothingistrue 2022-05-27 10:01:21 +08:00
|
41
fkdog 2022-05-27 10:05:23 +08:00
羊驼不是骆驼好不好?
|
42
Bazingal 2022-05-27 10:08:39 +08:00
@nothingistrue 这不是规范的问题,是人的问题,C#一向都是建议变量用小驼峰的
|
44
SMGdcAt4kPPQ 2022-05-27 10:11:21 +08:00 via Android
所以 F#用小驼峰,C#用大驼峰该怎么办呢?
|
45
akatquas 2022-05-27 10:13:16 +08:00
习惯就好,都是草台班子,别太较真。
|
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#)风格上有区别,不过这上面设计理念就有区别,可能不适应,但适应过去也就没事了。 |
47
ychost 2022-05-27 10:21:12 +08:00
c++ 默认还是下划线呢
|
48
VictorJing94 2022-05-27 10:21:24 +08:00 1
|
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 |
50
luckyrayyy 2022-05-27 10:22:14 +08:00
下划线有的时候会跟下边框或者带下划线的字体重复,比较恶心...
|
51
frisktale 2022-05-27 10:23:25 +08:00
@ragnaroks 我写 c#的时候,无论是方法内的变量,还是类的成员变量都是小写字母开头的,也就在类内部定义方法和属性是大写字母开头的。看了这个贴子我感觉我学了个假的 c#
|
52
zed1018 2022-05-27 10:26:03 +08:00 1
看标题我以为是 VS 不让用别的风格了还是咋,原来只是自己不习惯罢了。自己不习惯就把别人批斗一番也是有意思。
“顺我者昌,逆我者亡” |
54
reallittoma 2022-05-27 10:31:17 +08:00
@makelove #19 重新定义美观
|
55
PerFectTime 2022-05-27 10:32:06 +08:00
啊对对对,你说的都对
|
56
ragnaroks 2022-05-27 10:32:47 +08:00
|
57
elintwenty 2022-05-27 10:40:50 +08:00
还是 php 比较好,哪种命名规则都有
|
58
pkoukk 2022-05-27 10:55:13 +08:00
2022 年了,居然还能遇到用匈牙利的活化石
|
59
userforg2021 2022-05-27 11:01:09 +08:00
@ragnaroks 风格可以自定义,不仅能 warning ,甚至能直接 error 。右键项目添加 editorconfig ,可以配置项目的风格。或者 VS 里面 "工具"->"选项"->"文本编辑器"->"C#"->"代码样式",配置全局风格。
|
60
sutra 2022-05-27 11:13:38 +08:00
和 Anders Hejlsberg 的经历有关吧,以前在 Borland 搞 Delphi 的。
|
61
beyondex 2022-05-27 11:14:31 +08:00
@elintwenty 哈哈哈
|
62
sutra 2022-05-27 11:16:40 +08:00
大驼峰式命名法( upper camel case ),也被称为 Pascal 命名法(英语:Pascal Case )。估计应该和 Anders Hejlsberg 之前在 Borland 搞 Turbo Pascal 的经历更相关。
|
63
WebKit 2022-05-27 11:24:00 +08:00
草泥马????我有点蒙了。
|
64
ragnaroks 2022-05-27 11:27:04 +08:00
@userforg2021 你回错人了
|
65
thinkershare 2022-05-27 11:33:54 +08:00 1
这个破帖子一看就是骗积分的:
一切都是权衡, 微软官方有出过书籍, 详细讲解过.NET Framework 的命名规则的各种来源, 非常详细, 也说明了各种权衡的利弊. 不学无术就不要想当然的瞎猜. 对于命名规范这种东西, 只有一致性最重要. 另外每个人都有自己的先入为主, 总是感觉自己最初接触的东西才是最自然最舒服的. 有时间去看看这本书: <<Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries>>. 另外这个世界不是围绕你转的, 每个领域都有自己的约定和习俗, 想当然的强迫别人和自己保持一致属于即幼稚还暴戾. |
66
userforg2021 2022-05-27 11:36:48 +08:00
@ragnaroks
"成员变量“需要”帕斯卡,否则分析器会 warning 的," |
67
ragnaroks 2022-05-27 12:29:25 +08:00
@userforg2021 你再理解一下这行文本的意思?
|
68
userforg2021 2022-05-27 13:41:38 +08:00
@ragnaroks 分析器是否 warning 是依据代码是否符合配置的命名风格来的,只是辅组代码风格统一。你可以设置属性使用小驼峰命名,分析器会报非小驼峰命名的属性 warning
|
69
ragnaroks 2022-05-27 13:47:00 +08:00
@userforg2021 这里的语境是默认设置,标题已经明确“VS 预设”,我已经提出关于分析器的内容,你后面的回复相当于让一个大学老师教一线码畜该怎么写代码;如果你实在不能理解,可以在看到此行文本后忽略我
|
70
nothingistrue 2022-05-27 14:06:21 +08:00
@userforg2021 编译 waring ,跟代码风格问题是两码事,你最好还是先确认一下成员变量小驼峰法命名,是编译警告,还是代码风格警告。Java 这边,警告( Error )和错误( Waring )是只能由编译器报的,IDE 额外分析出来的问题,必须用其他类型来标识,我不清除 VS 那片是如何。隐藏编译警告,是一种极度危险的行为,因为你在这个 IDE 上隐藏了,换个 IDE 就又出来了。
|
71
xFrye 2022-05-27 14:07:01 +08:00
平时下划线、驼峰混用的表示,c#那种 pascal 命名也不是不行,匈牙利命名法才是真的反人类好吗。。。
|
72
secondwtq 2022-05-27 17:56:23 +08:00
我喜欢使用法兰西命名法,a ,a2 ,a3 ... a18
|
73
dajj 2022-05-27 17:58:19 +08:00
各有各的理由,建议宽容点, 即使一个语言用多种风格我都能接受。
|
74
ShikiSuen OP @secondwtq 我写交响时遇到单谱表多个金管 /木管乐手吹奏雷同内容的时候也会写 a2 标记:
https://www.bilibili.com/video/av847136989/ 第 46 小节的 Trombone 就写着 a2 。 |
76
thtznet 2022-05-27 22:42:55 +08:00
Pascal 命名法 挺好啊,每个单词都很清晰
|
78
asuraa 2022-05-27 23:11:38 +08:00
我觉得都不好 我喜欢下划线那种
|
79
charlie21 2022-05-28 11:52:37 +08:00 via iPhone
你可以付钱给微软,微软将为你改变
|
80
1217950746 2022-05-28 20:44:33 +08:00
C# 什么规范都可以,editorconfig 配置一波就可以了
|
81
byzod 2022-05-29 13:07:50 +08:00
说到这个,id 开头的到底要怎么写
比如 id table 见过 idTable ,iDTable ,IdTable 和 IDTable |
82
thinkershare 281 天前 1
@byzod 没一门语言都有自己的官方推荐命名风格。
C#中 id table 标准的命名方式是:idTable / IdTable / _idTable idTable 用在局部变量(函数参数),IdTable 用于属性, _idTable 用于私有字段, 因为 ID 并不是一个缩写词语,所以它使用 Pascal 命令方法时候只有首字母需要大写。 IO 则都需要大写,因为它是 2 个单词的首字母缩写形式。XML 使用 Xml ,因为超过 2 个单词的缩写形式被视为一个普通单词。 |
83
byzod 278 天前
@thinkershare id 不是缩写?是拉丁语吗
|
84
thinkershare 278 天前
@byzod id 是 identity 的缩写,而不是 2 个单词的缩写,这和 XML/HTML/IO 等首字母缩写形式有明显的区别。英文单词的各种不同习惯的缩写在我看开来对英语为母语的编写人员是极度不友好的,所以我喜欢 Swifit/C#着完整的长命名风格,讨厌 Unix like 的各种奇葩缩写模式,不过这只是个人喜欢,一致性始终是最重要的,选择使用某一种风格就坚持某一种好了,不要混用就行。
|