我是C#的新手,想要了解价值观是如何运作的。如果我查看一个正常的整数值,它有3个重要部分:类型,名称和值。
int testInt = 3;
| | |
Type Name Value
但是当我看到浮点值时,由于后缀F
,它让我感到困惑。
float testFloat = 3.0F;
| | | |
Type Name Value Type
现在有两种类型,如果没有F
后缀,则值为double。但是,当我可以用
double testDouble = 3.0D;
double
作为第一个单词应该足够了,不应该吗?带有后缀M的十进制值也是如此:
decimal testDecimal = 3.0M;
然后,当涉及到其他后缀时,它开始让我感到困惑:
ulong bigOne = 2985825802805280508UL;
之前我在测试中使用了ulong
,并且知道u
用于“无符号”,并且值为正常值的两倍。然后你再次得到U作为后缀,谷歌的文字就像谷歌说的那样。据我了解,“文字”是包含数字的值类型。但我不明白的是,即使没有后缀,为什么这个ulong也能正常工作?
ulong bigOne = 2985825802805280508;
然后我尝试了不同的东西来理解后缀的重要性
byte testLong = 12312UL;
这不起作用,因为字节(254)的值太高而且后缀不会将其转换为长变量。
为什么第一个单词(类型)不足以申报?第一个词应该足以告诉类型。最好的做法是始终为值赋予后缀吗?
答案 0 :(得分:24)
你在这里混淆了两件不同的事情:
float testFloat = 3.0F;
float
告诉编译器变量testFloat
将是浮点值。 F
告诉编译器文字 3.0
是float
。编译器需要先了解这两个部分,然后才能决定是否可以使用无转换或隐式转换将字面值分配给变量。
例如,您可以这样做:
float testFloat = 3;
那没关系。因为编译器会将3
视为一个文字整数,但它知道它可以将它分配给一个浮点而不会丢失精度(这是隐式转换)。但如果你这样做:
float testFloat = 3.0;
3.0
是一个文字双(因为它是没有后缀的默认值)并且它不能隐式地(即自动地)将double转换为float,因为float的精度较低。换句话说,信息可能会丢失。所以你要么告诉编译器它是一个文字浮点数:
float testFloat = 3.0f;
或者你告诉它你可以通过使用显式强制转换来降低精度:
float testFloat = (float)3.0;
答案 1 :(得分:10)
所有 1 表达式都需要解析为一个类型。因此表达式42
总是需要完全一种类型(恰好是int
)。如果您将其分配给int
变量并且int
分配给double
,则它不能是double
。使用表达式的上下文永远不会用 1 来确定它解析的类型。
这就是为什么数字文字可以有后缀;它是一种在该表达式中定义表达式的方式。
请注意,许多数字类型之间也存在隐式转换,因此如果您编写double d = 42;
,则表达式42
实际上是一个整数,但存在隐式正在对其执行的转换运算符将在赋值之前将其转换为double
。
1 这里有一些例外,例如lambdas,表达式的类型取决于它的使用方式和方法组;在真空中,这些表达没有类型。
答案 2 :(得分:2)
存在声明变量的其他方式,而不指定名称前面的类型:
var myNumber = 10;
在这种情况下,变量类型将由文字值定义。
如果使用类型(double | float | int | ...)而不是" var",编译器会将文字值转换为变量类型(如果可能的话)。
所以,我认为当你使用" var"时,后缀很重要。声明变量和文字值类型不是未使用后缀时的默认关联;
使用后缀太有用时还有另一个原因,例如您希望在表达式中进行隐式转换。