По вопросу «что мне делать с этим» может быть много ответов.
Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .
Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.
Таким образом, вы можете избежать случаев NullReferenceException
, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X
в классе, а затем попытаетесь вызвать один из его методов, а X
имеет нулевое значение, то это приведет к NullReferenceException
:
public X { get; set; }
public void InvokeX()
{
X.DoSomething(); // if X value is null, you will get a NullReferenceException
}
Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:
//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant ()
{
Contract.Invariant ( X != null );
//...
}
По этой причине Код Контракт существует для приложений .NET.
В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .
ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .
Итак, @James и @Brian объяснили, что означает 3L. Но почему вы его используете?
В большинстве случаев это не имеет значения, но иногда вы можете использовать его для ускорения работы вашего кода и потреблять меньше памяти . Двойной («числовой») вектор использует 8 байтов на элемент. Целочисленный вектор использует только 4 байта на элемент. Для больших векторов это меньше потраченная впустую память, а для процессора - меньше, поэтому она обычно быстрее.
В большинстве случаев это применимо при работе с индексами. Вот пример, когда добавление 1 к целочисленному вектору превращает его в двойной вектор:
x <- 1:100
typeof(x) # integer
y <- x+1
typeof(y) # double, twice the memory size
object.size(y) # 840 bytes (on win64)
z <- x+1L
typeof(z) # still integer
object.size(z) # 440 bytes (on win64)
... но также замечает, что чрезмерная работа с целыми числами может быть опасной:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
... и, как отметил Г.Гавин, диапазон для целых чисел примерно от -2e9 до 2e9.
Следует заметить, что это относится к текущей версии R (2.13). R может изменить это в какой-то момент (64-битные целые числа будут милыми, что может позволить векторы длиной> 2e9). Чтобы быть в безопасности, вы должны использовать .Machine$integer.max
всякий раз, когда вам нужно максимальное целочисленное значение (и отрицать это для минимума).
Чтобы явно создать целочисленное значение для константы, вы можете вызвать функцию as.integer или просто использовать суффикс L.
L указывает целочисленный тип, а не двойной, чем стандартный числовой класс.
> str(1)
num 1
> str(1L)
int 1
Из секции констант определения языка R :
Мы можем использовать суффикс 'L', чтобы квалифицировать любое число с цель сделать его явным целым числом. Таким образом, «0x10L» создает целочисленное значение 16 из шестнадцатеричного представления. Константа 1e3L дает 1000 как целое число, а не числовое значение и эквивалентно 1000L. (Заметим, что «L» рассматривается как квалифицирующий термин 1e3, а не 3.) Если мы квалифицируем значение с «L», которое не является целым значением, например. 1e-3L, мы получаем предупреждение и создается числовое значение. Предупреждение также создается, если в номере есть ненужная десятичная точка, например. 1.L.
blockquote>