2011-09-21 5 views
1

私はクラス内のSub New()がフィールドの欠落により早期に終了したかどうかを検出しようとしています。以下は、私のコードのサンプルは次のとおりです。VB.NET新しいクラスインスタンスが早期に終了したかどうかを確認する方法

Class Account 
    Public Sub New(ByVal Firstname As String, ByVal LastName As String, ByVal Username As String, ByVal Email As String, ByVal Password As String) 
     ' Check For Blank Fields 
     If Firstname = "" Or LastName = "" Or Username = "" Or Email = "" Or Password = "" Then 
      MessageBox.Show("Please Enter All Information Requested") 
      Exit Sub 
     End If 
     ' Set Public Variables Of Class 
     Firstname = Firstname 
     LastName = LastName 
     Username = Username 
     Email = Email 
     Password = Password 
    End Sub 

    Public Shared Sub OtherUse() 

    End Sub 
End Class 
' Create New Instance 
Dim Process As New Account(txtFirstName.Text, txtLastName.Text, txtUsername.Text, txtEmail.Text, txtPassword.Text) 
' HERE - How Can I Catch The Early Exit From The Instance Due To Potential Missing Fields? 

' Use Instance For Other Use 
Process.OtherUse() 
私は)(Process.OtherUseのさらなる処理を防ぐために、親フォームでクラスを終了サブをキャッチする方法を

答えて

4

あなたは間違った方法でこの問題に近づいています。入力を最初に検証し、入力が有効になったらNewを使用して新しいアカウントを作成します。

もう1つの方法は、有効であるかどうかをチェックせずにNewでデータを初期化し、別のクラスからメッセージボックスを表示するかどうかを知るためにそのクラスにIsValidメソッドを持たせることです。

アカウントクラスは、画面上にMessageBoxを表示するなどのUIの問題に責任を負うべきではありません。また、コンストラクタを「中止」することはできないため、コンストラクタは入力の検証ではなく、オブジェクトを作成する責任しか負いません。 Exit Subに電話しても、新しいオブジェクトへの参照があります。

1

第4の代替は、メタナイトで言及した3に加えて:

は、パラメータが有効でない場合に例外をスローコンストラクタを持っています。さておき、Orの使用として

、作業中には、論理的なエラーです:AndOrビット単位の演算操作です。論理演算、OrElseが必要です(AndAlsoもあります)。これらは、OrおよびAndと似ているかもしれません。この特定のケースでは、両方ともうまくいきます。しかし、実際には意味的にはかなり異なっていますが、ビット単位の操作は間違っています(このコードがコンパイルされているのは残念です。

+0

AndおよびOrは、VBで短絡しないブール演算子です。 –

+0

@Chrisしかし、正当な理由はありません。彼らはそのように定義されるべきではありません。 –

+0

ありがとう、私はOrElse演算子を探していたが、私の頭の上からそれを考えることができなかった、何らかの理由でAndOrを考えていた!それを変更しました:) – Chris

関連する問題