使用“如布尔?”而不是“对象的东西= ViewState [”hi“]”

时间:2010-04-20 13:42:59

标签: c#

所以我正在阅读旧代码(2.0),我遇到了这个:

object isReviewingValue = ViewState["IsReviewing"];

if (isReviewingValue is bool)
{
  return (bool)isReviewingValue;
}

我首先想到的是“as”关键字以避免不必要的

(bool)isReviewingValue;

但“as”仅适用于非值类型。没问题,我就这样做了:

bool? isReviewingValue= ViewState["IsReviewing"] as bool?;
if (isReviewingValue.HasValue)
{
  return isReviewingValue.Value;
}

问题是:除了看起来更具可读性之外,这其实更好吗?

编辑:

public Stopwatch AsRun()
{
  Stopwatch watch = new Stopwatch();

  watch.Start();
  for (Int32 loopCounter = 0; loopCounter < 10000; loopCounter++)
  {
    Object value = true;
    Boolean? test = value as Boolean?;
    if (test.HasValue)
    {
      Boolean something = test.Value;
    }
  }
  watch.Stop();

  return watch;
}

public Stopwatch ObjectIsRun()
{
  Stopwatch watch = new Stopwatch();

  watch.Start();
  for (Int32 loopCounter = 0; loopCounter < 10000; loopCounter++)
  {
    Object test = true;
    if (test is Boolean)
    {
      Boolean something = (Boolean)test;
    }
  }
  watch.Stop();

  return watch;
}

答案:事实证明,上述方法以测试方式运行,原始代码的速度提高了大约10倍。

6 个答案:

答案 0 :(得分:18)

coalesce运算符将为您删除一些代码。要回答你的问题,正如吉米明确指出的那样,两者之间的技术差异微不足道,因此请使用您认为更好的方法。就个人而言,我倾向于使用这种方法。 我可能会被认为有偏见......

private bool GetIsReviewing()
{
    return (ViewState["IsReviewing"] as bool?) ?? false;
}

答案 1 :(得分:5)

我认为第一个更具可读性,并且它也更快[大约10纳秒而不是100纳秒,根据我刚刚运行的测试;)(即不会以任何方式减慢程序速度)]

答案 2 :(得分:0)

实际上有点糟糕。如果“IsReviewing”中的值不是bool或null,则代码将抛出异常。原始版本将忽略它。

答案 3 :(得分:0)

第二个更好,因为如果ViewState [“IsReviewing”]不是bool,则关键字automaticaly将此设置为null。在第一个选项中,你自己实现它,你可以不这样做。结果有良好的容器。

答案 4 :(得分:0)

如果在第一个示例中您返回null,否则为什么不使用它:

bool? MyMethod()
{
  return ViewState["IsReviewing"] as bool?;
}

答案 5 :(得分:0)

您可以使用通用扩展方法方法来添加语法糖:

public static class TypecastExtensions {
   public static T CastOrDefault<T>(this object o) where T : struct  {
      return o as Nullable<T> ?? default(T);
   }

   public static T CastOrDefault<T>(this object o, T defaultValue) where T : struct {
      return o as Nullable<T> ?? defaultValue;
   }
}

用法:

bool isReviewingValue = ViewState["IsReviewing"].CastOrDefault<bool>();