Используя c #, как я могу получить выгоду от использования обнуляемых типов значений, когда у меня есть переменная типа объекта? - PullRequest
0 голосов
/ 04 февраля 2010

Используя c #, как я могу извлечь выгоду из использования типов значений Nullable, когда у меня есть переменная типа объекта?

Например, у меня есть метод Insert внутри класса, который принимает 4 аргумента:

public int Update(Int32 serial, object deliveryDate, object quantity, object shiftTime)
{
    ....
    ....
    ....
}

Как вы можете догадаться, этот метод вставляет новую запись в таблицу. Таблица (Table1) имеет 4 столбца: Serial int, DeliveryDate DateTime null, количество с плавающей запятой, не равное null, и ShiftTime smallint, нулевое

Теперь мой вопрос: как я могу воспользоваться преимуществами использования обнуляемых значений типов, а также как я могу преобразовать объект в желаемые типы, такие как DateTime?

Спасибо

Ответы [ 2 ]

5 голосов
/ 04 февраля 2010

Почему ваши параметры типа объекта в первую очередь? Почему не так:

public int Update(int serial, DateTime? deliveryDate,
                  double? quantity, short? shiftTime)

(Обратите внимание, что decimal может быть лучшим выбором, чем double - о чем подумать.)

Если вы, возможно, сможете изменить сигнатуру вашего метода, возможно, это правильный путь.

В противном случае, что вы действительно спрашиваете в своем вопросе? Если вы не можете изменить параметры, но аргументы должны быть типа DateTime (или ноль), double (или ноль) и short (или ноль), тогда вы можете просто привести их в их обнуляемые эквиваленты. Это распакует null в нулевое значение типа, а ненулевые значения в соответствующие ненулевые значения:

object x = 10;
int? y = (int?) x; // y = non-null value 10
x = null;
y = (int?) x; // y is null value of the Nullable<int> type

РЕДАКТИРОВАТЬ: Чтобы ответить на комментарий ...

Предположим, у вас есть текстовое поле для времени смены. Есть три варианта: он заполнен, но неуместно (например, "foo"), он пуст или он действителен. Вы бы сделали что-то вроде этого:

short? shiftTime = null;
string userInput = shiftTimeInput.Text;
if (userInput.Length > 0) // User has put *something* in
{
    short value;
    if (short.TryParse(userInput, out value))
    {
        shiftTime = value;
    }
    else
    {
        // Do whatever you need to in order to handle invalid
        // input.
    }
}
// Now shiftTime is either null if the user left it blank, or the right value
// Call the Update method passing in shiftTime.
2 голосов
/ 04 февраля 2010

Вы можете взглянуть на тип System.Nullable .Он имеет несколько ярлыков в C #:

public int Update(
    int serial, 
    DateTime? deliveryDate, 
    float? quantity, 
    short? shiftTime)

, что позволяет вам вызывать метод следующим образом:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...