Как мы можем реализовать nullable тип в C#, если у нас не было этой функции в C#?
Вы можете обернуть собственный тип в структуру (быстрый пример, который даст вам представление, непроверенное, много возможностей для улучшения):
public struct NullableDouble {
public bool hasValue = false;
private double _value;
public double Value {
get {
if (hasValue)
return _value;
else
throw new Exception(...);
}
set {
hasValue = true;
_value = value;
}
}
}
Очевидно, вы не получите синтаксического сахара новых версий C #, т.е. необходимо использовать (см. комментарий Андреаса.) myNullableDouble.hasValue
вместо myNullableDouble == null
и т. д.
Вы не можете, не приложив бизнес-правила к существующие значения в типе данных. например. int.MinValue можно использовать как заполнитель, но что, если вам нужно это значение? Если у вас есть правило, в котором все значения положительны, оно может работать, но не как «допускающее значение NULL».
Вот мой чисто-gwt вариант:
class ThreeStateMachine extends FlowPanel{
// This is the main part - it will unset all the buttons in parent widget
// and then set only clicked one.
// One mutual handler works faster and is generally better for code reuse
private final ClickHandler toggleToThis = new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
for(Widget b: ThreeStateMachine.this.getChildren()){
((ToggleButton)b).setDown(false);
}
((ToggleButton)clickEvent.getSource()).setDown(true);
}
};
private ThreeStateMachine() { // Create out widget and populat it with buttons
super();
ToggleButton b = new ToggleButton("one");
b.setDown(true);
b.addClickHandler(toggleToThis);
this.add(b);
b = new ToggleButton("two");
b.addClickHandler(toggleToThis);
this.add(b);
b = new ToggleButton("three");
b.addClickHandler(toggleToThis);
this.add(b);
}
}
Конечно, потребуется css стили для gwt-Togista Button с вариантами (-up-hovering etc.)
-121--4632546-Да, статика обычно плохая - обычно, но в этом случае статика является наиболее безопасным кодом, который можно записать. Поскольку контекст безопасности связывает участника с текущим запущенным потоком, наиболее защищенный код будет обращаться к статике из потока как можно напрямую. Скрытие доступа за вводимым классом обертки дает злоумышленнику больше точек для атаки. Им не нужен был бы доступ к коду (который им было бы трудно изменить, если бы банка была подписана), им просто нужен способ переопределить конфигурацию, что можно сделать во время выполнения или ускользнуть часть XML на путь к классам. Даже при использовании вставки аннотаций в подписанном коде может быть заменен внешним XML. Такой XML может вводить выполняющуюся систему с незаконным участником. Наверное, поэтому Спринг делает что-то подобное в данном случае.
-121--557713-Значение NULL является универсальным типом. Без дженериков невозможно реализовать ничтожное подобное и на самом деле не имело бы смысла.