首页 > 编程 > .NET > 正文

Visual Basic 6/VBScript 與Visual Basic.NET 的比較(上)

2024-07-10 13:02:28
字体:
来源:转载
供稿:网友
因為未來微軟 .net 平台的執行環境與現今大大的不同,未來 class 可以跨語言地繼承,也就是 vb 可以繼承 c# 的 class 等等。原始程式碼編譯成 managed code,平台提供執行時期將 il 編譯成執行碼等等。在再讓 vb 必須要脫胎換骨。所以 visual basic.net 將會有絕大的改版,與以往的六個版本截然不同。

visual basic.net 與以往的版本實在差別太多,在這裡無法一一詳述。僅列舉明顯且重用的部分。 < visual basic 6 與 visual basic.net 差異的部分 >以下先介紹 vb6/visual basic.net 都有的部分,但 visual basic.net 改變使用方式或關鍵字更新。內容有
  • 不再使用 set 和 let
  • class 的屬性撰寫
  • subroutines 和 functions
  • 完整的資料型態範圍
  • 宣告變數、常數和陣列
  • 變數範圍(variable scope)
  • 結構化例外處理(structured exception handling)
  • 使用正確的資料型別
  • 使用者自訂資料結構(structure)
不再使用 set 和 let 不再使用 set 和 let 關鍵字,除非在 class 檔案中設定屬性。因為在 visual basic.net 中不再使用預設(default)屬性和方法,所以不需要靠他們來辨別,你在使用物件的方法與屬性時,若要設定變數值,一定要指明清楚。也就是原先在 vb6 若要設定變數 obj 內容為 objthis,必須要
set obj=objthis
而接收預設屬性則可以
att=objthis 以及 att=objthis.defaultatt 兩種寫法
所以若 objthis 物件有一個預設屬性叫 defaultatt,若不寫 set 會不清楚到底要存取 objthis 物件的參照還是 objthis.defaultatt 這個預設屬性。但到了 visual basic.net,若你要讀取 defaultatt,因為沒有預設屬性的使用方式,所以只有(且一定要)以 objthis.defaultatt 這種寫法來讀取 defaultatt 屬性。
所以當你使用下列程式碼時
obj=objthis
那一定是要 objthis 這個物件參照,而不會模擬兩可。而這種寫法讓 visual basic.net 的語法與 javascript 和 c# 的語法更為接近。
在 visual basic.net 中 class 的屬性撰寫
在 vb 6 要撰寫一個物件的屬性會利用以下的程式碼,其中 property get 是用來讓使用者讀取屬性,而 property set/let 則是用來設定屬性,至於是要使用 set 還是 let 則要看賦予的屬性是物件還是一般的變數型別。
private m_myproperty as variant


public property get myproperty() as variant
if isobject(m_myproperty)
then set myproperty = m_myproperty
else
myproperty = m_myproperty
end if
end property


public property set myproperty(byval vnewvalue as variant)
set m_myproperty = vnewvalue
end property


public property let myproperty(byval vnewvalue as variant)
m_myproperty = vnewvalue
end property
但在 visual basic.net 的程式碼要改成
private m_myproperty as string
public property myproperty() as string
get
myproperty = m_myproperty
end get


set
m_myproperty = value
end set
end property

這個語法也是與 c# 的語法更為相似。

另外在 visual basic.net 你必須要明確的利用 readonly 或 writeonly 關鍵字來設定屬性是否為唯讀或唯寫,所以程式碼為
public readonly property myproperty() as string
get
myproperty = m_myproperty
end get
end property
或是

public writeonly property myproperty() as string
set
m_myproperty = value
end se
t end property

subroutines 和 functionsvisual basic.net 在呼叫與使用 subroutine 和 function 上也有許多改變

■ 方法呼叫的語法改變 --所有的方法、subroutine 和 function 的呼叫都需要加上小括號,在以往若呼叫 function 但不需要 function 的回傳值﹔或 function 不需要傳入參數,可以使用不加小括號的方式,或呼叫 subroutine 不使用小括號等等是可以的,但在 visual basic.net 都不再允許。 所以在 vb 6 的
dattime=now '呼叫系統的 now() 函數

dosomething "par1",int2,"par3" '呼叫副函數 dosomething,傳入三個參數 等方式要改成 dattime=now()

dosomething("par1",int2,"par3")
所以在 asp+ 要注意
response.write "某些文字"
也要改成
response.write("某些文字")
■ 參數傳遞預設以 byval --在 vb6 參數傳遞若不設定,預設是以 byref 也就是傳變數位址給副函數的方式,但在 visual basic.net 改成預設以 byval 將變數的值傳遞給副函數。
但要注意的是對 classes 和 interfaces 以及 array 和 string 的傳遞預設仍然是採用 byref

■ 使用 return 語法 --visual basic.net 不支援 vb6 為了向前相容(自 basic 以來就存在 j )而使用的 gosub 語法。現在 return 語法專門用來在 function 或 sub 內還回控制權到呼叫者端。

完整的資料型態範圍
在 vbscript 只支援 variant 資料型別,而在 visual basic.net 所有的東西都是物件(object),包含 intrinsic 資料型別。而 variant 型別只是一個特殊型態的物件。

variant 型別在使用上一般比較沒有效率,但可能在某些地方用起來比較方便,例如從資料庫承接可能會傳回 null 的欄位,程式碼如右 dim rec as recordset
set rec = new recordset
rec.open "select region from northwind.dbo.customers where customerid='alfki'", "provider=sqloledb;data souce=(local);initail catalog=northiwnd;user id=sa;"
dim res as variant
res = rec.fields(0)
if isnull(res) then
msgbox "內容是 null"
else
msgbox res
end if 在 visual basic.net 的 intrinsic 資料型別有型態 資料型態名稱大小預設值 數字byte1 byte(8 bits) 0 short2 bytes(16 bits) 0 integer4 bytes(32 bits) 0 long8 bytes(64 bits) 0 single4 bytes(32 bits) 0.0 double8 bytes(64 bits) 0.0 decimal12 bytes(96 bits) 0.0unicode 文字string "" char 2 bytes(16 bits) ""其他型別boolean false date #01/01/0001 12:00:00am# 注意,不再支援 currency 型別,可以使用 decimal 型別取代

宣告變數、常數和陣列
在 visual basic.net 有增加一些在宣告變數、常數和陣列方面的語法,在宣告的同時可以賦予值--宣告的語句與執行的語法相似 dim x as integer=24
dim y as integer= x*24


const my_number=42
const my_number as integer=42
const my_string = "hello world"
const my_string as string = "hello world" 注意,與 vb6 不相容的是在同一個宣告的語句中只能宣告一種型態,所以不能有下列的語法。
dim x as integer, y as string
也因此
dim x,y as integer
會宣告 x 和 y 兩個變數都是整數型別。 dim 關鍵字也可以宣告初始化過的陣列
  dim myarray(20) as integer
dim myarray(5) as integer = (1,2,3,4,5)
dim myarray(3) as string = ("bill", "fred", "mary")
陣列一定要透過 dim 宣告,若以空的括號,內不定義數字,則該陣列可以在之後重新定義大小。redim 可以用來重新定義陣列的大小,但不能改變陣列的維度。
  dim myarray() as integer
redim myarray(20)


dim myarray(,,) '<---透過逗號來定義陣列的維度
redim myarray(20,10,5)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表