Как лучше инициализировать обнуляемый тип из не обнуляемых? - PullRequest
1 голос
/ 15 декабря 2009

Мои объекты часто имеют свойства типа Nullable, которые используются в качестве параметров команд SQL.

Я инициализирую их следующим образом:

public int? Amount
{
    get
    {
        int i;
        int? amount = null;
        if (Int32.TryParse(Request["amount"], out i))
        {
            amount = i;
        }
        return amount;
    }
}

command.Parameters.Add("@amount").Value = (object)this.Amount ?? DbNull.Value;

Как мне переписать такой код инициализации, чтобы он стал короче или быстрее ?

Ответы [ 5 ]

8 голосов
/ 15 декабря 2009

Во-первых, не делай этого; вы молча отбрасываете тот факт, что вы не можете разобрать данные! В этом случае лучше создать исключение или обработать ожидаемый сценарий (например, null).

string val = Request["amount"];
return string.IsNullOrEmpty(val) ? (int?)null : (int?)int.Parse(val);
3 голосов
/ 15 декабря 2009

1) Короче! = Быстрее. Важно отметить.

2) Это будет работать так же хорошо:

public int? Amount
{
    get
    {
        int i;
        if (Int32.TryParse(Request["amount"], out i))
        {
            return i;
        }
        return null;
    }
}
0 голосов
/ 22 декабря 2012

Если ваш абонент не требует Nullable<T>, я бы предложил использовать такой тип:

struct MaybeValid<T>
{
    public bool IsValid;
    public T Value;
}

Это позволило бы:

Public MaybeValid<int> Amount
{
    Amount.Value = Int32.TryParse(out Amount.IsValid);
}

С Int32 дополнительные усилия по приведению типов, вероятно, не представляют особой проблемы, но для более крупных типов они могут быть более значительными.

0 голосов
/ 15 декабря 2009

Мне нравится немного переписать код Рэндольфа и Марка:

return Int32.TryParse(Request["amount"], out i)) ? (int?)i : (int?)null;
0 голосов
/ 15 декабря 2009
public int? Amount
{
    get
    {
         try 
         {
               return Int.Parse(Request["amount"]);
         }
          catch (exception e) 
         { 
               return null;
         }
     }
{

Производительность на самом деле не изменится, но если вы действительно хотите оптимизировать, то вам нужно подумать о том, что является наиболее распространенным, если значения почти всегда являются действительными целочисленными значениями, то мой подход, вероятно, будет лучшим, если нет, то ваш подход лучше.

...