В вашем примере кода нет ничего отличного между этими двумя.Вы объявили тип как float
, так что независимо от того, будет ли f в конце или нет, это будет float.F просто игнорируется.
f вступает в игру при выполнении уравнений или назначении общих переменных, таких как использование ключевого слова var
.
Например:
var value = 0; // this is assigned as integer.
var value = 0.0f // this is assigned as float.
var value = 0.0; // this is assigned as double.
А вот пример расчета:
Примечание: Для пониманияПолные числа с плавающей запятой - это совершенно другой урок, но знание того, что вычисления выполняются по-разному в зависимости от типа, такого как целое число, число с плавающей запятой (f), двойное число (d) или десятичное число (m), в основном имеет значение .
Обратите внимание, что математика отличается от типа к типу.
class Program
{
static void Main(string[] args)
{
Console.WriteLine(1 / 3);
Console.WriteLine(1f / 3);
Console.WriteLine(1d / 3);
Console.WriteLine(1m / 3);
Console.ReadKey();
}
// OUTPUT
// 0
// 0.3333333
// 0.333333333333333
// 0.3333333333333333333333333333
}
Также обратите внимание, что когда вы устанавливаете тип в вычислении, ТОЛЬКО та часть вычисления получает результат этого типа.Рассмотрите этот пример смешанных типов в вычислениях:
class Program
{
static void Main(string[] args)
{
//float + integer
Console.WriteLine(1f / 3 + 1 / 3);
//double + integer
Console.WriteLine(1d / 3 + 1 / 3);
//double + float
Console.WriteLine(1d / 3 + 1 / 3f);
//decimal + integer
Console.WriteLine(1m / 3 + 1 / 3);
//decimal + decimal
Console.WriteLine(1m / 3 + 1 / 3m);
Console.ReadKey();
}
// OUTPUT
// 0.3333333
// 0.333333333333333
// 0.666666676600774
// 0.3333333333333333333333333333
// 0.6666666666666666666666666666
}
Обновлен, чтобы включать информацию, основанную на комментариях ниже
Чтобы обновить мой ответ на основе комментария нижеи компиляция и генерация объектов во время выполнения.
Все известные типы генерируются во время компиляции.Итак, в вашем вопросе, да, компилятор назначит 0 для float, поскольку он известен.
Все универсальные типы имеют метаданные, которые генерируются во время компиляции;поэтому компилятор может отвечать на вопросы относительно типов и помечать ошибки.Однако сам тип не генерируется до времени выполнения;и если этот тип является типом значения, или ссылочный тип меняет способ его создания.Рассмотрим эту сигнатуру:
public void MyMethod<T>(T myType)
Поскольку этот метод является универсальным, новый создается для каждого отдельного типа значения во время выполнения, только когда этот тип используется, и только один раз затип значения (одни и те же типы значений используют один и тот же сгенерированный тип).Посмотрите на приведенный ниже код.
MyMethod(12); // new type method built at runtime taking integer
MyMethod(12d); // new type method built at runtime taking double
MyMethod(12); // ** resuses already built type method taking integer
MyMethod(new Person()); // new type method built at runtime taking Person
MyMethod(new object()); // ** resuses type method built taking Person but uses object pointer.
Итак, вы можете видеть, что компилятор может помочь нам разрешить конфликты типов, но тип, который использует универсальные типы, не существует до времени выполнения;и важно знать, когда они существуют и как они используются между значениями и ссылочными типами.
Наконец, у нас есть dynamic
.Это никогда не разрешается во время компиляции и фактически игнорируется до времени выполнения.Вы можете делать все, что вы хотите здесь;это немного похоже на написание JavaScript;этот маленький мятежный дьявол.Рассмотрим этот код:
static void Main(string[] args)
{
dynamic value = 1;
Console.WriteLine(value);
int integer = value;
Console.WriteLine(integer);
value = "Hello World";
Console.WriteLine(value);
string text = value;
Console.WriteLine(text);
Console.ReadKey();
}
// OUTPUT
// 1
// 1
// Hello World
// Hello World
Обратите внимание, что здесь я не только беру неизвестный тип, но и назначаю его известному типу ... Затем я полностью изменяю этот тип на другой тип, а затем назначаю его другому типу.,Компилятору все равно, и все работает ... Проблема в том, что если я изменю его так, чтобы все не совпадало, я получил исключение времени выполнения вместо времени компиляции.В зависимости от того, как вы используете динамический, это может быть большой проблемой.
Надеюсь, все это поможет немного прояснить ситуацию.Помните;известные типы (время компиляции), обобщенные (метаданные времени компиляции, типы времени выполнения) и динамические (время выполнения).