可能重复:
Is there any advantage of being a case-sensitive programming language?
Why are many languages case sensitive?
我一直想知道的是,为什么语言设计为区分大小写?
我的豌豆大脑无法理解为什么它有用。
但我确信那里有一个。在有人说出来之前,让一个名为dog
和Dog
的变量区别于区分大小写真的是非常糟糕的做法,对吗?
任何评论都赞赏,也许还有任何关于此事的历史!我对案例敏感性一般不敏感,但对案例敏感性的敏感性很敏感所以让我们保持所有答案和评论是民间的!
答案 0 :(得分:17)
在支持它的语言中,有两个仅按案例区分的成员并不一定是不好的做法。例如,这是一个相当常见的C#:
private readonly string name;
public string Name { get { return name; } }
我个人非常满意区分大小写 - 特别是因为它允许像上面这样的代码,其中成员变量和属性无论如何都遵循惯例,避免混淆。
请注意,区分大小写也具有文化方面......并非所有文化都认为相同的字符是等同的......
答案 1 :(得分:9)
我喜欢区分大小写以区分类和实例。
Form form = new Form();
如果您不能这样做,最终会得到名为myForm
或form1
或f
的变量,这些变量不像普通的form
那样干净且具有描述性
区分大小写也意味着您没有对form
,FORM
和Form
的引用,这些引用都是相同的。我发现很难阅读这样的代码。我发现扫描代码更加容易,其中对同一变量的所有引用看起来完全相同。
答案 2 :(得分:8)
编程语言中区分大小写的最大原因之一是可读性。意味着相同的事情看起来也应该是一样的。
我在M. Sandin的相关讨论中找到了以下interesting example:
我曾经 相信案例敏感性是一个 错,直到我在这种情况下这样做 不敏感的语言PL / SQL(语法 现在被遗忘了):
function IsValidUserLogin(user:string, password :string):bool begin result = select * from USERS where USER_NAME=user and PASSWORD=password; return not is_empty(result); end
这几个人都没有注意到 小批量生产的月份 系统,没有任何伤害。但它 从案件中崛起是一个讨厌的错误 不敏感,编码约定和 人类阅读代码的方式。课程 对我来说就是:事情就是这样 同样应该看起来一样。
你能立刻看到问题吗?我不能......
答案 3 :(得分:4)
我一直想知道的是,为什么语言设计为区分大小写?
最终,这是因为更容易正确地正确实现区分大小写的比较;你只是比较字节/字符没有任何转换。你也可以做其他事情,比如哈希很容易。
为什么这是一个问题?好吧,除非你处于支持字符的微小域(特别是US-ASCII),否则不区分大小写非常难以添加。案例转换规则因语言环境而异(土耳其语规则与世界其他地方的规则不同)并且无法保证翻转单个位将做正确的事情,或者它始终是相同的位并且在相同的位置下前提条件。 (IIRC,在将元音转换为大写字母时将某些语言丢弃,并在转换为小写字母时重新引入它们,某些语言中存在一些非常复杂的规则。我完全忘记了细节是什么。)
如果你是区分大小写的,那你就忽略了这一切;它更简单。 (请注意,你仍然应该注意UNICODE规范化形式,但这是另一个故事,它适用于你正在使用的任何案例规则。)
答案 4 :(得分:3)
想象一下,你有一个名为dog
的对象,它有一个名为Bark()
的方法。您还定义了一个名为Dog的类,它有一个名为Bark()
的静态方法。你写dog.Bark()
。那会是怎么回事?从类中调用对象的方法或静态方法? (使用::
不存在的语言)
答案 5 :(得分:2)
我确信这是性能考虑因素。将字符串转换为大写或小写以进行无外壳比较并不是一项昂贵的操作,但它也不是免费的,并且在旧系统上它可能增加了当时系统尚未准备好处理的复杂性。
现在,当然,语言喜欢彼此兼容(例如VB无法区分C#类或仅在大小写上有所不同的函数),人们习惯于将相同的文本命名为不同的案例(参见Jon Skeet的答案 - 我做了很多),无壳语言的价值实际上不足以超过这两者。
答案 6 :(得分:2)
你无法理解为什么区分大小写是一个好主意的原因是因为它不是。这只是C的奇怪怪癖之一(比如基于0的数组)现在看起来“正常”,因为很多语言都复制了C所做的。
C在标识符中使用区分大小写,但从语言设计的角度来看,这是一个奇怪的选择。大多数从头设计的语言(不考虑以任何方式“像C”)都是不区分大小写的。这包括Fortran,Cobol,Lisp以及几乎整个Algol语言系列(Pascal,Modula-2,Oberon,Ada等)
脚本语言很复杂。许多都是区分大小写的,因为Unix文件系统区分大小写,并且必须与它进行合理的交互。 C类在Unix环境中有机地成长起来,并且可能从那里获得了区分大小写的哲学。
答案 7 :(得分:1)
区分大小写的比较(从幼稚的角度来看,忽略了规范的等价)是微不足道的(简单地比较代码点),但是不区分大小写的比较没有明确定义,并且在所有情况下都非常复杂,并且规则是不可能的记得。实施它是可能的,但会无意中导致意外和令人惊讶的行为。顺便说一句,像Fortran和Basic这样的语言一直不区分大小写。