none
VB.net調用函式時資料存入hashtable 的問題 RRS feed

  • 問題

  • 我要實現的功能是一開始先執行以下的代碼

    1.

      entities.aiml2查詢流程(request.rawInput, Aimls)
                    xmlString = Aimls.Value
                    templateNode = Utils.AIMLTagHandler.getNode(xmlString)

    然後將代碼返回的資料存入hashtable裡   之後再次調用這個函式時 自動判別hashtable已有存入這筆資料

    能跑以下的代碼

    2.

      Dim query = From v In entities.aiml2that1匹配流程(thattemplate(request.user)) Where v.pattern = request.rawInput Select v.aiml
                    For Each aiml As String In query
                        If Not aiml = Nothing Then
                            thattemplate(request.user) = Nothing
                            Return aiml
                        Else
                        
                            entities.aiml2查詢流程(request.rawInput, Aimls)
                            xmlString = Aimls.Value
                            If Not xmlString = Nothing Then
                                Return xmlString
                            Else
                                '查詢通配符
                            End If
    
                        End If
                    Next
                    Dim xmlthatpattern As String = Aimls.Value

    但問題是 重新調用這個函式時 為什麼hashtable的資料都不見了 .... 

    程式執行下面這行 都直接判斷為nothing 我明明已經存進去hashtable了

      If Not thattemplate(request.user) = Nothing Then

    結果只能繼續執行 1處的代碼  跑不到2的地方 

    完整程式碼如下:

    Public Class Request 
    
     Private thattemplate As New Hashtable
            Private AIMLTagHandler As Utils.AIMLTagHandler
            Private templateNode As XmlNode
            Public Function templaters(ByVal request As Request) As String
                Dim Aimls As New ObjectParameter("aiml", GetType(String)) '輸出參數
                Dim xmlString As String = Nothing
    
                If Not thattemplate(request.user) = Nothing Then
     
                    Dim query = From v In entities.aiml2that1匹配流程(thattemplate(request.user)) Where v.pattern = request.rawInput Select v.aiml
                    For Each aiml As String In query
                        If Not aiml = Nothing Then
                            thattemplate(request.user) = Nothing
                            Return aiml
                        Else
                        
                            entities.aiml2查詢流程(request.rawInput, Aimls)
                            xmlString = Aimls.Value
                            If Not xmlString = Nothing Then
                                Return xmlString
                            Else
                                '查詢通配符
                            End If
    
                        End If
                    Next
                    Dim xmlthatpattern As String = Aimls.Value
                Else
                    entities.aiml2查詢流程(request.rawInput, Aimls)
                    xmlString = Aimls.Value
                    templateNode = Utils.AIMLTagHandler.getNode(xmlString)
                    thattemplate.Add(request.user, templateNode.InnerText)
                End If
    
                Return xmlString
            End Function
    
     End Class


    • 已編輯 向恩 2012年7月30日 上午 06:33
    2012年7月30日 上午 06:30

解答

  • (1)

    GC 的原則: 沒有任何變數的參考指向該物件.

    變數生命週期: 若變數是宣告在方法內, 則在該方法結束後, 該變數的生命週期也就結束.

    (2) 當你宣告一個新的 Request 類別執行個體時, 由於類別中的 thattemplate 欄位並非靜態, 因此是產生一個新的.

    (3) 看來你對類別, 執行個體 和物件變數的觀念並不清楚, 請研讀 [Visual Basic 中的物件和類別]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年8月3日 下午 01:47
    版主
  • 兄弟,

    我的圖已經說明 HashTable 很正常,很正常。

    檢查你所有會動到 HashTable 的 Code,一定有地方去把 HashTable 清除,才會讓 Count = 0,問題不在 HashTable 身上,OK.


    http://blog.kkbruce.net

    • 已標示為解答 向恩 2012年8月4日 上午 12:35
    2012年7月30日 上午 08:33

