2009-02-04 18 views
2

Je refactoring du code, et une partie de celui-ci incluait le déplacer de VB.Net à C#.Différence entre VB.Net et C# "en tant que nouveau WebControl"

L'ancien code a déclaré un membre comme celui-ci:

Protected viewMode As New WebControl 

Le nouveau code, j'ai finalement eu à travailler, comme ceci:

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

Je peux présumer que le mot-clé New signifiait: appeler le constructeur! Mais comment VB.Net appelait-il un constructeur (un paramètre sans paramètre) que je ne pouvais pas appeler en C#?

Répondre

9

La raison pour laquelle cela fonctionnait en VB, et non en C#, n'avait rien à voir avec les assemblages.

Le constructeur par défaut de WebControl est protégé. VB et C# ont des interprétations différentes de ce que signifie "protégé".

Dans VB, vous pouvez accéder à un membre protégé d'une classe à partir de n'importe quelle méthode de tout type dérivant de la classe.

C'est, VB permet le code de compiler:

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 

Parce qu'un « Derived1 » est une base, il peut accéder aux membres protégés des « autres », ce qui est également une base.

C# prend un point de vue différent. Cela ne permet pas l'accès "latéral" que VB fait. Il indique que l'accès aux membres protégés peut être effectué via "this" ou tout objet du même type que la classe qui contient la méthode. Parce que "Foo" est défini ici dans "Derived1", C# permettra seulement à "Foo" d'accéder aux membres "Base" d'une instance "Derived1". Il est possible que "other" soit quelque chose qui ne soit pas un "Derived1" (il pourrait, par exemple, être un "Derived2"), et donc il n'autorise pas l'accès à "m_x".

Dans ce cas de code, VB autorisait un accès "latéral" au constructeur "WebControl".

C#, cependant, ne l'a pas fait.

2

Le constructeur par défaut de WebControl (implicite dans la ligne VB) consiste à utiliser un span. Vous pouvez appeler ce constructeur dans C# ainsi que VB.NET.

+0

En fait, il y a des endroits dans VB où vous pouvez tous le constructeur que vous ne pouvez pas en C#. C'est la raison pour laquelle il a eu cette erreur. Voir mon message ci-dessous pour plus de détails. –

0

Webcontrol wc = onglet;

1

Accéder à des constructeurs protégés hérités d'une classe dérivée dans n'importe quel contexte soulèverait des problèmes d'encapsulation de données.

Historiquement, C# puisque la toute première version permettait un tel accès. Mais il a été corrigé dans VS 2005. Les classes dérivées peuvent appeler leurs constructeurs protégés de base uniquement à partir de leur propre constructeur maintenant.

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 
    } 
} 

Dans VB.NET, vous pouvez initialiser des variables de deux manières. D'abord avec l'opérateur d'affectation suivi la déclaration; deuxième avec la déclaration "As New".

Dans le cas du constructeur protégé, le "As New" fonctionne toujours bien.En ce qui concerne l'initialisation par assignation, cela provoquera une erreur de compilation. Mais si vous avez plus d'un constructeur dans la classe de base, l'initialisation de l'assignation fonctionnera aussi bien! Probablement la raison pour laquelle VB.NET permet ce type d'accès est en compatibilité avec le code existant.

Plus de détails: http://blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx

Questions connexes