.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
IsFalse
(就像您在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