válido specification significado programa msil medicina language detectó common caracteristicas abreviatura c# .net asp.net vb.net clr

specification - Diferencia entre VB.Net y C#"Como nuevo WebControl"



common language specification (4)

Estaba refaccionando algunos códigos, y parte de eso incluía moverlos de VB.Net a C #.

El código anterior declaró un miembro como este:

Protected viewMode As New WebControl

El nuevo código, finalmente funcionó, así:

protected WebControl _viewMode = new WebControl(HtmlTextWriterTag.Span);

Puedo suponer que la palabra clave New significaba: ¡llamar al constructor! ¿Pero cómo llamaba VB.Net a un constructor (sin parámetros) que no podía llamar en C #?


El constructor predeterminado para WebControl (implícito en la línea VB) es usar un lapso. Puede llamar a ese constructor en c # y en VB.NET.


La razón por la que esto funcionó en VB, y no en C #, no tuvo nada que ver con los ensamblados.

El constructor predeterminado para WebControl está protegido.

VB y C # tienen diferentes interpretaciones de lo que significa "protegido".

En VB, puede acceder a un miembro protegido de una clase desde cualquier método en cualquier tipo que se derive de la clase.

Es decir, VB permite compilar este código:

class Base protected m_x as integer end class class Derived1 inherits Base public sub Foo(other as Base) other.m_x = 2 end sub end class class Derived2 inherits Base end class

Como un "Derived1" es una base, puede acceder a los miembros protegidos de "otros", que también es una base.

C # toma un punto de vista diferente. No permite el acceso "lateral" que VB hace. Dice que el acceso a los miembros protegidos se puede hacer a través de "este" o cualquier objeto del mismo tipo que la clase que contiene el método.

Como "Foo" aquí se define en "Derived1", C # solo permitirá que "Foo" acceda a los miembros "Base" desde una instancia "Derived1". Es posible que "otro" sea algo que no sea "Derived1" (podría ser, por ejemplo, un "Derived2"), y por lo tanto no permite el acceso a "m_x".

En este caso de su código, VB permitió el acceso "lateral" al constructor "WebControl".

C #, sin embargo, no lo hizo.


Webcontrol wc = tabulación ;


El acceso a constructores protegidos heredados de una clase derivada en cualquier contexto generaría problemas de encapsulación de datos.

Históricamente, C # desde la primera versión permitía dicho acceso. Pero se arregló en VS 2005. Ahora las clases derivadas pueden llamar a sus constructores protegidos base solo desde su propio constructor.

class Base { protected Base() { } } class Derived : Base { public Derived() : base() // Still allowed in VS 2005 { } public void Main() { Base b = new Base(); // Allowed in VS 2003, but error in VS 2005 } }

En VB.NET, puede inicializar variables de dos maneras. Primero con el operador de asignación seguido de la declaración; segundo con la declaración "Como nuevo".

En el caso del constructor protegido, el "Como nuevo" siempre funciona bien. En cuanto a la inicialización por asignación, generará un error de compilación. ¡Pero si tiene más de un constructor en la clase base, la inicialización de la asignación también funcionará!

Class Base Protected Sub New() End Sub End Class Class Derived Inherits Base Public Sub Main() Dim foo As New Base // Allowed Dim moo As Base = New Base() // Error if Base has only one constructor End Sub End Class

Probablemente la razón por la cual VB.NET permite este tipo de acceso es en compatibilidad con el código heredado.

Más detalles: http://blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx