2017-09-27 60 views
1

好吧,所以我在大學時,我正在和我的老師說話,他說我的代碼不是好習慣。我有點困惑,爲什麼這樣的情況。我們基本上創建了一個for循環,但是他在循環之外聲明瞭他的for循環計數器,因爲即使我們以後從未在代碼中使用過這個變量,所以它被認爲是很好的做法,因此它看起來像是浪費內存。我們對代碼做了更多的工作,然後只是使用一個消息框,但想法是從字符串中獲取每個字符並用它做一些事情。他還使用Mid()函數檢索字符串中的字符,同時用索引調用該變量。下面是他將如何寫一行代碼的例子:Mid()用法和for循環 - 這是一個好習慣嗎?

Dim i As Integer = 0 
Dim justastring As String = "test" 
For i = 1 To justastring.Length Then 
    MsgBox(Mid(justastring, i, 1)) 
End For 

下面是我會怎麼寫我的代碼的例子:

Dim justastring As String = "test" 
For i = 0 To justastring.Length - 1 Then 
    MsgBox(justastring(i)) 
End For 

會有人能夠提供每種方法的優點和缺點爲什麼以及我是否應該繼續我的生活?

+0

個人而言,我更喜歡你的版本。但這只是個人喜好。順便說一句。 Mid()是VB6的剩餘部分,可以認爲是不好的做法。 –

+2

除了單獨的循環控制變量聲明之外,這將主要是一個意見問題。就我個人而言,我更傾向於比傳統的VB函數更有效的新NET字符串方法 – Plutonix

+0

看起來,您的老師仍舊陷入他以前的VB6習慣,您無法在循環中聲明變量並且無法直接從字符串訪問字符就像你在底部做的那樣。最終,他的風格只是一種「老」風格並不重要。但是我不明白他爲什麼說這是_bad practice_。而不得不說什麼@NicoSchertler說'Mid'和MsgBox是VB6的舊功能,不應該再使用。 – litelite

回答

0

另一種方法是,只在字符串上使用For Each

像這樣,不需要索引變量。

Dim justastring As String = "test" 
For Each c As Char In justastring 
    MsgBox(c) 
Next 
+1

不錯的解決方案,我們兩個都提高了哈哈。請記住這一點。 – PyroManiac

0

我建議按照自己的方式來做,因爲變量可能會消耗(儘管數量很少)的內存,但更重要的是,最好使用盡可能小的範圍來定義對象。在你的老師的代碼中,循環結束時變量i仍然可以訪問。在有些情況下,這是可取的,但通常情況下,如果您只在有限的代碼中使用變量,那麼您應該只在最小的塊中聲明它。

至於你的關於Mid函數的問題,你所知道的單個字符可以簡單地通過將字符串視爲一個字符數組來訪問。經過一些基本的基準測試後,使用Mid函數需要更長的時間來處理,而不僅僅是通過索引值訪問字符。在相對簡單的代碼中,這並沒有太大的區別,但如果你在一個循環中做了數百萬次,它就會產生巨大的變化。

還有其他因素需要考慮。比如代碼的可讀性和代碼的修改,但是有很多網站處理這類事情。


最後我建議改變你的視覺工作室一些編譯器選項

選項嚴格爲On

選項推斷爲關

顯式的選項,以在

這意味着寫作更多的代碼,但代碼更安全,你會犯的錯誤更少。看看here for an explanation

在你的代碼,這將意味着你必須寫

Dim justastring As String = "test" 
For i As Integer = 0 To justastring.Length - 1 Then 
    MsgBox(justastring(i)) 
End For 

這樣,你就知道,肯定i是一個整數。考慮以下...

Dim i 

你知道它是什麼類型嗎?我也不。

編譯器不知道它是什麼,因此它將它定義爲可以容納任何東西的對象類型。一個字符串,一個整數,一個列表..

請考慮這段代碼。

Dim i 
Dim x 
x = "ab" 
For i = x To endcount - 1 
    t = Mid(s, 999) 
Next 

編譯器會編譯它,但是當它被執行時,你會得到一個SystemArgumenException。在這種情況下,很容易發現什麼是錯誤的,但通常情況並非如此。而字符串中的數字可能是一個全新的蠕蟲罐。

希望這會有所幫助。

相關問題