3

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たとえば、コンストラクターで設定するには?または、コンストラクターで例外がスローされた場合、オブジェクトのキャッチで何が起こるでしょうか? または、最後のコンストラクター行で、参照によって「Me」をメソッドに渡し、このメソッドはその参照を Nothing に設定しますか?

4

2 に答える 2

4

いいえ、New-operatorは新しいオブジェクト インスタンスを作成するために使用されます。このオブジェクトのすべてのフィールドが残っていNothingたとしても、インスタンス自体はそうではありませんNothing

Visual Basic 言語仕様:

11.10 新しい式New 演算子は、型の新しいインスタンスを作成するために使用されます。....

11.10.1 オブジェクト作成式オブジェクト作成式は、クラス型または構造体型の新しいインスタンスを作成するために使用されます。オブジェクト作成式の型は、クラス型、構造体型、または New 制約を持つ型パラメーターである必要があり、MustInherit クラスにすることはできません。New T(A) という形式のオブジェクト作成式 (T はクラス型または構造体型、A はオプションの引数リスト) を指定すると、オーバーロードの解決によって、呼び出す T の正しいコンストラクターが決定されます。New 制約を持つ型パラメーターは、単一のパラメーターなしのコンストラクターを持つと見なされます。呼び出し可能なコンストラクターがない場合、コンパイル時エラーが発生します。それ以外の場合、式は選択されたコンストラクターを使用して T の新しいインスタンスを作成します。引数がない場合、括弧は省略できます。インスタンスがどこに割り当てられるかは、インスタンスがクラス型か値型かによって異なります。クラス型の新しいインスタンスはシステム ヒープ上に作成されますが、値型の新しいインスタンスはスタック上に直接作成されます。オブジェクト作成式では、オプションで、コンストラクター引数の後にメンバー初期化子のリストを指定できます。これらのメンバー初期化子にはキーワード With がプレフィックスとして付けられ、初期化子リストは With ステートメントのコンテキスト内にあるかのように解釈されます。

于 2013-01-22T16:24:24.287 に答える
1

を使用し、コンストラクターにOn Error Resume Next例外がある場合、または作成時に戻るプロキシを作成しない限り。MyClassNothing

プロキシのVB.NETバージョンが「機能する」ことを確認しているときに、作成直後(OPで要求したように)であることに気付きましたが、それ以外のことをしようとすると、確かmyObj Is Nothingに. そして、値をテストするよりもはるかに多くのことをしようとすると、通常はそうなります。(この段階では、C# と同じです。そして、この時点で、私は本当に新しい質問を開始する必要があります...)FalseNothingNothing

Try Catchしかし、VB.NET がNothing!を結晶化するには、「空」の存在で十分であることがわかりました。(LinqPad の Roslyn C# 6 (ベータ) バージョンの時点で、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で十分でした。C# 6 LinqPad (ベータ) は、VB.NET と同じように動作します。 、結晶化しないように除去する必要があります。)myObjnulltrynull

于 2013-01-23T09:54:15.367 に答える