2016-08-03 26 views
1

對你們所有人來說都是美好的一天。判別在VBA中沒有價值和雙倍爲0的double

我有一個關於VBA一個小問題,以及變量初始化:

我有一個類,財產

Public myVal As Double 

兩個腳本:

Dim myObject As new MyClass 
myObject.myClass = 0 
Debug.Print myObject.myClass 

Dim myObject As new MyClass 
Debug.Print myObject.myClass 

給出相同的輸出: 0.

有沒有什麼辦法可以告訴兩個零(Value has been ass已分配爲0 - 未分配任何值,因此默認情況下輸出爲0)分開?

方問題: 如果我聲明

Public myVal As Variant 

我沒有問題,我可以使用的IsEmpty(myClass.myVal)。

由於人們通常更喜歡使用Double over Variant,所以我認爲它有一個缺點。它是什麼?

感謝您的幫助:)

馬克西姆

+0

變通常是不可取的,因爲它使用額外的內存,可能需要指針解引用,並且可能攜帶導致運行時錯誤的意外類型。但是,它確實具有測試未初始化值的優點。編程中這類問題的一個典型方法是簡單地將數據初始化爲程序定義的「非法值」,如-1,然後檢查這種情況。但是,如果您的Double可以合法賦值,包括-1,這顯然不起作用! – Mikegrann

回答

3

缺點無關與製作變量DoubleVariant。它必須把你的課堂的內心暴露於任何想要在他們周圍肆虐的東西。

我建議創建實際屬性並使用它們來報告對象的狀態。這條線......

Public myVal As Double 

...不使myVal類的屬性。它給它一個公開的內部成員變量,並打破encapsulation。改爲實際屬性。這樣一來,你可以,如果需要的報告對象的狀態等屬性:

MyClass.cls:

Option Explicit 

Private mInit As Boolean 
Private mVal As Double 

Public Property Get DoubleValue() As Double 
    DoubleValue = mVal 
End Property 

Public Property Let DoubleValue(inValue As Double) 
    mInit = True 
    mVal = inValue 
End Property 

Public Property Get Initialized() As Boolean 
    Initialized = mInit 
End Property 

調用代碼:

Dim myObject As New MyClass 
myObject.DoubleValue = 0 
Debug.Print myObject.DoubleValue  '0 
Debug.Print myObject.Initialized  'True 

Dim myOtherObject As New MyClass 
Debug.Print myOtherObject.DoubleValue '0 
Debug.Print myOtherObject.Initialized 'False