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对标准的就是这么践踏的,呵呵