Буквальное длинное значение - PullRequest
0 голосов
/ 04 декабря 2018

Почему у нас здесь L в этом конце, я понимаю, что это буквальное значение, но если тип данных в любом случае длинный, тогда нужно ли это?

public const long l = 100000000L;

Будет ли это производить что-то другое?

public const long l = 100000000;

Ответы [ 4 ]

0 голосов
/ 04 декабря 2018

Насколько я знаю, это в основном изменяет объем памяти, выделенный по умолчанию.

Это также делает это при использовании неявного объявления типа, что компилятор знает, какой тип ссылки на значение выхочу использовать.(что может быть важно для вашего приложения)

enter image description here

enter image description here

0 голосов
/ 04 декабря 2018

Это объясняется здесь .Вероятно, основная цель состоит в том, чтобы различать long и int параметр перегруженных методов.

0 голосов
/ 04 декабря 2018

2.4.4.2 из spec состояний:

Тип целочисленного литерала определяется следующим образом:

• Если у литерала нет суффикса, он имеет первый из этих типов, в котором его значение может быть представлено: int, uint, long, ulong.

• Если к литералу добавляется суффикс U или u, он имеет первый из этих типов, в которомего значение может быть представлено: uint, ulong.

• Если к литералу добавляется L или l, он имеет первый из этих типов, в котором его значение может быть представлено: long, ulong.

• Если к литералу добавляются суффиксы UL, Ul, uL, ul, LU, Lu, lU или lu, он имеет тип ulong.

Таким образом, Lвывод («Если у литерала нет суффикса»), поэтому не требуется .Ваши два примера сделают то же самое (после компиляции).

Почему тогда вы можете использовать L?Ну, например, может быть:

public const long doesNotCompile = 3000000000 * 2;
public const long doesCompile = 3000000000L * 2;

В первой строке литерал (то есть 3000000000) представляет собой uint (в соответствии с 2.4.4.2), в то время как во второй строке это long (опять же из-за 2.4.4.2 - так как это явно указано).

Это означает, что компилятор позволит doesCompile компилировать, но не позволит doesNotCompile компилировать, Это потому, что 3000000000 * 2 слишком велик, чтобы поместиться в uint.

Но для базовых употреблений, таких как ваше, где это прямое задание - тогда да, оно не нужнов любом случае.И нет недостатков в том, чтобы не включать его.

0 голосов
/ 04 декабря 2018

Оба будут выводить один и тот же IL: вызов конструктора int64: int64(100000000).

...