为什么有些types没有文字修饰符
例如,为什么长整型有一个文字修饰符,但短整型不? 我指的是这个网站上的以下问题: C#编译器编号文字
一般来说,C#似乎是一个非常好的devise和一致的语言。 可能有一个强有力的理由为某些types提供文字修饰符,但不是全部。 它是什么?
为什么long int有一个文字修饰符,但是short int不是?
问题是“为什么C#没有这个function?” 这个问题的答案总是一样的。 function缺省情况下未实现; C#没有这个function,因为没有人为客户devise,实现和发布function。
没有function不需要certificate。 相反,所有的function必须通过certificate他们的好处大于成本来certificate是正当的。 作为提出这个特征的人,你有责任描述为什么你认为这个特征是有价值的; 责任不在于解释为什么不是。
可能有一个强有力的理由为某些types提供文字修饰符,但不是全部。 它是什么?
现在这是一个更加可回答的问题。 现在的问题是“长久的文字后缀的理由是什么,为什么这也不是一个类似的文字后缀短的理由?
整数可以用于各种目的。 你可以使用它们作为算术数字 。 您可以将它们用作位标志的集合 。 你可以使用它们作为数组的索引。 还有更多的特殊用途。 但是我认为可以这样说,大多数时候,整数被用作算术数字。
绝大多数通过正常程序以整数执行的计算涉及的数字远远小于32位有符号整数的范围 – 大约为+/- 20亿。 当处理32位整数时,许多现代硬件是非常高效的。 因此,使数字的默认表示为有符号的32位整数是有意义的。 C#因此被devise为使涉及32位有符号整数的计算看起来完全正常; 当你说“x = x + 1”时,“1”被认为是一个有符号的32位整数,而且x也是好的,而且和的结果也是。
如果计算是整数,但不符合32位整数的范围呢? “长”64位整数是明智的下一步; 它们在很多硬件上也是有效率的,并且长远来说有一个范围应该可以满足几乎所有不需要大量组合的重型组合的需求。 因此,在源代码中使用某种方式来明确和简洁地指定这个字面量被视为一个长整数是有意义的。
互操作场景或整数用作位域的场景通常需要使用无符号整数。 同样,有一种方法可以清楚而简洁地指定这个字面意思是作为一个无符号整数。
所以总结一下,当你看到“1”的时候,绝大多数时候用户打算将它用作32位有符号整数。 接下来最有可能的情况是用户希望它是一个长整型或无符号整数或无符号长整数。 因此,每种情况都有简明的后缀。
因此,这个function是有道理的。
为什么这不是短裤的理由?
因为首先, 在每一个短合法的上下文中,使用整数文字已经是合法的了。 “短x = 1;” 是完全合法的; 编译器意识到这个整数适合于一个短的,并让你使用它。
其次, 在C#中 , 算术从来就不是简单的 。 算术可以用int,uint,longs和ulong来完成,但算术从来就不是简单的 。 Shorts推广到int,算术是用int整理的,因为就像我之前说过的那样, 绝大多数的算术计算都适合int 。 绝大多数不适合于短期。 短的算术在现代硬件上可能会比较慢 ,而这个硬件是针对整数进行优化的,短算术不占用更less的空间; 它将在芯片上以整数或长整数完成。
你需要一个“long”后缀来告诉编译器“这个algorithm需要很长时间才能完成”,但是一个“short”后缀不会告诉编译器“这个algorithm需要简短地完成”,因为这根本不是C#语言开始。
提供长后缀和未签名语法的原因不适用于短裤。 如果您认为该function具有令人瞩目的优势,请指出其优点。 没有一个好处来certificate其成本,该function将不会在C#中实现。
根据MSDN :
short x = 32767;
在前面的声明中,整型文字32767被隐式地从int转换为short。 如果整型文字不适合短存储位置,则会出现编译错误。
所以这是一个编译时的function。 short
没有后缀,因为它永远不会被需要。
相关的问题可能是:为什么long
, float
和decimal
有后缀?
简单的答案是i + 1
和i + 1L
可以产生不同的值,因此是不同的types。
但是,不存在“短算术”这样的东西, short
数值总是被转换成用于计算的int
。
正如Eric在评论中指出的那样,我的回答是没有意义的。 我认为说C#中无法表示短文字,以及无法在IL中表示短文字共有一个共同的原因(这个特性缺乏令人信服的理由)是比较正确的。VB.Net显然有一个短字面说明符,这是有趣的(为了向后兼容的VB语法?)在任何情况下,我留下了答案,因为一些信息可能是有趣的,即使推理是不正确的。
没有简短的文字,因为实际上没有任何方法可以将简短的文字加载到IL中,这是CLR使用的基础语言。 这是因为所有'short'types(小于int的任何东西)在加载到操作堆栈时被隐式扩展为int。 签名和未签名同样是一个操作问题,而不是实际存储在操作堆栈上的活动号码。 当你想在操作栈上存储一个数字到一个内存位置时,“short”types才会起作用,所以有IL操作转换成各种“short”types(尽pipe它实际上仍然把数字扩大回int在转换之后;它只是确保该值适合于存储到“短”types的字段中。)
长types有一个字面说明符,另一方面,由于它们在操作堆栈上的处理方式不同。 有一个单独的Ldc_I8指令用于加载常量长值。 也有Ldc_R4(因此为什么你需要'f'为浮点数)和Ldc_R8(C#select这个,因为它是默认的,如果你使用一个十进制数字而没有说明符)。十进制是一个特例,因为它实际上不是一个基本types; 它只是在C#中有一个内置的常量说明符“m”,它编译为构造函数调用。
至于为什么没有特殊的短操作(和相应的短文字),这很可能是因为大多数当前的CPU架构不能用小于32位的寄存器操作,所以在CPU级别上没有任何区别值得利用。 通过允许“简短”加载IL操作码,您可以节省代码大小(以IL的字节计),但代价是抖动的附加复杂性; 保存的代码空间可能不值得。
由于short
可以隐式转换为int
, long
, float
, double
或decimal
; 不需要文字修饰符。
考虑:
void method(int a) {} void method2() { short a = 4; method(a); // no problems }
您可能会注意到, char
和byte
也可能与文字修饰符相同,原因可能与此相同。
From To sbyte short, int, long, float, double, or decimal byte short, ushort, int, uint, long, ulong, float, double, or decimal short int, long, float, double, or decimal ushort int, uint, long, ulong, float, double, or decimal int long, float, double, or decimal uint long, ulong, float, double, or decimal long float, double, or decimal char ushort, int, uint, long, ulong, float, double, or decimal float double ulong float, double, or decimal
如果你声明一个短的字面大于Short.MaxValue
会发生编译错误,否则字面会变短。
“短期工作”的时间是存储在数据库中的值。
它们是正整数值,很less会超过10到20.(字节或sbyte会足够大,但是我认为有点过度杀死会让我不能后悔我的select,如果代码以稍微不同的方式被重用)
该字段用于让用户对表中的logging进行sorting。 此表格提供按“时间”(步骤一,步骤二,…)sorting的下拉列表或单选button列表。
作为C#的新手(在计算字节数的时候已经够老了,我记得它会更有效一些)。 我不会在价值观上做math。 我只是sorting他们(并交换logging之间)。 迄今唯一的math是“MaxInUse”+1(用于新logging),这是一个特例“++ MaxInUse”。 这是好的,因为缺less一个字面的意思是“s = s + 2”就必须是“s =(Int16)(s + 2)”。
现在我看到C#如何使用其他整数工作,我期望join现代世界并浪费字节,只是为了让编译器感到高兴。
但是,不应该让“编译器开心”在我们十大编程目标中排名第65位?
让编译器抱怨向任何INTEGERtypes添加整数“2”是一个好处吗? 它应该抱怨“s = 123456”,但这是一个不同的情况。
如果有人需要处理math和短裤,我build议你自己写文字。 (你需要多less?)
short s1= 1, s2 = 2, s123 = 123;
那么s = s + s2只是有点烦人(对于那些追随你的人来说是令人困惑的)。