Nothing
之后 New
,是否可能?
Dim myObj As MyClass = Nothing
myObj = New MyClass(params)
If myObj Is Nothig Then
' is it possible?
End If
理论上是否有构造函数返回null(Nothing)对象?
说,在构造函数中设置Me = Nothing
?或者如果在构造函数中抛出异常,那么catch对象中会发生什么?
或者在最后一个构造函数行中,我将引用“Me”传递给方法,并且此方法将该引用设置为Nothing?
答案 0 :(得分:2)
不,New
-operator用于创建新的对象实例。即使此对象的所有字段都保留Nothing
,实例本身也不是Nothing
。
Visual Basic Language Specification:
11.10新表达式 New运算符用于创建类型的新实例。 ....
11.10.1对象创建表达式对象创建表达式用于创建类类型或结构类型的新实例。该 对象创建表达式的类型必须是类类型,a 结构类型,或具有New约束的类型参数,但不能 是一个MustInherit类。给定一个对象创建表达式 形式New T(A),其中T是类类型或结构类型,A是 可选参数列表,重载决议确定正确 T的构造函数来调用。具有New约束的类型参数是 被认为有一个无参数的构造函数。 如果没有 构造函数是可调用的,发生编译时错误;否则 表达式导致使用。创建新的T实例 选择的构造函数。如果没有参数,括号可能是 省略。分配实例的位置取决于是否 instance是类类型或值类型。类类型的新实例 在系统堆上创建,而值类型的新实例是 直接在堆栈上创建。对象创建表达式可以 可选地在构造函数之后指定成员初始值设定项的列表 参数。这些成员初始值设定项以关键字为前缀 使用,初始化程序列表被解释为好像它在 With语句的上下文。
答案 1 :(得分:1)
除非您使用On Error Resume Next
并且MyClass
构造函数中存在例外,否则您create a proxy that returns Nothing
on creation。
虽然确认代理的VB.NET版本“有效”,但我在创建后立即注意到myObj Is Nothing
是False
(就像你在OP中要求的那样),但是当你尝试时用它做任何其他事情,它看起来像Nothing
。一旦你尝试用它做更多的事情,它通常会变成Nothing
,而不是测试它的价值。 (在这个阶段,与C#相同。此时我应该开始一个新问题......)
但我发现存在一个“空”Try Catch
足以让VB.NET结晶Nothing
! (截至LinqPad的Roslyn C#6(Beta)版本,C#执行相同的操作。)
Sub Main()
Dim myObj = New MyFunnyType()
If myObj Is Nothing Then
Call "It IS Nothing".Dump
Else
' Comment out this Try and myObj will not be Nothing below.
Try
'Call myObj.ToString.Dump
Catch nr As NullReferenceException
Call "Maybe it was nothing?".Dump
Catch ex As Exception
Call ex.Message.Dump
End Try
Call myObj.Dump("Nil?")
If myObj Is Nothing Then
Call "Now it IS Nothing".Dump
Else
Call "It still is NOT Nothing!".Dump
End If
End If
End Sub
' Define other methods and classes here
Class MyFunnyProxyAttribute
Inherits ProxyAttribute
Public Overrides Function CreateInstance(ByVal ServerType As Type) As MarshalByRefObject
Return Nothing
End Function
End Class
<MyFunnyProxy> _
Class MyFunnyType
Inherits ContextBoundObject
Public Overrides Function ToString() As String
If Me IsNot Nothing Then
Return "Yes, I'm here!"
Else
Return "No, I'm really Nothing!"
End If
End Function
End Class
请注意,对ToString
的调用应该被注释掉:当它不是Nothing
时,结晶为'预期'。
(直到基于Roslyn C#6的LinqPad我在C#中没有看到类似的效果。即仅在ToString
中评论try
电话就足以让myObj
保持非null
。C#6 LinqPad(Beta)执行与VB.NET相同的操作,要求删除try
以使null
没有结晶。)