zoukankan      html  css  js  c++  java
  • VB.NET 对于类型的传递按值或者按引用

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


  • 相关阅读:
    AngularJS学习之旅—AngularJS 服务(八)
    Svchost进程和共享服务病毒原理
    服务劫持
    利用BHO实现浏览器劫持
    动态反调试
    常用的静态反调试技术及其规避方法
    teb, peb,seh 结构
    线程本地存储tls
    注入技术总结
    注入技术--远程线程注入
  • 原文地址:https://www.cnblogs.com/fuyingke/p/450004.html
Copyright © 2011-2022 走看看