c#,接口,分配

c#,接口,分配,c#,variable-assignment,idatareader,C#,Variable Assignment,Idatareader,我有个问题。接口不包含任何定义。接口无法实例化。这个代码怎么可能有效 IDataReader reader = cmd.ExecuteReader() cmdExecuteReader返回内存中具有值的对象。读卡器是接口。如何将对象指定给接口?接口不只是一个内部没有方法定义的契约吗?ExecuteReader不返回对象-它返回对某种类型的对象的引用,该对象实现了IDataReader(当然也可以为null) 其思想是调用方/客户机不需要知道实现类,只需要知道它实现了接口。当客户端调用诸如rea

我有个问题。接口不包含任何定义。接口无法实例化。这个代码怎么可能有效

IDataReader reader = cmd.ExecuteReader()

cmdExecuteReader返回内存中具有值的对象。读卡器是接口。如何将对象指定给接口?接口不只是一个内部没有方法定义的契约吗?

ExecuteReader
不返回对象-它返回对某种类型的对象的引用,该对象实现了
IDataReader
(当然也可以为null)

其思想是调用方/客户机不需要知道实现类,只需要知道它实现了接口。当客户端调用诸如
reader.Next()
之类的方法时,该方法将根据
reader
的值所引用的对象的执行时间类型使用实现

将引用值指定给变量不会更改该引用所引用的对象的类型。例如:

string text = "hello";
object o = text;
现在
o
text
具有相同的值-对相同字符串的引用。如果你打电话:

Type t = o.GetType();

它仍将返回对表示
System.String
Type
对象的引用,因为
o
的值引用的是
String
对象;用于访问对象的变量类型不会更改对象的执行时间类型。

虽然不能实例化接口,但可以实例化实现接口的对象。然后可以通过接口类型引用该对象。这就是上面的代码所做的。

cmd.ExecuteReader()
不创建并返回
IDataReader
实例;它返回一个恰好实现
IDataReader
(也可以实现任意数量的其他接口)的对象。因此,可以为声明为接口类型的变量或字段赋值,但不能创建接口类型的实例