所有回覆

  • 1. 程式碼中文命名,和資料庫欄位中文一樣 XD;

    2. 

    entities.aiml2查詢流程(request.rawInput, Aimls)

    裡面寫了什麼程式碼?

    3. 

    Private thattemplate As New Hashtable
    If Not thattemplate(request.user) = Nothing Then
    你在 Class 內,一開始就馬上執行這兩行,當然給你 Nothing。


    http://blog.kkbruce.net

    2012年7月30日 上午 06:56
  • 這裡是ado.net 預存程序的程式碼

    entities.aiml2查詢流程(request.rawInput, Aimls)

    在class 內宣告hashtable 的物件 是因為離開這個class 後 

    這個class裡的資料都會被清掉的問題嗎? 

    2012年7月30日 上午 07:32
  • 我把你的程式碼簡化,執行起來一切正常。

    個人覺得,比較可以能 

    request.user

    確認一下,request.user 取值上是否有問題,所以造成 if 那一行一直有問題。


    http://blog.kkbruce.net

    2012年7月30日 上午 07:58
  • 附上我單步執行的流程圖

    出錯的情況就出在 返回值之後 我在去檢查這個class 的hashtable 物件  資料就跑掉了...

    2012年7月30日 上午 08:20
  •  我是在另一個class 的函式裡 調用這個class的函式時 才發生這種情況的

    以下是另一個class調用這個函式的code

    Public Function Chat2(ByVal request As Request) As Result  
                Dim result As New Result(Request.user, Me, Request)
             result.Templates.Add(request.templaters(request)) 
    
                          .......
    我這裡的寫法不曉得是不是也有影響

    2012年7月30日 上午 08:28
  • 兄弟,

    我的圖已經說明 HashTable 很正常,很正常。

    檢查你所有會動到 HashTable 的 Code,一定有地方去把 HashTable 清除,才會讓 Count = 0,問題不在 HashTable 身上,OK.


    http://blog.kkbruce.net

    • 已標示為解答 向恩 2012年8月4日 上午 12:35
    2012年7月30日 上午 08:33
  • 寫的人都不知道,我怎麼會知道有沒有影響!@_@

    http://blog.kkbruce.net

    2012年7月30日 上午 08:39
  • 我的疑惑是 物件導向設計中 在一個新的類中的方法去調用這個Request類的方法完之後

    Request的這個物件 會不會是自動被垃圾收集器給清掉了  導致Request這個類中 我宣告儲存hashtable的資料

    沒有存到呢?  我很認真的在檢查了一次  我的程式中並沒有跑到清除hashtable的程式碼  這是我調用Request類的Bot類代碼

    Namespace AIMLbot
    	''' <summary>
    	''' Encapsulates a bot. If no settings.xml file is found or referenced the bot will try to
    	''' default to safe settings.
    	''' </summary>
    	Public Class Bot
    
    
    
           Public Function Chat2(ByVal request As Request) As Result  '第三方的對話input 匹配輸出
                Dim result As New Result(Request.user, Me, Request   
                result.Templates.Add(request.templaters(request)) '取得AIML
                            .....
    


    2012年8月3日 下午 01:35
  • (1)

    GC 的原則: 沒有任何變數的參考指向該物件.

    變數生命週期: 若變數是宣告在方法內, 則在該方法結束後, 該變數的生命週期也就結束.

    (2) 當你宣告一個新的 Request 類別執行個體時, 由於類別中的 thattemplate 欄位並非靜態, 因此是產生一個新的.

    (3) 看來你對類別, 執行個體 和物件變數的觀念並不清楚, 請研讀 [Visual Basic 中的物件和類別]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年8月3日 下午 01:47
    版主
  • 我已經找到問題點了  我在視窗類那邊的按鈕事件 不斷地重新宣告了request物件 導致request內的變數沒有被儲存下來

    已經修正我的問題點了.

    2012年8月4日 上午 12:35