Эти константы не имеют никакого отношения к знаку. Это имеет смысл, если вы считаете двойной как составной из трех частей: Sign, Exponent и Mantissa. Double.MIN_VALUE на самом деле является наименьшим значением, которое может предполагать Мантисса, когда показатель экспоненты находится в минимальном значении до того, как произойдет сброс нуля. Аналогично MAX_VALUE можно понимать как наибольшее значение, которое может быть допущено Мантиссой, когда показатель экспоненты находится на максимальном значении до того, как возникнет поток к бесконечности.
Более описательное имя для этих двух может быть Самый большой Абсолют (добавьте ненулевое значение для verbositiy) и значение Smallest Absolute (добавьте бесконечность для verbositiy).
Проверьте IEEE 754 (1985) стандарт для деталей. Существует пересмотренная версия (2008), но это только вводит больше форматов, которые даже не поддерживаются java (строго говоря, Java даже не поддерживает некоторые обязательные функции IEEE 754 1985, как и многие другие языки высокого уровня).
Так как ни один из кода, который Вы написали, не изменяет статическое поле после инициализации, нет никакой потребности ни в какой блокировке. Просто для замены строки с новым значением не будет нужна синхронизация также, если новое значение не будет зависеть от результатов чтения старого значения.
поля Static не являются единственными вещами, которые нуждаются в синхронизации, любая общая ссылка, которая могла быть изменена, уязвима для проблем синхронизации.
class Foo
{
private int count = 0;
public void TrySomething()
{
count++;
}
}
Вы могли бы предположить, что два потока, выполняющие метод TrySomething, будут прекрасны. Но нет.
Так, даже при том, что мы назвали количество ++ дважды, значение количества только что пошло от 0 до 1. Позволяет делают код ориентированным на многопотоковое исполнение:
class Foo
{
private int count = 0;
private readonly object sync = new object();
public void TrySomething()
{
lock(sync)
count++;
}
}
Теперь, когда Поток A получает прерванный Поток, B не может смешать с количеством, потому что это поразит оператор блокировки и затем блок, пока Поток A не выпустил синхронизацию.
Между прочим, существует альтернативный способ сделать постепенное увеличение Int32s и Int64s ориентированный на многопотоковое исполнение:
class Foo
{
private int count = 0;
public void TrySomething()
{
System.Threading.Interlocked.Increment(ref count);
}
}
Относительно второй части Вашего вопроса, я думаю, что просто пошел бы с тем, какой бы ни легче читать, любое различие в производительности, там будет незначительно. Ранняя оптимизация является корнем всего зла, и т.д.
Чтение или запись 32-разрядного или меньшего поля являются атомарной операцией в C#. Нет никакой потребности в блокировке в коде, который Вы представили, насколько я вижу.
Это смотрит на меня, что блокировка является ненужной в Вашем первом случае. Используя статический инициализатор для инициализации панели, как гарантируют, будет ориентирован на многопотоковое исполнение. Так как Вы только когда-либо читаете значение, нет никакой потребности заблокировать его. Если значение, никогда не собирающееся измениться, никогда не будет никакой конкуренцией, почему блокировка вообще?
Что касается Ваш, "который является лучшим" вопросом, они - то же, так как функциональный объем не используется ни для чего больше.
Если Вы просто пишете значение в указатель, Вы не должны блокировать, так как то действие является атомарным. Обычно необходимо заблокировать любое время, необходимо сделать транзакцию, включающую по крайней мере два атомарных действия (чтения или записи), которые зависят от состояния, не изменяющегося между началом и концом.
, Который сказал †“, я приезжаю из земли Java, где все чтения и записи переменных являются атомарными действиями. Другие ответы здесь предполагают, что.NET отличается.
По-моему, необходимо попытаться очень трудно не поместить статические переменные в положение, где они должны читаться/писаться в от различных потоков. Они - чрезвычайно общедоступные глобальные переменные в этом случае, и globals являются почти всегда Плохой Вещью.
Однако при помещении статической переменной в такое положение можно хотеть заблокировать во время чтения, на всякий случай - помнят, другой поток, возможно, напал в и изменил значение во время чтение, и если это делает, можно закончить с поврежденными данными. Чтения являются не обязательно атомарными операциями, если Вы не удостоверяетесь, что они путем блокировки. То же с записями - они - не всегда атомарные операции также.
Редактирование: Как Mark указал, поскольку определенные примитивы в чтениях C# являются всегда атомарными. Но будьте осторожны с другими типами данных.