none
Shared 的问题 RRS feed

  • 问题

  • 例如
    Private Shared Function replaceSQL(ByVal querySQL As String) As String
            Return Replace(querySQL, "'", "''")
    End Function

    加了Shared和不加,在具体应用上有什么具体的区别吗?

    首先,请不要讲概念,MSDN里面都有

    我想知道的是有什么具体的区别,最好能有个例子


    还有在什么情况下应该使用Shared呢?


    I am Rayman Zhai
    2009年8月15日 7:54

答案

  • 用了Shared修饰词,就是共享的,举个例子,如果 在  class1 里有个 属性:
    Property I As Integer
    当不用Shared 是,这个属性是自有的,如果你基于这个class1 生成两个对象:
    dim c1 as new class1
    dim c2 as new class1
    两个对象的 I 属性不是共享的,分别指向内存里的两个对象,你给 c1.I = 6 c2.I =8 再检查 debug.print c1.I ,它还是 6

    但你用了Shared 时
    Shared Propetry I as Intger
    同样 赋值 c1.I = 6 c2.I =8 debug.print c1.I ,它已经是8 了,说明两个对象的属性 是同时指向内存里同一个对象的,他们是共享的,修改哪一个对性,共享的属性都会修改。
    这是在  Property的情况下,在 Function的情况,程序运行的时候你看不出区别,但用了 Shared,内存只共享一个 Function的实例,不用Shared ,每实例化一个 class1的时候,都会生成一个单独的 Function的实例。
    不知道你看完会不会更糊涂。

    2009年8月15日 9:32
  • 你好!
         我尽量简单的描述一下:
         使用了Shared关键字,这个方法属于类或结构。
         不使用Shared关键字,这个方法属于类或结构的实例。

         VB.NET里的语法比较宽松,在C#中这个概念会看的更清楚,C#中只能使用类名来访问静态成员(静态成员和Shared的概念对应)
    周雪峰
    • 已建议为答案 Jiyuan 2009年8月15日 13:33
    • 已标记为答案 Rayman Zhai 2009年8月16日 0:03
    2009年8月15日 10:33
    版主
  • 用了Shared修饰词,就是共享的,举个例子,如果 在  class1 里有个 属性:
    Property I As Integer
    当不用Shared 是,这个属性是自有的,如果你基于这个class1 生成两个对象:
    dim c1 as new class1
    dim c2 as new class1
    两个对象的 I 属性不是共享的,分别指向内存里的两个对象,你给 c1.I = 6 c2.I =8 再检查 debug.print c1.I ,它还是 6

    但你用了Shared 时
    Shared Propetry I as Intger
    同样 赋值 c1.I = 6 c2.I =8 debug.print c1.I ,它已经是8 了,说明两个对象的属性 是同时指向内存里同一个对象的,他们是共享的,修改哪一个对性,共享的属性都会修改。
    这是在  Property的情况下,在 Function的情况,程序运行的时候你看不出区别,但用了 Shared,内存只共享一个 Function的实例,不用Shared ,每实例化一个 class1的时候,都会生成一个单独的 Function的实例。
    不知道你看完会不会更糊涂。


    这个我也了解,我想知道的就是在function 中有什么具体区别吗?我的意思是在具体的程序编写中
    在类对象中的区别当然是很容易了解的了,
    但是一般的function都直接调用的,不用实例化,

    所以Shared也就无所谓是对象,还是对象的实例了。还是我理解错误了?

    其实用我都知道怎么用的,就是想知其所以然。


    谢谢大家的热心答复!


    I am Rayman Zhai
    2009年8月15日 16:23
  • 如果没有用 Shared 修饰的 Function , 你在实例化它的类前不能调用该 Funcion
    用了Shared,你第一次调用Function时,其实IL在后台先要实例化该类为一个共享的对象,以后调用就没再实例化了。
    但是对于你来说,大部分时间用不用 Shared ,其实运行起来一样,只不过没用 Shared你要 显式 实例化,但理论上来说,如果你不用Shared,你创建10个这个类的对象,就有10个 Function在内存,用了Shared,就算你创建100个这个类的对象,在内存当中也只创建了一个Function ,而在这一百个对象中,只是存着指针指向同一个 Function,所以大部分时间来说,Function最好用Shared,除了一种情况: Byref
    Shared Function I (Byref p as integer) as integer
      Public Function I (Byref p as integer) as integer
    这两个Function 的参数 p 是 Byref ,因此你在Function 修改p是,如果 是 Shared,任何一个实例 修改p ,所有 实例里面的 p都会变化,但Public Function 的话,就只修改自己 的P。
    我很啰嗦,不知道说明白了没。

    2009年8月15日 19:16

