Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 铸造和处理-IDataReader_C#_Vb.net_Idisposable - Fatal编程技术网

C# 铸造和处理-IDataReader

C# 铸造和处理-IDataReader,c#,vb.net,idisposable,C#,Vb.net,Idisposable,假设我创建了一个数据读取器 我在我的数据库类中有一个方法,它以这种方式创建它: db.ExecuteReaderIDb(sSQL) 我可以立即将其分配给using语句,并在最后处理它,但我希望使用HasRows属性,这意味着我希望转换为System.Data.Common.DbDataReader 我的问题涉及对System.Data.Common.DbDataReader执行即时转换 在本例中,如果我在using语句中进行转换,有几个问题: 1.它会创建两个对象吗? 2.如果适用,如果我调用

假设我创建了一个数据读取器

我在我的数据库类中有一个方法,它以这种方式创建它:

db.ExecuteReaderIDb(sSQL)
我可以立即将其分配给using语句,并在最后处理它,但我希望使用HasRows属性,这意味着我希望转换为System.Data.Common.DbDataReader

我的问题涉及对System.Data.Common.DbDataReader执行即时转换

在本例中,如果我在using语句中进行转换,有几个问题: 1.它会创建两个对象吗? 2.如果适用,如果我调用Dispose of the casted to,这两个对象都会被处理吗


否则,我是否需要2个using语句,一个返回IDataReader,另一个执行强制转换以确保所有内容都已正确清理。

强制转换不会创建新对象

Using reader = db.ExecuteReaderIDb(sSQL)
  Dim someOtherReader = CType(reader, System.Data.Common.DbDataReader)

  ' someOtherReader and reader point to the same object
  ' disposing reader will also dispose someOtherReader
End Using
你总是可以用正确的方式投球

Using reader = CType(db.ExecuteReaderIDb(sSQL), System.Data.Common.DbDataReader)
    ...
End Using

您有一个方法
ExecuteReaderIDb
,它返回什么?为什么不使用显示更多的代码,包括
?也许这样会更清楚,你通常在哪里看到由于强制转换而创建的两个对象?它返回一个IDataReadern强制转换没有创建新对象。请考虑将该函数的返回类型改为DbDataReader,IDataReader并不是非常有用。术语“CAST”和其他地方一样在编程中使用。你有没有听过“用不同的眼光看待事物”这句话?它基本上意味着以不同的方式看待事物。编程中的角色转换就是这样工作的。您仍在处理同一个对象,但通过不同类型的引用访问它。您可以使用类似于
的方法轻松地测试这一点,如果myThing是DirectCast(myThing,SomeType),那么
。如果该条件为
True
,则显然没有创建新对象。无需询问您可以测试什么。谢谢…我在这里找到了更多信息。。。我只是想确定它是属于IDisposable的,这在.NET中是一个非常特殊的东西…谢谢