Реализация Типа Nullable без nullable функции C#

Как мы можем реализовать nullable тип в C#, если у нас не было этой функции в C#?

9
задан Jon Seigel 7 April 2010 в 02:48
поделиться

4 ответа

Вы можете обернуть собственный тип в структуру (быстрый пример, который даст вам представление, непроверенное, много возможностей для улучшения):

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 и т. д. (см. комментарий Андреаса.)

5
ответ дан 4 December 2019 в 13:47
поделиться

Вы не можете, не приложив бизнес-правила к существующие значения в типе данных. например. int.MinValue можно использовать как заполнитель, но что, если вам нужно это значение? Если у вас есть правило, в котором все значения положительны, оно может работать, но не как «допускающее значение NULL».

0
ответ дан 4 December 2019 в 13:47
поделиться
10
ответ дан 4 December 2019 в 13:47
поделиться

Вот мой чисто-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 является универсальным типом. Без дженериков невозможно реализовать ничтожное подобное и на самом деле не имело бы смысла.

0
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: