2010-05-07 6 views
17

Para esta pregunta SO: What is the C# equivalent of friend?, yo personalmente habría respondido "interno", al igual que Ja hizo entre las respuestas! Sin embargo, Jon Skeet dice que no hay equivalencia directa de VB Friend en C#. Si Jon Skeet lo dice, ¡no seré el que diga lo contrario! ; PC# interno VS VBNET amigo

Me pregunto cómo puede la palabra clave internal (C#) no ser el equivalente de Friend (VBNET) cuando sus respectivas definiciones son:

Friend VBNET

El Friend (Visual Basic) palabra clave en la declaración de declaración especifica que se puede acceder a los elementos desde el mismo ensamblaje, pero no desde fuera del ensamblaje. [...]

internal C#

Internal: El acceso está limitado a la actual asamblea.

Según entiendo, estas definiciones significan lo mismo para mí.

Entonces, respectivamente, cuando estoy de codificación en VB.NET, yo uso el amigo palabra clave para especificar que una clase o una propiedad deberán ser accesibles sólo dentro de la asamblea en la que se declara. Lo mismo en C#, uso la palabra clave interna para especificar lo mismo.

  1. ¿Estoy haciendo algo o algo mal desde esta perspectiva?

  2. ¿Cuáles son los refinamientos que no obtengo?

  3. ¿Podría alguien explicar cómo o en qué amigo e interno no son equivalencias directas?

¡Gracias de antemano por cualquiera de sus respuestas!

Respuesta

23

He dicho que no existe un equivalente directo del concepto de "amigo" C++. Eso no es lo mismo que el concepto VB.NET Friend, que es de hecho equivalente a internal en C#.

contexto es importante - no asuma que la misma palabra significa exactamente lo mismo en todos los idiomas ... "estática" es un ejemplo clásico :)

+0

Supongo que me confundí con la palabra clave "amigo". En particular, después de haber leído la respuesta de Ja, que es "interna", y de haber dicho que eso no era correcto. Entonces, ambos son equivalentes cuando hablan .NET, ¿verdad? ¿Qué es esto de InternalsVisibleToAttribute? –

+1

@Will: Lo siento, tienes razón: amigo en VB es de hecho equivalente a interno en C#. No fue correcto en esa pregunta, porque la pregunta no era sobre VB. Sin embargo, editaré mi respuesta aquí :) Para el registro, InternalsVisibleTo se trata de que a una asamblea se le permita el acceso a los miembros internos de otra. –

+0

+1 Gracias a Jon por su respuesta, y a los demás que también lo hicieron. –

4

(original) la respuesta de Jon deja claro que él es haciendo referencia a la palabra clave C/C++ friend, que concede acceso privado a otra clase. No existe un equivalente directo en C#, pero hay una manera de extender internal a otro ensamblaje, en gran parte para realizar pruebas.

Por lo que tengo entendido, VB.Net Friend es lo mismo que C# internal.

(Escribí lo anterior justo cuando Jon agregó una respuesta aquí.)

+0

+1 ¡Gracias! Esto explica mi pequeña confusión aquí. ¡Lo siento! =) –

+0

¿Cómo se puede extender "interna" a otro ensamblaje? –

+0

@Will: Eso es lo que hace 'InternalsVisibleTo'. Lea: http://blogs.msdn.com/james_world/archive/2005/07/07/436574.aspx –

2

Hay un equivalente aproximado de la palabra clave amiga de C++ en el código administrado. Aunque funciona en el nivel de ensamblaje, no en el nivel de clase. Puede usar el [InternalsVisibleTo] attribute.

+0

+1 ¡Gracias por el enlace a InternsVisibleToAttribute! =) –

3

Al comparar lenguajes .NET, el friend de VB equivale a C# internal. Es decir, cualquier elemento marcado como tal solo se puede acceder desde dentro del mismo proyecto/ensamblaje. Se puede combinar con protected para un mayor control de la visibilidad.

El atributo InternalsVisibleTo puede ser útil para realizar pruebas; a pesar del nombre, se aplica a VB tanto como a C#. Cabe señalar que VB no admite el uso de InternalsVisibleTo hasta .NET 4.

+0

+1 Por mencionar que VBNET no soportaba InternalsVisibleTo hasta .NET 4.0. ¡Gracias por tu respuesta! =) –

+0

+1 para el comentario de VB.NET 4. – MarqueIV

+0

-1 para el VB que necesita el comentario de .NET 4: Tengo un VS2k8 VB Project y un VB Test Project con InternalsVisibleTo en el anterior enlace a este último que no funciona sin él. (Existe la función de publicación separada no relacionada que crea tipos _Accessor que lo hace algo redundante pero funciona de todos modos.) El comentario en la página de MSDN dice que no funciona con VB.NET en VS2k5. La advertencia correcta no es compatible con VB.NET 8 - VS2k5 - y más abajo. Es compatible con .NET 2.0 por VB.NET 9 - VS2k8 - y más. –