程式碼換膚術(一)——C#和VB (轉)
程式碼換膚術(一)——C#和VB
現在流行“換膚術”,就是把操作介面變個樣子,程式當然還是原來的程式。程式碼的移植也可以稱為一種“換膚術”,內容不改,但變成了另一種語言。本文介紹的是從當今最火熱的C#與間移植的技巧。
按理說,這兩種語言沒有什麼移植的必要,因為他們生成的程式碼可以完全通用。但是如果一個工程基本上是VB寫成的,卻需要少許已經存在的C#過程,用並不是一種很高的辦法。就算是學習C#或VB,學會他們之間的移植可以雙倍的利用已經存在的程式碼(如好玩的Donkey.net就只有VB版)。
有人比較過這兩種語言,得出的結論是他們很相似。但即便是這樣,VB初學者看到諸如((Button)sender).Text = “啟動”;之類的語法不知道如何移植到VB,而C#初學者看到Handles Button1.Click等語法也會為移植而感到頭痛。下面就看看他們最難移植的部分:
1、Option語句。VB的Option語句可以開啟或關閉變數宣告檢查和型別轉換檢查。尤其是Option Strict被關閉後,VB變成弱型別語言,很多型別轉換都是自動的,移植到C#中會產生無數錯誤。因此,如果要將帶有Option Strict Off語句的VB程式移植到C#,最好先在VB中將Option Strict開啟,然後把所有型別轉換出錯的地方變成強型別轉換,然後再進行移植。
2、型別轉換。VB提供了很多型別轉換型運算子,如CInt(), CSng(), CStr()等,在C#中只要用(int) , (float), (String)即可。然而如果不是標準型別,如下面的C#語句:
((System.Button)sender).Text = “啟動”;
就要使用VB的函式型運算子CType來實現。上面的程式碼正確的移植方法是:
CType(sender, System.Button).Text = “啟動”
千萬不要使用某些人推薦的,將Option Strict關閉,然後用後期繫結sender的方法,這根本不符合程式移植不能改變本質的要求。
3、修飾符和屬性標籤。VB和C#的修飾符是完全對等存在的,但是拼寫往往不同,給移植帶來了很多麻煩,尤其是表示相同意思的關鍵字從字面理解完全不同的時候。下面就給出了VB和C#對應的關鍵字:
VB
C#
VB
C#
Inherits
:
Implements
:
MustInherit
abstract
NotInheritable
sealed
Overridable
virtual
NotOverridable
sealed
MustOverride
abstract
Overrides
override
[Overloads]
無
Shadows
new
Shared
static
Public
public
Protected
protected
Friend
internal
Protected Friend
protected internal
Private
private
Static
用別的方法實現
ByVal
無
ByRef
ref
Optional
無
ParamArray
params
無法實現
unsafe
無法實現
fixed
可以看出,VB的關鍵字比較長,而且使用上也比C#更加嚴格。從C#向VB移植的時候,要分外注意哪些VB有而C#沒有的關鍵字以及在C#拼寫相同,在VB中拼寫不同的關鍵字(如MustOverride和MustInherit)。有些關鍵字如unsafe,如果C#使用了他們,將無法移植到VB中。好在這些關鍵字在商業應用中並不常用。
屬性標籤在這兩種語言中非常的相似,移植上應該沒有任何難度,只要知道在C#中用方括號[]表示屬性標籤,而在VB中用的是尖括號<>。另外,如果要用名稱結合傳遞引數,C#直接使用=號,而VB使用:=(冒號和等號)。
4、委派型別。委派型別就是的函式指標型別。在C#中,難以分辨是函式指標在工作還是函式本身在工作,因為他們的語法相同。當要為一個委派型別的變數複製的時候,直接等於一個函式即可,如:
public delegate void FuncType( e)
...
FuncType func;
func = new FuncType(this.SampleFunction1);
//呼叫
func(something);
//換指向另外一個函式
func = this.SampleFunction2
然而VB中,委派型別就像是一般的物件,有它的方法,與函式本身明顯不同。你不能將過程的名字直接賦給一個委派型別的物件,而必須使用AddressOf運算子,下面的例子就是上文C#程式的VB版,注意那些實現不同的地方:
Public Delegate Sub FuncType(ByVal e As Object)
...
Dim func As FuncType
func = New FuncType(AddressOf Me.SampleFunc1)
‘ 呼叫
func.Invoke(something)
‘ 換指向另外一個函式
func = AddressOf Me.SampleFunction2
5、事件處理。這是兩種語言最大的差別之一,VB傳承以前版本強大的事件處理機制,許多語法都比C#更加靈活。好在無論什麼情況,他們之間都是可以互相移植的。
對於事件定義,兩種語言都是一個委派型別加一個事件屬性,如:
[C#]
public delegate void MyEventHandler(Object sender, EventArgs e);
public event MyEventHandler MyEvent;
[]
Public Delegate Sub MyEventHandler(ByVal sender As Object, ByVal e As EventArgs)
Public Event MyEvent As MyEventHandler
VB還支援另外一種更加緊湊的定義方法,只有一條語句:
Public Event MyEvent(ByVal sender As Object, ByVal e As EventArgs)
移植的時候,要把引數部分分離出來,成為一個委派型別,再按照普通方法定義事件即可。
關於事件響應,C#與等語言一樣,是動態繫結事件過程的,其語法類似於下:
internal MyClass myobj;
...
myobj = new MyClass();
...
myobj.MyEvent += this.myobj_MyEvent;
...
protected void myobj_MyEvent(Object sender, EventArgs e)
{
//語句
}
可以看到,C#是利用運算子連線事件過程和事件屬性的。之後,還可以用-=運算子解除事件過程與事件屬性的繫結。VB不支援運算子過載,但仍然支援這種動態繫結的事件過程,方法是使用AddHandler和RemoveHandler關鍵字。如上面黑體部分可以移植為:
AddHandler myobj.MyEvent, AddressOf Me.myobj_MyEvent
解除繫結的語法與此類似,只是關鍵字為RemoveHandler而已。一定不要忘記過程前面還有一個AddressOf關鍵字!
動態繫結的事件過程工作起來比較慢,VB支援一種更快的靜態繫結事件過程。一旦為物件設定了靜態的事件過程,就不能解除繫結,一般大多數情況都是如此。語法如下:
‘ 定義變數時使用WithEvents關鍵字
Friend WithEvents myobj As MyClass
‘ 直接書寫事件過程,注意Handles的語法:
Protected Sub myobj_MyEvent(ByVal sender As Object, ByVal e As EventArgs) _
Handles myobj.MyEvent
‘ 語句
End Sub
它表示myobj_MyEvent這個過程僅僅響應myobj.MyEvent這個過程。如果一個過程要響應很多個事件,把他們列在Handles後面,用逗號隔開,如Handles Event1, Event2, ...
遇到這種情況,要看清Handles後面的所有物件和事件,將它們一一改寫成動態繫結的語句:
Protected Sub XXX(...) Handles myobj1.MyEvent, myobj2.MyEvent
==>
myobj1.MyEvent += this.XXX;
myobj2.MyEvent += this.XXX;
...
protected void XXX(...){}
當事件比較多時,C#顯著變得比較麻煩,幸好一個過程響應一大堆事件的情況也不太多(不過我就編寫過一個過程相應8個事件,移植起來好麻煩!)。原則上說,將靜態事件過程移植為動態事件過程並沒有完全遵守移植的規定,但我估計他們實現的原理不會相差太多,所以也不用擔心。
6、異常處理。VB支援兩種形式的異常,即.net的異常和VB自己的錯誤號碼。而C#只支援第一種。用到VB自己的錯誤號碼的程式幾乎無法移植到C#中,所以應該儘量使用.net框架的異常,如下面VB語句:
Try
‘ 發生錯誤的程式碼
Catch When Err.Number = 52
‘ 解決錯誤的程式碼
End Try
這段程式碼無法直接移植到C#中,只有用Exception物件取代Err物件獲得異常資訊,才能順利移植。另外VB的When語句帶給Try語句十分靈活的用法,必須用很高的技巧才能在C#中實現,這就需要具體問題具體分析了。
VB支援Exit Try語句,可以直接從Try塊或Catch塊跳轉到Finally塊。C#沒有提供類似的語法,可以用以下技巧:
[Visual Basic]
Try
‘ 一些語句
Exit Try
Finally
‘ 一些語句
End Try
[C#]
try
{
//一些語句
goto __leave;
}
finally
{
//一些語句
}
__leave: //別忘了這裡還有哦!
總之是利用了finally塊無法跳過的特徵,用goto語句模擬了Exit Try語句。
如果VB程式用的是VB特有的On Error GoTo語句實現的錯誤處理,問題就麻煩了。程式碼可能在過程中上下跳躍,無法預料語句的方式。這種程式碼理解起來就頭痛,更不要說移植了。總體來說,把所有語句統統轉移到try塊中,然後用catch一一處理錯誤。遇到要返回(Resume語句)的時候,只好Copy程式碼了。反正不是一件容易的事情,慢慢改就是了。
7、模組。VB支援模組,C#不支援。但也沒有關係,只要在C#中製造一個abstract類,共享所有成員,就和模組一樣了。當然不能像VB一樣直接訪問模組中的成員,需要用到“類名.成員名”的用法。
8、介面。C#在介面方面也沒有VB強大(怎麼這麼重要的功能也不做得好一點?),VB採用Implements語句結合介面的成員和類的實現成員,而C#是用名稱結合。因此VB就可以隨便修改實現成員的訪問級別和名稱,而C#就不能改名稱。將C#移植為VB時,最好利用VB.net編輯器直接實現介面,比較簡單。把VB移植為C#時,就必須把改過的名字都改回來,遇到名字衝突就更討厭了(這時候我幾乎不想再移植為C#了)。給一個例子:
[Visual Basic]
Public Class Class1 : Implements IMyInterface
Public Sub DoSth() Implements IMyInterface.Method1
End Sub
End Class
[C#]
public class Class1 : IMyInterface
{
public void Method1()
{
}
}
9、運算子過載。這會遇到VB頭痛了,既然VB不支援運算子過載,那麼就必須用子程式和函式來模擬運算子。比如建立Plus和Minus方法模擬+和-的運算。當然還是有很多情況(比如遇上了explicit和implicit語句)就真的沒有辦法了,只好不移植了。運算子過載是一個很不錯的功能,它能使很多操作簡單地完成,如果VB支援它,就真的是完美語言了。
好了,想必最麻煩的地方已經說完了,剩下的就是簡單的Copy了。雖然有些地方還沒有說清楚,但基本上闡明瞭兩種語言的不同(一看,不同還挺多的吧),反正也不用移植大的工程,瞭解這些內容主要是為了利用雙倍的利用已經存在的程式碼,但願本文對你有用。由於水平低劣,如有錯誤請各位大蝦指正,小弟必洗耳恭聽。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990047/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VB.net 跟 C# 的程式碼轉換C#
- 使用C#,VB和Java將PDF轉換為DOC / DOCXJava
- C#/VB.NET 實現Word和ODT文件相互轉換C#
- VB程式設計師眼中的C# (轉)程式設計師C#
- ASP.NET Razor – C# 和 VB 程式碼語法簡介ASP.NETC#
- 5個最優秀的Java和C#程式碼轉換工具JavaC#
- c#全半形轉換示例程式碼C#
- VB程式設計師眼中的C# 2 (轉)程式設計師C#
- VB程式設計師眼中的C# 4 (轉)程式設計師C#
- VB程式設計師眼中的C# 6 (轉)程式設計師C#
- VB程式設計師眼中的C# 3 (轉)程式設計師C#
- VB程式設計師眼中的C# 5 (轉)程式設計師C#
- VB程式設計師眼中的C# 7 (轉)程式設計師C#
- VB程式設計師眼中的C# 8 (轉)程式設計師C#
- VB程式設計師眼中的C# 9 (轉)程式設計師C#
- localStorage網頁換膚程式碼例項網頁
- 想用就用,VB基礎程式碼 (轉)
- 工程座標轉換方法C#程式碼實現C#
- VB程式設計師眼中的C# 10(end) (轉)程式設計師C#
- 內碼轉換技術 (轉)
- C#全形和半形轉換C#
- VB5裡面實現VB6的InstrRev()和Split()一樣的替換函式 (轉)函式
- vb下傳送郵件,一行程式碼搞定 (轉)行程
- VBS VBA VB C#程式開發C#
- VB.net 編碼規範(也適用於C#) (轉)C#
- C# 列舉遍歷和轉換C#
- C# 自定義 implicit和explicit轉換C#
- VB 程式大揭秘 (轉)
- Look and Feel---JAVA介面(換膚術)Java
- 聊一聊前端換膚前端
- VB程式設計的一些心得 (轉)程式設計
- c# 優化程式碼的一些規則——使用is或as和強制型別轉換的區別[三]C#優化型別
- C#/VB.NET 將RTF轉為HTMLC#HTML
- C#/VB.NET 將Html轉為ExcelC#HTMLExcel
- C# bytes[]和sting互相轉換C#
- C# 讀取Word文字框中的文字、圖片和表格(附VB.NET程式碼)C#
- 主流技術之網易雲換膚方案
- 網頁常見的換膚技術網頁