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