你必须考虑如果未实现部分类方法会发生什么。
那么,所有对该方法的调用都会被剥离,就好像它们从未发生过一样。
因此,对于一个使用out的方法,它将如下所示:
stream s;
GetStream(out s);
s.Write(...);
并且它会被编译,就像它说的一样:
stream s;
s.Write(...);
这段代码不被允许是因为变量s
没有初始化。变量在调用Write
方法之前被初始化的保证与调用GetStream
方法绑定在一起。
对于返回数据的方法也是一样的。由于如果你没有实现部分方法,整个方法调用将无法编译,因此你需要考虑在哪些情况下可以操作,以使调用方法的代码仍然有效。对于out
和返回值,可能会使调用代码无效或不完整,因此不允许使用。
至于ref
,那是有效的,因为变量的初始化已经由调用代码处理:
stream s = null;
GetStream(ref s); // may be stripped out
if (s != null)
s.Write(...);
因为与 ref 参数不同,out 参数必须在方法返回之前进行初始化。如果未实现部分类方法(这是一种有效的情况),那么它如何被初始化呢?
我猜是因为out
参数不需要初始化,而ref
参数需要。
如果在部分类中使用out
参数,C#如何验证参数是否已经被初始化呢?
out
参数意味着你希望从方法中获取一个值。如果该方法不存在,则无法提供该值。ref
参数,并在调用默认值之前手动初始化变量。部分类中分割的部分方法。需要一个方法来为OUT参数分配值。部分方法可以实现,也可以不实现。这意味着多个代码块正在尝试为OUT参数分配值。