代码之家  ›  专栏  ›  技术社区  ›  Jb Evain

let_uu性质方法的好奇心

  •  16
  • Jb Evain  · 技术社区  · 15 年前

    同样的事情通常也适用于事件,以及它们的add、remove和invoke方法。

    今天是我用另一种方法偶然发现一处房产的第一天。当然,它必须与COM相关。EnvDTE程序集中的接口EnvDTE.Property(用于将加载项写入Visual Studio)包含一个定义如下的属性:

    .property object Value()
    {
      .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 ) 
      .get instance object EnvDTE.Property::get_Value()
      .other instance void EnvDTE.Property::let_Value(object)
      .set instance void EnvDTE.Property::set_Value(object)
    }
    

    .method public hidebysig newslot specialname abstract virtual 
            instance void  let_Value([in] object  marshal( struct) lppvReturn) runtime managed internalcall
    {
      .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 ) 
    }
    

    显然,VB.NET之前的VBScript和VB版本可以使用Let关键字定义属性。Let与Set具有相同的签名。我感觉这里有一种关系。

    有没有人见过其他的属性,可能和这个不同的语义?如果是,他们习惯了什么?

    2 回复  |  直到 15 年前
        1
  •  21
  •   Andrew Savinykh    9 年前

    这是一个COM的东西,是在VB中出现的。 Set 指定引用以替换属性的引用项,而 Let Property Get ).

    Essential COM by Box没有提到它(仅针对get和set的propget和propput)。COM IDL&Al Major博士的界面设计在P106 ans中提到:

    dispinterface DMyInterface { methods:
    ...
    [id(3), propputref] void lMyProp([in] IDispatch *pDisp);
    }
    

    propputref 属性是一个奇怪的小东西,它起源于VisualBasic语法的独特语法。考虑以下事项:

    Dim val as DMyOtherInterface
    Dim var as DMyInterface
    
    Set var.lMyProp = val
    var.lMyProp = val
    

    这两项作业都是允许的,但意义完全不同。使用 Set 价值 val DMyOtherInterface 接口(默认成员是由 DISPID_VALUE lMyProp DMyInterface 接口。

    第一个赋值使用与lMyProp属性关联的propputref方法执行,而第二个赋值使用propput方法。为了使其工作,propputref 必须定义propput方法。

    有趣的是,自从2000年初在COM和.COM泡沫破裂之前读过这本主要的书之后,我就没有用过这本书(尽管就其目的而言,这是一本好书)。谢谢你的记忆之旅——我喜欢人们告诉我们编程越来越难的方式!

    别把Lidin的书带在我身上看它有没有提到 .other 但我相信你会的(顺便说一句,非常感谢Mono.Cecil)

        2
  •  2
  •   joncham    15 年前

    tlbimp 潜力)。我怀疑是否有人用实际的基于.Net的语言编写了此代码。