.net 在一次新的尝试之后什么都没有,这可能吗?

.net 在一次新的尝试之后什么都没有,这可能吗?,.net,vb.net,oop,.net,Vb.net,Oop,新建后无任何内容,是否可能 Dim myObj As MyClass = Nothing myObj = New MyClass(params) If myObj Is Nothig Then ' is it possible? End If 从理论上讲,构造函数是否可能返回空(Nothing)对象 比如说,在构造函数中设置Me=Nothing?或者,如果在构造函数中抛出异常,那么在对象的捕获中会发生什么? 或者在最后一个构造函数行中,我通过引用“Me”传递给一个方法,而这个方法将该引用设

新建后无任何内容
,是否可能

Dim myObj As MyClass = Nothing
myObj = New MyClass(params)
If myObj Is Nothig Then
  ' is it possible?
End If
从理论上讲,构造函数是否可能返回空(Nothing)对象

比如说,在构造函数中设置
Me=Nothing
?或者,如果在构造函数中抛出异常,那么在对象的捕获中会发生什么? 或者在最后一个构造函数行中,我通过引用“Me”传递给一个方法,而这个方法将该引用设置为Nothing?

否,用于创建一个新的对象实例。即使此对象的所有字段都将保持为
Nothing
,实例本身也不是
Nothing

11.10新表达式新运算符用于创建类型的新实例。

11.10.1对象创建表达式对象创建表达式用于创建类类型或结构类型的新实例。这个 对象创建表达式的类型必须是类类型 结构类型,或具有新约束的类型参数,并且无法 是一个MustInherit类。给定 形成新的T(A),其中T是类类型或结构类型,A是 可选参数列表,重载解析确定正确的 要调用的T的构造函数。将创建具有新约束的类型参数 被认为有一个单一的、无参数的构造函数如果否 构造函数是可调用的,发生编译时错误;否则 表达式导致使用 所选构造函数。如果没有参数,括号可能是 省略。实例的分配位置取决于 实例是类类型或值类型。类类型的新实例 在系统堆上创建,同时创建值类型的新实例 直接在堆栈上创建。对象创建表达式可以 (可选)在构造函数后指定成员初始值设定项列表 论据。这些成员初始值设定项的前缀为关键字 使用,并且初始值设定项列表被解释为 With语句的上下文


除非您在出错时使用
,否则请继续下一步
,并且
MyClass
构造函数中存在异常,否则您将继续

在确认代理的VB.NET版本“有效”时,我注意到创建后立即
myObj Is Nothing
Is
False
(就像您在OP中要求的那样),但当您尝试使用它做任何其他事情时,它肯定看起来像
Nothing
。当你试着用它做更多的事情而不是测试它的值时,它通常会变成
Nothing
。(在这个阶段,C#也是一样。在这一点上,我真的应该开始一个新的问题…)

但是我发现,出现一个“空的”
Try-Catch
就足以让VB.NET具体化
Nothing
!(从LinqPad的Roslyn C#6(测试版)开始,C#执行相同的操作。)

Sub-Main()
Dim myObj=新的MyFunnyType()
如果myObj什么都不是
叫“这没什么”。倒垃圾
其他的
评论这一尝试,myObj将不会在下面什么都不是。
尝试
'调用myObj.ToString.Dump
捕获nr作为NullReferenceException
打电话给“也许没什么?”,甩了
特例
调用ex.Message.Dump
结束尝试
调用myObj.Dump(“Nil?”)
如果myObj什么都不是
叫“现在什么都不是”,倒垃圾
其他的
呼叫“它仍然不是什么!”转储
如果结束
如果结束
端接头
'在此处定义其他方法和类
类MyFunnyProxyAttribute
继承代理属性
Public将函数CreateInstance(ByVal ServerType作为类型)重写为MarshallByRefObject
一无所获
端函数
末级
_
类MyFunnyType
继承ContextBoundObject
Public将函数ToString()重写为字符串
如果我不是什么都不是
Return“是的,我在这里!”
其他的
Return“不,我真的什么都不是!”
如果结束
端函数
末级
注意对
ToString
的调用是要注释掉的:当它不是
Nothing时,
被具体化为“预期”


(直到基于Roslyn C#6的LinqPad出现之前,我在C#中没有看到类似的效果。也就是说,仅仅在
try
中注释掉
ToString
调用就足以使
myObj
保持非
null
。C#6 LinqPad(Beta)执行与VB.NET相同的操作,要求删除
try
,以使
null
不具体化。)

我认为MyClass构造函数会抛出异常(如果不处理,将停止执行),或者构造函数会返回,并将MyClass的新实例分配给myObj。否,我认为
new
永远不会返回@KenPespisa的
null
/
nothing
可能的重复:即使不太可能,VB.NET的行为也可能与C#不同,因此我不会将其称为重复(请注意,
nothing
null
都有很大的不同).是否可以在构造函数中设置Me=Nothing?或者,如果构造函数中抛出异常,会发生什么?或者,如果我通过引用“我”传递给一个方法,而这个方法将该引用设置为Nothing?那么,在异常之后,这是可能的,或者通过引用另一个方法来“取消”……我在回答中没有提到它,因为我没有找到用于确认它的引用,但是,是的,我认为我以前见过“有趣的”代理构造函数返回的代码
无任何内容
。找到了!只有从最上等的答案臭名昭著!顺便说一句,在C#和VB.NET中的“最奇怪的角落案例”答案中,泛型方法案例中的
实例
立即是
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