В общей настольной реализации float
, стандарта IEEE 754 имеется только 24 значащих и битных (и 8 экспоненциальных битов). Это означает, что самое большое последовательное значение, которое может быть представлено без потери точности, равно 2 24 sup>, что приблизительно равно 1,6E7 (1,6 • 10 7 sup>). Например, нечетное значение выше этого порога не может быть точно представлено таким float
, так как младшее значащее 1-битное значение «падает» в представлении.
Ваше значение составляет приблизительно 1E9 (10 9 sup>), что в 60 раз больше. Это означает, что значение может быть около 30 от (после округления до ближайшего представимого значения). Обратите внимание, что биты экспоненты дают 2 exp sup> (без прыщей о смещении), а не 10 exp sup>.
С double
есть 53 бита, которых более чем достаточно для 1E9 (10 9 sup>).
Устройства записи .Net Framework Design Guidelines (потрясающая книга), который вышел в ноябре 2008, рекомендует рассмотреть использование var
, когда Тип очевиден и однозначен.
, С другой стороны, при использовании var
привел бы к неоднозначности при чтении кода, как Anton Gogolev указал, затем лучше не использовать его.
в книге (приложение A), они на самом деле дают этот пример:
var names = new List<string>(); // good usage of var
string source = GetSource();
var tokens = source.Split(' '); // ok; most developers know String.Split
var id = GetId(); // Probably not good; it's not clear what the type of id is
возможно, что, чтобы гарантировать, что удобочитаемость не подвергается прихотям непритязательных разработчиков, Ваша организация решила, что Вы не были достойны var
и запретили его.
Это - позор, хотя, это похоже на наличие хорошего инструмента в Вашем распоряжении, но хранение его в заблокированном стеклянном корпусе.
В большинстве случаев, с помощью var
для простых типов на самом деле помогает удобочитаемости, и мы не должны забывать, что нет также никакой потери производительности для использования var
.
У меня были случаи (когда я foreach через Таблицу. Набор строк), когда использование var привело к типу, являющемуся некоторого базового класса, а не фактического типа DataRow. Это - единственное время, я испытал затруднения из-за var.
От Отдел Отдела Дублирования Объявления (от Jeff Ужас Кодирования ):
"Я использую неявный ввод переменной каждый раз, когда и везде, где он делает мой код более кратким. Что-либо, что удаляет дублирование из нашего кода, должно настойчиво преследоваться - до и включая переключающиеся языки".
я сам думаю, что это стоящее сопровождения, но создать всестороннюю инструкцию по тому, когда использовать или не было бы излишество .
Неявная типизация является большой, и люди, которые утончаются, запрещают ее производительность повреждения и приглашают хрупкий код.
Это почти похоже на безопасный с точки зрения типов, проверенный в компиляторе утиный ввод, который невероятно полезен при рефакторинге. Например, если у меня будет метод, который возвращает Список, и я осуществляю рефакторинг его для возврата IEnumerable, то затем любые вызывающие стороны к тому методу, которые использовали ключевое слово var и только используют методы IEnumerable, будут в порядке. Если я явно указал, например, Список, то я должен пойти и изменить это на IEnumerable везде.
, Очевидно, если какая-либо из вызывающих сторон неявной типизации потребует методов Списка, то я получу ошибки компиляции, когда я создам, но если это так я, вероятно, не должен был изменять тип возврата так или иначе.
Это - действительно проблема удобочитаемости с Вашим кодом.
Мое персональное предпочтение состоит в том, чтобы только когда-либо использовать "var" для анонимных типов (действительно, если Вы хотите использовать анонимные типы вообще, то необходимо будет использовать var), и они главным образом прибывают из запросов LINQ. В этих случаях у Вас нет выбора, кроме как использовать var, если Ваш запрос проектирует в новое (неявный & анонимный) тип.
Однако C# 3.0 счастливо позволит Вам использовать var где угодно, Вам нравится, за пределами LINQ и анонимных типов, например:
var myint = 0;
var mystring = "";
совершенно допустимо, и myint, и mystring будет со строгим контролем типов выведенными значениями, используемыми для инициализации их. (таким образом myint является Система. Int32 и mystring является Система. Строка). Конечно, это довольно очевидно при рассмотрении значений, используемых для инициализации переменных, что вводит, они будут неявно введены к, однако, я думаю, что для удобочитаемости кода еще лучше, если вышеупомянутое было записано как:
int myint = 0;
string mystring = "";
, так как Вы видите сразу сразу точно, которые вводят те переменные.
Рассматривают этот несколько запутывающий сценарий:
var aaa = 0;
double bbb = 0;
Совершенно действительный код (если немного нетрадиционный), но в вышеупомянутом, я знаю, что bbb является двойным, несмотря на значение инициализации, кажущееся быть интервалом, но aaa определенно не будет двойным, а скорее интервал
Запрещение его полностью означает запрещать использование анонимных типов (которые становятся невероятно полезными, поскольку Вы используете LINQ больше).
Это - глупость, простая и простая, если кто-то не может формализовать серьезное основание никогда не использовать анонимные типы.
var
является последним, "как разметить Ваши фигурные скобки" / венгерская нотация/Camel, заключающая дебаты в корпус. Нет никакого правильного ответа, но существуют люди, которые сидят в экстремальных значениях.
Ваш друг просто неудачен, что они работают ниже одного из экстремистов.
Во-первых, как правило, кодирование стандартов должно быть обсуждено и согласовано командой, и обоснование позади них должно быть записано, так, чтобы любой мог знать, почему они там. Они не должны быть Святой Истиной от Одного Ведущего устройства.
114-секундный, это правило, вероятно, выравнивается по ширине, потому что код является чтением большего количества раз, чем записанный .var
ускоряет запись, но может замедлить чтение немного. Это, очевидно, не, правило поведения кода как "Всегда инициализирует переменные", потому что эти две альтернативы (пишущий var
и пишущий тип) имеют точно то же поведение. Таким образом, это не критическое правило. Я не запретил бы var
, я буду просто использовать, "Предпочитают..."
Я написал статью блога об этой теме несколько месяцев назад. Для меня я использую его каждый, где возможный и конкретно разрабатывают мои API на основе вывода типа. Основные причины я использую вывод типа,
http://blogs.msdn.com/jaredpar/archive/2008/09/09/when-to-use-type-inference.aspx
Конечно, это - ошибка. Это - потому что некоторые люди не понимают, что это на самом деле со строгим контролем типов, и нисколько как var в VB.
Не все корпоративные стандарты кодирования имеют смысл, я когда-то работал на компанию, которая хотела снабдить префиксом все имена классов название компании. Было крупное, переделывают, когда компания изменилась, это - имя.
В большинстве случаев, когда использование разумно (т.е. простой инициализатор типа, где тип и значение являются тем же), затем это прекрасно.
существуют несколько раз, когда неясно, что Вы повредили вещи путем изменения его - главным образом, когда инициализированный тип и (исходный) тип переменной не являются тем же, потому что:
В этих случаях, можно попасть в беду с любым разрешением типа - например:
В таких случаях, Вы изменяете значение кода и выполняете что-то другое. Это - затем плохая вещь.
Примеры:
Неявное преобразование:
static void Main() {
long x = 17;
Foo(x);
var y = 17;
Foo(y); // boom
}
static void Foo(long value)
{ Console.WriteLine(value); }
static void Foo(int value) {
throw new NotImplementedException(); }
сокрытие Метода:
static void Main() {
Foo x = new Bar();
x.Go();
var y = new Bar();
y.Go(); // boom
}
class Foo {
public void Go() { Console.WriteLine("Hi"); }
}
class Bar : Foo {
public new void Go() { throw new NotImplementedException(); }
}
и т.д.
var q = GetQValue();
действительно плохая вещь. Однако
var persistenceManager = ServiceLocator.Resolve<IPersistenceManager>();
прекрасно подходит мне.
концевая строка: используйте описательные имена идентификатора, и Вы проживете очень хорошо.
Как заметка на полях: Интересно, как они имеют дело с анонимными типами при отсутствии разрешения использовать var
ключевое слово. Или они не используют их в целом?
Удобочитаемость может повредить, если это неправильно используется. Однако полностью запрещение его является немного странным, поскольку Вашим коллегам будет нелегко использовать анонимные типы без него.