Подтвердить что ты не робот

Любопытство метода let_ property

Каждый разработчик .net знает о понятии свойств. Грубый 99,99%, это всего лишь кусочек метаданных, склеивающих два метода: геттер и сеттер.

То же самое происходит обычно для событий, с помощью метода add, remove и invoke.

В ECMA-335 описан семантический метод "Другой", который применим либо к свойству, либо к событию. Понятно, что свойство или событие могут иметь несколько "других" методов.

Сегодня в первый день я наткнулся на имущество с помощью "другого" метода. И, конечно же, это должно было быть связано с COM. Интерфейс EnvDTE.Property в сборке EnvDTE (используемый для записи добавлений в 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)
}

С 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 до VB.NET могут определять свойства с использованием ключевого слова Let. И Let имеет ту же подпись, что и Set. Я чувствую, что здесь есть отношения.

Но кто-нибудь знает, как это свойство было объявлено на языке, на котором написана EnvDTE? Как я могу создать сборку с тем же шаблоном (без использования ilasm, это было бы слишком легко)? И кто-нибудь сталкивался с подобным свойством?

И кто-нибудь видел другие "другие" свойства, возможно, другую семантику, чем эта? И если да, к чему они привыкли?

4b9b3361

Ответ 1

Это вещь COM, которая всплывает в VB. Set назначает ссылку для замены свойства, указанного в элементе, тогда как Let, как ожидается, скопирует содержимое операнда в существующее свойство. (См. Также Property Get).

IIRC это не основной COM-объект, больше того, что используется там, где язык не обладает достаточной выразительной способностью справляться со значениями, связанными с ссылочными проблемами, в достаточно высокой степени - я считаю, что он может применяться только при использовании IDispatch ( где вы обращаетесь по идентификатору свойства, а не по методу), а не к настраиваемому интерфейсу (где вам всегда нужно решать метод и вызывать это). Я уверен, что VB.NET(или другие языки .NET) не накладывает такие вещи, и поэтому они редко встречаются.

Essential COM by Box не упоминает об этом (только propget и propput для get и set). COM IDL и дизайн интерфейса д-ром Аль-Майором упоминают его на P106 и говорят:

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

Два назначения являются допустимыми, но означают совершенно разные вещи. Использование ключевого слова Set в первом абзаце указывает, что lMyProp получает интерфейс [...]. Второе назначение - это simpe one, где значение объекта val, которое является значением элемента по умолчанию интерфейса DMyOtherInterface (элемент по умолчанию является членом, помеченным идентификатором DISPID_VALUE, как это будет объясняется вкратце), присваивается свойству lMyProp интерфейса DMyInterface.

Первое назначение выполняется с использованием метода propputref, связанного с свойством lMyProp, тогда как второе присваивание использует способ пропущения. Чтобы это работало, необходимо определить методы propputref и propput. Если вы смущены таким образом делать что-то, вы не одиноки. В то время как у VB есть много хороших функций, которые коренным образом изменили характер программирования, определение языка носило преимущественно рыночный характер, а не разрабатывалось, а иногда оно показывает.

Поразительно, что я никогда не пользовался Большой книгой, так как читал ее в начале 2000 года до того, как COM и .COM бюст (ее хорошая книга для своей цели, хотя). Спасибо за поездку вниз по переулку памяти - мне нравится, как люди говорят нам, что программирование становится все труднее!

У меня нет книги Lidin, чтобы узнать, упоминает ли она .other, но я уверен, что вы это делаете (BTW благодарит много за Mono.Cecil)

Ответ 2

Автоматизация Visual Studio основана на COM. Вероятно, это свойство было создано с помощью инструмента поддержки COM Interop (tlbimp). Я сомневаюсь, что кто-то закодировал это на реальном языке на основе .Net.