全部回复

  • 用了Shared修饰词,就是共享的,举个例子,如果 在  class1 里有个 属性:
    Property I As Integer
    当不用Shared 是,这个属性是自有的,如果你基于这个class1 生成两个对象:
    dim c1 as new class1
    dim c2 as new class1
    两个对象的 I 属性不是共享的,分别指向内存里的两个对象,你给 c1.I = 6 c2.I =8 再检查 debug.print c1.I ,它还是 6

    但你用了Shared 时
    Shared Propetry I as Intger
    同样 赋值 c1.I = 6 c2.I =8 debug.print c1.I ,它已经是8 了,说明两个对象的属性 是同时指向内存里同一个对象的,他们是共享的,修改哪一个对性,共享的属性都会修改。
    这是在  Property的情况下,在 Function的情况,程序运行的时候你看不出区别,但用了 Shared,内存只共享一个 Function的实例,不用Shared ,每实例化一个 class1的时候,都会生成一个单独的 Function的实例。
    不知道你看完会不会更糊涂。

    2009年8月15日 9:32
  • 你好!
         我尽量简单的描述一下:
         使用了Shared关键字,这个方法属于类或结构。
         不使用Shared关键字,这个方法属于类或结构的实例。

         VB.NET里的语法比较宽松,在C#中这个概念会看的更清楚,C#中只能使用类名来访问静态成员(静态成员和Shared的概念对应)
    周雪峰
    • 已建议为答案 Jiyuan 2009年8月15日 13:33
    • 已标记为答案 Rayman Zhai 2009年8月16日 0:03
    2009年8月15日 10:33
    版主
  • 用了Shared修饰词,就是共享的,举个例子,如果 在  class1 里有个 属性:
    Property I As Integer
    当不用Shared 是,这个属性是自有的,如果你基于这个class1 生成两个对象:
    dim c1 as new class1
    dim c2 as new class1
    两个对象的 I 属性不是共享的,分别指向内存里的两个对象,你给 c1.I = 6 c2.I =8 再检查 debug.print c1.I ,它还是 6

    但你用了Shared 时
    Shared Propetry I as Intger
    同样 赋值 c1.I = 6 c2.I =8 debug.print c1.I ,它已经是8 了,说明两个对象的属性 是同时指向内存里同一个对象的,他们是共享的,修改哪一个对性,共享的属性都会修改。
    这是在  Property的情况下,在 Function的情况,程序运行的时候你看不出区别,但用了 Shared,内存只共享一个 Function的实例,不用Shared ,每实例化一个 class1的时候,都会生成一个单独的 Function的实例。
    不知道你看完会不会更糊涂。


    这个我也了解,我想知道的就是在function 中有什么具体区别吗?我的意思是在具体的程序编写中
    在类对象中的区别当然是很容易了解的了,
    但是一般的function都直接调用的,不用实例化,

    所以Shared也就无所谓是对象,还是对象的实例了。还是我理解错误了?

    其实用我都知道怎么用的,就是想知其所以然。


    谢谢大家的热心答复!


    I am Rayman Zhai
    2009年8月15日 16:23
  • 如果没有用 Shared 修饰的 Function , 你在实例化它的类前不能调用该 Funcion
    用了Shared,你第一次调用Function时,其实IL在后台先要实例化该类为一个共享的对象,以后调用就没再实例化了。
    但是对于你来说,大部分时间用不用 Shared ,其实运行起来一样,只不过没用 Shared你要 显式 实例化,但理论上来说,如果你不用Shared,你创建10个这个类的对象,就有10个 Function在内存,用了Shared,就算你创建100个这个类的对象,在内存当中也只创建了一个Function ,而在这一百个对象中,只是存着指针指向同一个 Function,所以大部分时间来说,Function最好用Shared,除了一种情况: Byref
    Shared Function I (Byref p as integer) as integer
      Public Function I (Byref p as integer) as integer
    这两个Function 的参数 p 是 Byref ,因此你在Function 修改p是,如果 是 Shared,任何一个实例 修改p ,所有 实例里面的 p都会变化,但Public Function 的话,就只修改自己 的P。
    我很啰嗦,不知道说明白了没。

    2009年8月15日 19:16