Также:
observeEvent(c(
input$spec_button,
mainplot.click$click
), { ... } )
Есть ли способ сделать MinValue / MaxValue const вместо readonly?
blockquote>No. Однако BCL тоже этого не делает. Например, DateTime.MinValue -
static readonly
. Ваш текущий подход дляMinValue
иMaxValue
подходит.Что касается ваших двух других вопросов - удобство использования и самого шаблона.
Лично я бы избегал автоматических преобразований (неявные операторы преобразования) для типа «температуры», подобного этому. Температура не является целочисленным значением (на самом деле, если вы были , чтобы сделать это, я бы сказал, что она должна быть плавающей точкой - 93,2 градуса C. Совершенно верно.) Обработка температуры как целого , и особенно нецелесообразно рассматривать любое целочисленное значение, поскольку температура кажется неуместной и потенциальной причиной ошибок.
Я нахожу, что структуры с неявным преобразованием часто вызывают больше проблем удобства использования, чем они адресуют. Принуждение пользователя к записи:
Celsius c = new Celcius(41);
Не намного сложнее, чем неявное преобразование из целого числа. Однако это намного яснее.
DebuggerDisplay
полезен. Я бы добавил единицы измерений «{m_value} C», чтобы вы могли сразу увидеть тип.
В зависимости от использования цели вы также можете иметь общую структуру преобразования в / из базовых блоков в дополнение к конкретному классы. То есть хранить значения в единицах СИ, но иметь возможность отображать / редактировать на основе культуры (градусы C, км, кг) против (градусов F, mi, lb).
Вы также можете проверить измерение F # единицы для additioanl идей ( http://msdn.microsoft.com/en-us/library/dd233243.aspx ) - обратите внимание, что это компиляция времени.
Я думаю, что с точки зрения удобства использования я бы выбрал тип Temperature
, а не Celsius
. Celsius
- это всего лишь единица измерения, а Temperature
будет представлять собой фактическое измерение. Тогда ваш тип может поддерживать несколько единиц, таких как Цельсия, Фаренгейта и Кельвина. Я бы также выбрал десятичное значение в качестве резервного хранилища.
Что-то в этих строках:
public struct Temperature
{
private decimal m_value;
private const decimal CelsiusToKelvinOffset = 273.15m;
public static readonly Temperature MinValue = Temperature.FromKelvin(0);
public static readonly Temperature MaxValue = Temperature.FromKelvin(Decimal.MaxValue);
public decimal Celsius
{
get { return m_value - CelsiusToKelvinOffset; }
}
public decimal Kelvin
{
get { return m_value; }
}
private Temperature(decimal temp)
{
if (temp < Temperature.MinValue.Kelvin)
throw new ArgumentOutOfRangeException("temp", "Value {0} is less than Temperature.MinValue ({1})", temp, Temperature.MinValue);
if (temp > Temperature.MaxValue.Kelvin)
throw new ArgumentOutOfRangeException("temp", "Value {0} is greater than Temperature.MaxValue ({1})", temp, Temperature.MaxValue);
m_value = temp;
}
public static Temperature FromKelvin(decimal temp)
{
return new Temperature(temp);
}
public static Temperature FromCelsius(decimal temp)
{
return new Temperature(temp + CelsiusToKelvinOffset);
}
....
}
Я бы избегал неявного преобразования, поскольку Рид утверждает, что он делает вещи менее очевидными. Однако я бы перегрузил операторы (& lt ;,>, ==, +, -, *, /), поскольку в этом случае было бы целесообразно выполнять такие операции. И кто знает, в какой-то будущей версии .net мы могли бы даже указывать ограничения оператора и, наконец, могли бы писать более многократно используемые структуры данных (представьте себе класс статистики, который может вычислять статистику для любого типа, который поддерживает +, -, *, /).
Temperature.ToString("C")
).
– Alexei Levenkov
8 November 2011 в 05:04
Я думаю, что это идеальный шаблон реализации для типов значений.
. В любом случае, поскольку Celsius
неявно конвертируется в / из int
, вы можете определить такие границы:
public const int MinValue = -273;
public const int MaxValue = int.MaxValue;
Однако в действительности нет никакой практической разницы между static readonly
и const
.
int
в этом случае. – JonH 7 November 2011 в 20:57