不鼓励简单地抓住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.但是,如果出现意外异常,我仍然希望将其提高.
这个问题偶尔出现,但我没有看到一个满意的答案.
典型的模式是(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)
笔记:
我对几个场景进行了基准测试(时间以秒为单位,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)
所以最有效的方法 …
它表明 'as'铸造比前缀铸造快得多,但是'是'反射怎么样?有多糟糕?可以想象,在Google上搜索"is"并不是非常有效.
我想知道哪个语句在Performance Point of View中是否有用
Object.GetType() == typeof(Type)
Run Code Online (Sandbox Code Playgroud)
要么
Object is Type
Run Code Online (Sandbox Code Playgroud) 我开始看到这些陈述,我试图围绕这些陈述.
if (obj is SomeAuto car)
{
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,我们基本上将obj转换为变量汽车,这将是一个类型"SomeAuto"?
1)本声明的官方术语是什么?
2)如果我想将if语句更改为因特定原因有条件执行会发生什么?
例如,说SomeAuto是一个基类,我只想要某种类型的汽车,或者说我想要所有的SomeAuto,除了可能是一种特殊类型.
我只有在对象是布尔值时才将对象转换为字符串.
我这样做了:
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)
安全吗?