2011-07-19 17 views
9

VB.NET no tiene los parámetros out, pero puede especificar <Out()> ByRef en los métodos COM y P/Invoke para obtener el mismo efecto para los métodos externos.¿La especificación de OutAttribute en los métodos internos ByRef actualmente hace algo?

¿Especificar lo mismo en métodos internos (es decir, métodos llamados únicamente por el código .NET) realmente ayuda a la Jitter (o compilador VB.NET)? ¿O es actualmente solo útil como nota de programador?

¿Es posible que se pueda utilizar en una fluctuación de fase futura, o se pierde este atributo al compilar?

Respuesta

9

He confirmado que un VB.NET <Out()> hace que un cliente C# requiera out argumentos, por lo que parece ser efectivamente el mismo.

También un cliente C# pasa sus argumentos con los valores actuales en el método, pero eso no es sorprendente porque, a diferencia de los casos COM o P/Invocar, no hay orden de clasificación para hacerlo. (Y C# no permitirá que una propiedad sea establecida por un argumento out directamente, por lo que no parece haber una manera de ver si C# optimizaría una asignación anterior innecesaria).

Parece la respuesta si ayuda, los futuros clientes de C# usarán el código, y si el jitter alguna vez ajusta el equivalente de C#, haría lo mismo aquí. Aunque existen idiomas como VB, no puede hacer mucho porque no respetan el Out attribute.

+1

Sí, es * exactamente * lo mismo. La palabra clave C# 'out' se compila en código IL que contiene el atributo' '. VB.NET simplemente no tiene la palabra clave. Puede verificar esto usted mismo compilando dos proyectos de prueba y usando ILdasm para compararlos. –

+0

Supongo que esto se refiere al atributo Out en el espacio de nombres System.Runtime.InteropServices. Es ese el caso? – jswolf19

+0

@ jswolf19 Sí, modificado, también en mis respuestas en preguntas vinculadas. –

1

Subclasé MembershipProvider con una clase VB, lo llamaremos A, y luego subclasé A con una clase C# que llamaremos B. El código C#, B, no reconocía el hecho de que los métodos abstractos en el MembershipProvider ya se había implementado en la subclase VB, A, hasta que apliqué el OutAttribute en la clase VB para los parámetros que se especificaron como out en los métodos abstractos de clase base MembershipProvider. Esto tiene un impacto más allá de COM o P/Invoke.

Cuestiones relacionadas