VB.NET 對於型別的傳遞按值或者按引用,(byval byref) C# 多了個out。
有時候面試的時候我會問個小問題,嘿嘿,看看對C#基本的語法有沒有熟悉。
比如
public void XXX( byval form as Form)
跟
public void XXX(byref form as Form)
有啥區別?其實很簡單對應為C++ 就是 void XXX( Form * form) 跟 void XXX(Form **form)
所謂的按照值傳遞跟引用傳遞都有一個基本的問題就是誰的值,誰的地址。
以上的兩個方法,第一個傳遞的是Form這個物件的地址這個值。所以在第一個方法中你這樣寫
form.xxx=zzz //可以更改原來form物件的值
form=New Form()
form.xxx=yyy;
事實上,不會影響原來form的值。
而第二個就不一樣,他傳遞的是地址的地址,所以他可以更改原來form的值。
這個問題放到WebService 中就更奇怪了。
[WebMethod()]
public void XXX( byval p as Person)
[WebMethod()]
public void YYY( byref p as Person)
我們都說webservice是沒有狀態的,那麼第一個方法跟第二個方法有啥區別呢?第一個方法中如果也是類似的程式碼,他能夠影響客戶端傳遞給他的物件的狀態嗎? 第二個呢?
看看微軟的實現,才發現他做了很多詭異的程式碼。
看看他的第二個方法的WSDL,明明return的是void的,他應是給你返回一個物件。
<soap:Body>
<HelloWorldpersonResponse xmlns="http://tempuri.org/">
<p>
<Name>string</Name>
</p>
</HelloWorldpersonResponse>
</soap:Body>
然後客戶端的代理做什麼操作呢?呵呵。以下程式碼
Public Sub HelloWorldperson(ByRef p As Person)
Dim results() As Object = Me.Invoke("YYY", New Object() {p})
p = CType(results(0),Person)
End Sub
MS對標準的就是這麼踐踏的,呵呵