Делает ли в настоящее время что-либо указание OutAttribute для внутренних методов ByRef?

VB.NET не имеет параметров out, но вы можете указать <Out()> ByRef в методах COM и P/Invoke, чтобы получить тот же эффект для внешних методов.

Действительно ли указание того же для внутренних методов (т.е. методов, вызываемых только кодом .NET) действительно помогает Jitter (или компилятору VB.NET)? Или в настоящее время это полезно только как заметка программиста.

Возможно ли, что его можно будет использовать в будущем Jitter, или этот атрибут теряется при компиляции?


person Mark Hurd    schedule 19.07.2011    source источник


Ответы (2)


Я подтвердил, что VB.NET <Out()> действительно заставляет клиент C# требовать out аргументов, так что это похоже на то же самое.

Кроме того, клиент C# передает в метод свои аргументы с текущими значениями, но это неудивительно, поскольку, в отличие от случаев COM или P/Invoke, здесь не требуется маршалинга. (Кроме того, С# не позволяет напрямую задавать свойство с помощью аргумента out, поэтому, похоже, нет способа увидеть, будет ли С# оптимизировать предыдущее ненужное присваивание.)

Таким образом, кажется, что ответ заключается в том, что он действительно помогает возможным будущим клиентам C # использовать код, и если джиттер когда-либо корректирует эквивалент C #, он сделает то же самое здесь. Хотя такие языки, как VB, существуют, он мало что может сделать, потому что они не соблюдают Out атрибут сами.

person Mark Hurd    schedule 20.07.2011
comment
Да, это точно то же самое. Ключевое слово C# out компилируется в код IL, содержащий атрибут <Out()>. VB.NET просто не имеет ключевого слова. Вы можете убедиться в этом сами, скомпилировав два тестовых проекта и используя ILdasm для их сравнения. - person Cody Gray; 11.08.2012
comment
Я предполагаю, что это относится к атрибуту Out в пространстве имен System.Runtime.InteropServices. Так ли это? - person jswolf19; 03.06.2015
comment
@ jswolf19 Да, изменено, также в моих ответах на связанные вопросы. - person Mark Hurd; 03.06.2015
comment
@Марк Спасибо за ответ ^_^ - person jswolf19; 03.06.2015

Я создал подкласс MembershipProvider с классом VB, назовем его A, а затем создал подкласс A с классом C#, который мы назовем B. Код C#, B, не распознавал тот факт, что абстрактные методы в MembershipProvider уже были реализован в подклассе VB, A, пока я не применил OutAttribute в классе VB для параметров, которые были указаны как out в абстрактных методах базового класса MembershipProvider. Это влияет не только на COM или P/Invoke.

person Richard Collette    schedule 10.03.2014