当前位置: 首页 > 编程语言 > C#

C#中的分号分享

时间:2023-04-10 11:25:26 C#

C#中的分号为什么在C#中每一行的末尾都需要一个分号?为什么编译器不知道每一行的结束位置?行终止符将使您能够跨多行中断语句。另一方面,像VB这样的语言有一个换行符。我个人觉得用分号终止语句比用下划线继续更清楚。不,编译器不知道换行符用于语句终止,也不应该知道。如果你愿意,它允许你在多行中获取语句。看到:stringsql=@"SELECTfooFROMbarWHEREbaz=42";或者大方方法重载如何:相对,分号也允许多语句行:strings="";诠释我=0;这是几条语句?for(inti=0;i需要一个分号来消除歧义。所以除了内部标识符和关键字等,空格无关紧要。我个人同意具有独特的行终止符作用。它使编译器更容易弄清楚什么你想做的。与流行的看法相反,编译器在100%的情况下无法在没有帮助的情况下找到一条语句的结束位置和另一条语句的开始位置!一些边缘情况是模棱两可的,无论是单个语句还是跨越多行的多个语句。阅读VisualBasic技术总监PaulVick撰写的这篇文章,了解它为什么不像听起来那么简单。严格来说,这是真的:如果一个人能弄清楚语句在哪里结束,那么编译器也能。这还没有真正流行起来,并且很少有语言实现这种类型的任何东西。VB的下一个版本可能是第一个实现正确处理语句的语言,既不需要显式终止也不需要行继续[来源]。这将允许这样的代码:Dima=OneVeryLongExpression+AnotherLongExpressionDimb=2*a祝我们好运。另一方面,这确实使解析更加困难,并可能导致错误消息(参见Haskell)。也就是说,C#使用类C语法的原因可能更多是出于营销原因而不是其他原因:人们已经熟悉C、C++和Java等语言。无需引入其他语法。这有多种原因,但它显然继承了这些语言的许多弱点。使用分号的另一个很好的理由是隔离语法错误。分号允许编译器在出现语法错误时回到正轨,因此像a=b+c=d这样的东西可以消除a=b+c;的歧义。=d在第二个语句中有错误或a=b+;c=d与第一条语句中的错误。如果没有分号,就无法判断出现语法错误时语句在哪里结束。缺少括号可能意味着程序的整个后半部分可能被视为一个巨大的语法错误,而不是逐行检查语法。它对另一种方式也有帮助——如果你打算写a=b;c=d;但是弄错了,漏掉了“c”,然后没有了一半,它看起来像a=b=d是有效的,你有一个正在运行的程序,带有不好的和难以发现的错误,所以分号通常可以帮助捕获错误,否则看起来像有效的语法。另外,我同意大家关于可读性的看法。出于这个原因,我不喜欢没有某种语句终止符的语言。我已经考虑了一段时间,如果我能猜出语言设计者的动机:C#显然有分号,因为它来自C的传统。我最近一直在重新阅读K&R的书,很明显DennisRitchie真的不想强迫程序员按照他认为最好的方式编写代码。这本书充满了评论,“虽然我们在这个问题上并不教条,但似乎很少使用goto语句”,并且在关于功能的部分中他们提到他们选择了一个,这无关紧要您选择的一个,只要保持一致即可。因此,使用显式语句终止符允许程序员根据需要格式化他们的代码。不管是好是坏,它似乎与C最初的设计方式一致:按自己的方式做事。可以办到。你指的是“分号插入”。JavaScript已经取得了很大的成功,它不能在C#中使用的原因取决于它的设计者。也许他们不知道,或者担心它会引起程序员的混淆。有关在JavaScript中插入分号的更多详细信息,请参阅指定JavaScript的ECMA脚本标准262。我引用第22页(在PDF中,第34页):但是,前面的规则有一个更重要的条件:如果分号将被解析为空语句,或者分号是否将是for语句头两者之一分号永远不会自动插入(第12.6.3节)。[…]规范文档甚至包括示例!我认为必须在每个语句后使用分号的最大原因是熟悉C、C++和/或Java的程序员很熟悉。C#从这些语言中继承了许多语法选择,而不是简单地命名它们。以分号结尾的语句只是从这些语言中借用的众多句法选择之一。您可以确切地说要求分号来终止语句是多余的。从C#语言中删除分号在技术上是可行的,但仍然使用它。问题在于它为人类的误解留下了空间。我认为分号的必要性是为了人类而不是编译器歧义。如果没有某种形式的陈述分界,人类很难解释这样的想法:inti=someFlag?12:5intj=i+3编译器应该能够很好地处理这个问题,但对于人类来说,下面看起来好多了inti=someFlag?12:5;整数j=i+3;分号是C语言的残余,当时冒号程序员通常希望通过在一行中组合语句来节省空间。即inti;for(i=0;i对编译器也有帮助,它还不够聪明,无法简单地推断出语句的结束。几乎在所有情况下,出于可读性的原因,大多数c#开发人员不赞成将语句组合在一行中。上面通常这样写:inti;for(i=0;i很冗长!对于现代语言,编译器可以很容易地开发来推断语句的结束。C#可以换成另一种不使用的语言除了空格和缩进制表符之外不必要的分隔符,即intifori=0i<10i++printf"helloworld.n"printf"%dinstance.n"i这无疑节省了一些输入并且看起来更干净。代码变得更具可读性如果您使用缩进而不是空格。如果我们允许类型被推断,我们可以做得更好,并为它做特殊情况的阅读(for[value]=[initialvalue]to[finalvalue:fori=1to10//iisinferredtobeanintegerprintf"helloworld.n"printf"%dinstance.n"i现在,它开始看起来像f#和f#,在某些方面,几乎像c#没有不必要的标点符号。但是f#缺少很多附加功能(比如特殊的.NET语言构造、代码完成和良好的智能感知)。因此,不幸的是,最终f#可以比c#或VB.NET用更多的工作来实现。就个人而言,换句话说,我的工作需要VB.NET,我会而不是必须处理分号。C#是一种过时的语言。Linq允许我减少我必须编写的代码行数。不过,如果我有时间,我会写一个C#版本有很多功能的f#.以上就是C#学习教程:C#中的分号的全部内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注---本文采集自互联网,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: