16

すべての .net 開発者は、プロパティの概念について知っています。大体 99.99% で、getter と setter という 2 つのメソッドをつなぎ合わせた単なるメタデータです。

add、remove、invoke メソッドを使用するイベントについても、通常は同じことが言えます。

ECMA-335 は、プロパティまたはイベントのいずれかに適用される «Other» 種類のメソッド セマンティックを記述します。概念的には、プロパティまたはイベントは複数の «other» メソッドを持つことができます。

«other» メソッドを持つプロパティを見つけたのは今日が初めてです。そしてもちろん、それは COM に関連している必要がありました。EnvDTE アセンブリ (Visual Studio へのアドインの書き込みに使用) のインターフェイス EnvDTE.Property には、次のように定義されたプロパティが含まれています。

.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)
}

let_Value は次のように定義されています。

.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 ) 
}

どうやら、VBScript および VB.NET より前のバージョンの VB では、Let キーワードを使用してプロパティを定義できます。Let は Set と同じ署名を持っています。ここに関係があると感じます。

しかし、EnvDTE が記述された言語でこのプロパティがどのように宣言されているかを知っている人はいますか? 同じパターンでアセンブリを作成するにはどうすればよいですか (ilasm を使用しないと簡単すぎます)。そして、誰かが同様の財産に直面したことがありますか?

そして、おそらくこれとはセマンティックが異なる、他の «other» プロパティを見た人はいますか? はいの場合、彼らは何に慣れていますか?

4

2 に答える 2

21

これは、VB に登場する COM のことです。Setは参照を割り当ててプロパティの参照先アイテムを置き換えますが、Letはオペランドの内容を既存のプロパティにコピーすることが期待されます。( Property Getも参照してください)。

IIRCこれはコアCOMのものではなく、言語が値と参照の問題を十分に正確に処理するのに十分な表現力を持っていない場合に使用されるものです-IDispatchを使用している場合にのみ適用されると思います(あなたがカスタムインターフェイス(常にメソッドに解決してそれを呼び出す必要がある場合)ではなく、メソッドではなくプロパティIDでアドレス指定しています)。私は、VB.NET (または他の .NET 言語) がそのようなことを表面化しないと確信しているため、それらはまれなことです。

Essential COM by Box はそれについて言及していません (get と set の propget と propput のみ)。COM IDL & Interface Design by Dr Al Major は P106 ans で言及しています:

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

このpropputref属性は、Visual Basic 構文の特異性に端を発するちょっと変わったものです。次の点を考慮してください。

Dim val as DMyOtherInterface
Dim var as DMyInterface

Set var.lMyProp = val
var.lMyProp = val

2 つの代入はどちらも許容されますが、意味はまったく異なります。最初の割り当てでのキーワードの使用は、SetlMyProp にインターフェイスが割り当てられていることを示しています [...]。2 番目の割り当ては単純なもので、インターフェイスのデフォルト メンバーの値であるオブジェクトの値 (デフォルト メンバーは、ID でタグ付けされたメンバーです。後で説明valます) が割り当てられます。インターフェイスのプロパティ。DMyOtherInterfaceDISPID_VALUElMyPropDMyInterface

最初の代入は lMyProp プロパティに関連付けられた propputref メソッドを使用して実行され、2 番目の代入は propput メソッドを使用します。これを機能させるには、propputrefpropput メソッドの両方を定義する必要があります。このやり方に戸惑うのは、あなただけではありません。VB には、プログラミングの性質を根本的に変えた多くの優れた機能がありますが、言語の定義は、設計されたものではなく、主に市場主導型でした。

面白いことに、COM と .COM が崩壊する前の 2000 年初頭に Major 本を読んで以来、私は一度も Major 本を使用したことがありません (ただし、その目的には適した本です)。記憶の小道をたどってくれてありがとう - プログラミングはますます難しくなっていると人々が私たちに言うのが大好きです!

.otherそれが言及されているかどうかを確認するために Lidin の本を持っていないでください。

于 2009-12-03T14:43:30.200 に答える