【问题标题】:Difference between VB.Net and C# "As New WebControl"VB.Net 和 C#“作为新的 WebControl”之间的区别
【发布时间】:2009-02-04 00:00:40
【问题描述】:

我正在重构一些代码,其中一部分包括将其从 VB.Net 迁移到 C#。

旧代码这样声明一个成员:

Protected viewMode As New WebControl

新代码,我终于开始工作了,像这样:

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

我可以推测New 关键字的意思是:调用构造函数!但是 VB.Net 是如何调用我无法在 C# 中调用的构造函数(无参数构造函数)的呢?

【问题讨论】:

    标签: c# .net asp.net vb.net clr


    【解决方案1】:

    这在 VB 而不是在 C# 中有效的原因与程序集无关。

    WebControl 的默认构造函数是受保护的。

    VB 和 C# 对“受保护”的含义有不同的解释。

    在 VB 中,您可以从派生自该类的任何类型的任何方法访问该类的受保护成员。

    也就是说,VB允许编译这段代码:

    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
    

    因为“Derived1”是一个基,它可以访问“other”的受保护成员,它也是一个基。

    C# 采用不同的观点。它不允许 VB 进行的“横向”访问。 它说可以通过“this”或与包含该方法的类相同类型的任何对象来访问受保护的成员。

    因为这里的“Foo”是在“Derived1”中定义的,C# 将只允许“Foo”从“Derived1”实例访问“Base”成员。 “other”可能不是“Derived1”(例如,它可能是“Derived2”),因此它不允许访问“m_x”。

    在本例中,VB 允许“横向”访问“WebControl”构造函数。

    但是,C# 没有。

    【讨论】:

      【解决方案2】:

      WebControl 的默认构造函数(隐含在 VB 行中)是使用跨度。您可以在 c# 和 VB.NET 中调用该构造函数。

      【讨论】:

      • 实际上,在 VB 中有些地方可以使用 C# 中无法使用的所有构造函数。这就是他得到这个错误的原因。有关详细信息,请参阅下面的帖子。
      【解决方案3】:

      在任何上下文中从派生类访问继承的受保护构造函数都会引发数据封装问题。

      从历史上看,C# 从第一个版本开始就允许这种访问。但它在 VS 2005 中已修复。派生类现在只能从它们自己的构造函数中调用它们的基本受保护构造函数。

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

      在 VB.NET 中,您可以通过两种方式初始化变量。首先是赋值运算符,然后是声明;第二个是“As New”声明。

      在受保护的构造函数的情况下,“As New”总是可以正常工作。至于通过赋值进行初始化,它会引发编译错误。但如果基类中有多个构造函数,赋值初始化也会起作用!

      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
      

      VB.NET 允许这种访问的原因可能是与遗留代码的兼容性。

      更多详情:http://blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx

      【讨论】:

        【解决方案4】:

        Webcontrol wc = tab;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-24
          • 2012-03-23
          • 1970-01-01
          • 2011-01-29
          • 1970-01-01
          • 1970-01-01
          • 2020-10-17
          • 2010-10-23
          相关资源
          最近更新 更多