新的之后什么都没有,有可能吗?

时间:2013-01-22 16:20:19

标签: .net vb.net oop

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?

2 个答案:

答案 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 NothingFalse(就像你在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没有结晶。)