相关疑难解决方法(0)

一次捕获多个异常?

不鼓励简单地抓住System.Exception.相反,只应捕获"已知"异常.

现在,这有时会导致不必要的重复代码,例如:

try
{
    WebId = new Guid(queryString["web"]);
}
catch (FormatException)
{
    WebId = Guid.Empty;
}
catch (OverflowException)
{
    WebId = Guid.Empty;
}
Run Code Online (Sandbox Code Playgroud)

我想知道:有没有办法捕获两个异常并且只WebId = Guid.Empty调用一次呼叫?

给出的例子相当简单,因为它只是一个GUID.但是想象一下你多次修改一个对象的代码,如果其中一个操作以预期的方式失败,你想要"重置"它object.但是,如果出现意外异常,我仍然希望将其提高.

.net c# exception-handling exception

2015
推荐指数
24
解决办法
52万
查看次数

检查DBNull然后分配给变量的最有效方法是什么?

这个问题偶尔出现,但我没有看到一个满意的答案.

典型的模式是(row是DataRow):

 if (row["value"] != DBNull.Value)
 {
      someObject.Member = row["value"];
 }
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是哪个更有效率(我翻了条件):

  row["value"] == DBNull.Value; // Or
  row["value"] is DBNull; // Or
  row["value"].GetType() == typeof(DBNull) // Or... any suggestions?
Run Code Online (Sandbox Code Playgroud)

表明.GetType()应该更快,但编译器可能知道一些我不知道的技巧?

第二个问题,是否值得缓存row ["value"]的值,或者编译器是否优化了索引器?

例如:

  object valueHolder;
  if (DBNull.Value == (valueHolder = row["value"])) {}
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. row ["value"]存在.
  2. 我不知道列的列索引(因此列名称查找).
  3. 我具体要求检查DBNull然后分配(不是关于过早优化等).

我对几个场景进行了基准测试(时间以秒为单位,10,000,000次试验):

row["value"] == DBNull.Value: 00:00:01.5478995
row["value"] is DBNull: 00:00:01.6306578
row["value"].GetType() == typeof(DBNull): 00:00:02.0138757
Run Code Online (Sandbox Code Playgroud)

Object.ReferenceEquals与"=="具有相同的性能

最有趣的结果?如果您不匹配逐列的名称(例如,"值"而不是"值",则大约需要十倍的时间(对于字符串):

row["Value"] == DBNull.Value: 00:00:12.2792374
Run Code Online (Sandbox Code Playgroud)

故事的寓意似乎是,如果您无法通过索引查找列,请确保您提供给索引器的列名称与DataColumn的名称完全匹配.

缓存该值似乎也几乎快了两倍:

No Caching: 00:00:03.0996622
With Caching: 00:00:01.5659920
Run Code Online (Sandbox Code Playgroud)

所以最有效的方法 …

.net dbnull

150
推荐指数
9
解决办法
16万
查看次数

C#中'is'反射的性能特征是什么?

表明 'as'铸造比前缀铸造快得多,但是'是'反射怎么样?有多糟糕?可以想象,在Google上搜索"is"并不是非常有效.

c# reflection

20
推荐指数
3
解决办法
4304
查看次数

哪个好用:Object.GetType()== typeof(Type)或Object是Type?

我想知道哪个语句在Performance Point of View中是否有用

Object.GetType() == typeof(Type)
Run Code Online (Sandbox Code Playgroud)

要么

Object is Type
Run Code Online (Sandbox Code Playgroud)

c# performance types

18
推荐指数
1
解决办法
7153
查看次数

这个语法有什么作用?if(obj是SomeType obj2)

我开始看到这些陈述,我试图围绕这些陈述.

if (obj is SomeAuto car)
{
   //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,我们基本上将obj转换为变量汽车,这将是一个类型"SomeAuto"?

1)本声明的官方术语是什么?

2)如果我想将if语句更改为因特定原因有条件执行会发生什么?

例如,说SomeAuto是一个基类,我只想要某种类型的汽车,或者说我想要所有的SomeAuto,除了可能是一种特殊类型.

c#

5
推荐指数
1
解决办法
120
查看次数

如何安全地将bool转换为字符串?

我只有在对象是布尔值时才将对象转换为字符串.

我这样做了:

public object Convert(object oldType)
{
    bool value;
    if (oldType is bool)
    {
        value = (bool)oldType;
        if (value)
            return "1";
        else
            return "0";
    }
Run Code Online (Sandbox Code Playgroud)

安全吗?

c#

0
推荐指数
1
解决办法
133
查看次数