2010-08-04 52 views
2

我正在使用.NET 3.5。我創建一個簡單的類,並希望確保處理後的類不能爲空或不應該是新太..我們是否可以擁有Class.Empty對象,就像我們在String.Empty中一樣。

因此,如果我們可以測試它這樣

Dim objClass as new Class() 

' do some processing with the class ' 
' and then.. check that if this object returned is not empty ' 

If (objClass = Class.Empty) Then 
//Do stuff 
Else 
//Do Other Stuff 
End If 

是有沒有辦法像String.Empty那樣創建這個空的字段?

+0

基本上我們那種發現 如果(objclass = Nothing或objClass =新的Class()),然後 結束時,如果 所以,我只是想縮短它只是空場或關鍵字,進入那個班。 – Mohit 2010-08-04 11:39:34

+0

我什至使用這個 公共共享只讀空作爲新類 但仍然沒有在這裏做的工作。這是在String.Empty中使用的相同類型的代碼。 http://msdn.microsoft.com/en-us/library/system.string.empty.aspx – Mohit 2010-08-04 11:48:56

+0

我假設objClass是類的實例或類的構造函數拋出異常。在構造函數調用和if語句之間也可以看到代碼。 – Manfred 2010-08-04 12:05:00

回答

1

但在你的例子中,這個類在技術上並不是空的。你已經使用默認的構造函數創建了一個Class的實例。誰知道,默認的構造函數可能已經初始化了超過10MB的字符串內容。你的代碼在技術上檢查的是,這個類在構造之後就等於它的默認狀態。

請參閱this以VB構造函數爲例,以及發生了什麼。

如果正確實施的CompareTo(......),你可以調用

If (objClass.CompareTo(new Class()) == 0) Then 
//Do stuff 
Else 
//Do Other Stuff 
End If 

但是,這似乎矯枉過正/昂貴,但只有它的工作方式。

另一種選擇是:(對不起基於C#的例子)

Interface IEmpyClass 
{ 
    bool IsEmptyClass{get;} 
} 

public class Class : IEmptyClass 
{ 
    public bool IsEmptyClass{get; private set;} 

    public Class() 
    { 
    IsEmptyClass = true; 
    } 

    public void DoSomething() 
    { 
     // Do something 
     IsEmptyClass = false; 
    } 
} 

你會負責執行的例子和更改屬性上課的時候狀態從「空」改變,但是這將是更快代碼等,並可以應付當clases有成員的構造函數。它可能只是

If (objClass.IsEmptyClass) Then 
//Do stuff 
Else 
//Do Other Stuff 
End If 
+0

是的保羅..你是對的我正在檢查類對象,如果它爲null或如果它處於默認狀態..基本上在處理中,我發送此對象到某個地方,並將其返回爲 objClass = ProcessClass(objClass ) 現在,我需要知道這個類對象現在是否包含數據。 – Mohit 2010-08-04 11:57:59

+0

請參閱上面的回答中的編輯,對不起,示例在C#中。你可以說這是由Arseny提到的「NULL對象」設計模式的一個版本 – 2010-08-04 12:03:06

+0

感謝Paul ...請參閱下面的答案...如果可能的話告訴我,如果有什麼更好的事情可以做到的話? – Mohit 2010-08-04 12:27:38

1

是的,它被稱爲null作爲參考類型,而new T()作爲值類型。

+0

但string.empty不爲空的參考類型 – Arseny 2010-08-04 11:44:02

+0

是的Arseny它不是空的..但我希望這個空字段同時驗證空和新對象...可以做到嗎?他們的代碼是我應該寫的嗎? – Mohit 2010-08-04 11:46:18

+4

也許你的意思是'default(T)'? – abatishchev 2010-08-04 11:48:11

0

檢查你可以叫上「班」,這需要一個類型變種(如.NET 4.0)或對象(舊版本)中的一個參數「空」的擴展方法。這個擴展方法的實現將檢查它是否爲null或者未初始化爲默認狀態並返回true或false。

+0

爲什麼這必須是擴展方法? – 2010-08-04 12:01:40

+0

這樣每個類都將使用空邏輯的通用實現使用接口來實現「空」方法。看看下面的代碼。 public static class ObjectExtensions {0,0,0,0}公共靜態布爾空(此對象obj)IEmpty otherObj = obj作爲IEmpty; if(otherObj == null) return true; else if(otherObj.IsEmpty) return true; 否則 返回false }} 現在,如果實現如果null或爲IsEmpty設置爲true,否則爲false IEmpty接口得到真正的任何一類。如果任何未實現IEmpty的類將始終爲真,因爲IsEmpty從未實現過。 – TheITGuy 2010-08-05 12:39:50

0

好的人謝謝你的幫助..我到目前爲止已經到達這裏了。現在工作很好。

Public Class cc 
    Private _obj As Boolean = False 
    Public _index As Integer = 0 

    Public ReadOnly Property IsEmpty() As Boolean 
     Get 
      Return _obj 
     End Get 
    End Property 

    Public Property Index() As Integer 
     Get 
      Return _index 
     End Get 
     Set(ByVal value As Integer) 
      _obj = False 
      _index = value //I need to set it to false for every property of that class. 
     End Set 
    End Property 

    Sub New() 
     _obj = True 
    End Sub 

    Public Shared Function Empty(ByVal obj As cc) As Boolean 
     If Not (obj Is Nothing) Then 
      If Not (obj.IsEmpty()) Then 
       Return False 
      End If 
     End If 
     Return True 
    End Function 
End Class 

在單獨的類:

Dim Sc As New cc() 
//'Sc=Nothing 
Sc.Index=1 

If (cc.Empty(Sc)) Then 
    Label1.Text = "Empty" 
Else 
    Label1.Text ="Not Empty" 
End If 
+1

請評論它的傢伙..如果有什麼問題在這裏..我想這可以做到沒有接口太。但無論如何,這不是一個擔心的事情.. – Mohit 2010-08-04 12:28:40

+0

它絕對看起來是一個可行的解決方案,如果它確實如你所願。 – 2010-08-04 12:37:04

+0

謝謝大家...... :) 問候。 Mohit Bhardwaj。 – Mohit 2010-08-04 12:49:58

0

要定義你必須建立在你的類的靜態只讀屬性的空字段。 如果您還需要在您的課堂上定義=運算符,則會遇到麻煩。例如,如果您的類只包含一個字符串類型的字段,您可以定義一個=運算符來檢查兩個實例的字符串字段是否相等。

相關問題