Visual Basic中允许的';C#中禁止使用s(或反之亦然)?

Visual Basic中允许的';C#中禁止使用s(或反之亦然)?,c#,vb.net,C#,Vb.net,这是与代码相关的,编译器允许您使用一种语言,但不允许您使用另一种语言(例如,VB中的可选参数在C#中不存在) 如果可能,请提供一个代码示例和您的答案。谢谢大家! 在VB中,以C#中的每一行结尾的分号是被禁止的,当我尝试返回VB.Net时,这总是让我微笑……VB和C对“受保护”的含义有不同的解释 抄录如下: WebControl的默认构造函数 是受保护的 VB和C有不同的 对什么是“受保护”的解释 意味着 在VB中,您可以访问受保护的 中任何方法的类成员 从类派生的任何类型 也就是说,VB允许此代

这是与代码相关的,编译器允许您使用一种语言,但不允许您使用另一种语言(例如,VB中的可选参数在C#中不存在)


如果可能,请提供一个代码示例和您的答案。谢谢大家!

在VB中,以C#中的每一行结尾的分号是被禁止的,当我尝试返回VB.Net时,这总是让我微笑……

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”是基础,所以它可以 访问“其他”的受保护成员, 这也是一个基础

C#持不同的观点。信息技术 不允许“侧向”访问 是的。它说,访问 受保护的成员可以通过 “this”或任何相同类型的对象 作为包含该方法的类

因为这里的“Foo”是在 “Derived1”,C#只允许“Foo” 从数据库访问“基本”成员的步骤 “Derived1”实例。这是可能的 “其他”是指不是一个 “Derived1”(例如,它可以是 一个“Derived2”),所以它不是 允许访问“m_x”

在我的头顶上(4.0之前):

C#中不支持VB语言“功能”:

  • 可选参数
  • 后期装订
  • 案例不敏感
我相信还有更多。如果你问一些具体的例子,说明每种语言的优点,你的问题可能会得到更好的答案。在与COM交互时,VB目前比C#更好。这是因为当可选参数可用时,当您不必在编译时绑定到(通常是未知类型)时,COM就不会那么麻烦了

另一方面,C#在编写复杂逻辑时更受欢迎,因为它的类型安全性(因为不能绕过静态类型)和简洁性

最后,这两种语言基本上是对等的,因为它们只是在边缘上有所不同。在功能上,他们同样有能力

编辑


很清楚,我并不是说VB不允许静态输入。。。简单地说,C#还不允许您绕过静态键入。这使得C#对于某些类型的体系结构更具吸引力。在4.0 C#语言规范中,您可以绕过静态类型,但可以通过定义一块动态代码来实现,而不是通过声明整个文件为“不严格”这使得它更具针对性。

C#中的新自动属性尚未为VB.NET完成。

volatile关键字仅在C#中可用。

在C#中,必须先分配变量,然后才能使用它。我想你可以关闭它,但这是默认行为

比如说:

int something;
if (something == 10)
{ ... }

是不允许的,但是VB的等价物将是。

我很惊讶C#s还没有被提及。这在VB.NET中是不允许的。

VB.NET支持CIL异常过滤器,C#不支持:


在VB中,您可以用任何名称的方法实现一个接口,即方法“Class.a”可以实现接口方法“interface.B”

在C#中,必须引入额外的间接层来实现这一点——一个调用“Class.A”的显式接口实现

当您希望“Class.A”受到
保护
和/或
虚拟
(显式接口实现两者都不是)时,这一点非常明显;如果它只是“私有”的,您可能会将其作为显式接口实现

C#:

在IL中,VB直接进行这种映射(这很好;实现方法不需要共享名称)。

我最喜欢的方法之一(和bummers)

在VB.Net中,您可以构造如下的switch/case语句:

Select Case True

   Case User.Name = "Joe" And User.Role = "BigWig" And SecretTime = "HackerTime"
      GrantCredentials()

End Select

它允许您通过开关而不是各种if/else块来评估一些复杂的评估。在C#中不能这样做。

全局变量在C#中不存在,我认为

VB9.0编译器会自动转换为“函数构造”语法。C#编译器不支持这种漂亮的文本XML语法。

VB允许对虚拟实例方法进行非虚拟调用(IL中的
call
),而C#只允许虚拟调用(IL中的
callvirt
)。考虑下面的代码:

Class Base
    Public Overridable Sub Foo()
        Console.WriteLine("Base")
    End Sub

    Public Sub InvokeFoo()
        Me.Foo()
        MyClass.Foo()
    End Sub
End Class

Class Derived : Inherits Base
    Public Overrides Sub Foo()
        Console.WriteLine("Derived")
    End Sub
End Class

Dim d As Base = New Derived()
d.InvokeFoo()
输出为:

Derived
Base

这在C#中是不可能的(如果不诉诸
反射.Emit
)。

早在2008年1月,Visual Studio杂志上就有一些有用的文章


在VB.NET中允许索引属性,但在C中不允许#


VB在函数上有可选参数

C#将仅使用C#4.0和Events关键字来获取这些,以便自动连接EventHandler

Private Sub btnOKClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click
End Sub

正如Chris Dunaway所提到的,VB.NET具有允许您定义函数和数据的模块

VB.NET具有VB6语法,用于链接DLL中的方法。例如:

Declare SetSuspendState Lib "powrprof" As Function (byval hibernate as Int32, byval forceCritical as Int32, byval disableWakeEvent) as Int32
(尽管实际声明可能需要整理)


在C#中,可以在接口中将属性声明为具有“get”,然后在具有get和set的类中实现它

public interface IFoo {
  string Bar {get;}
}

public class Foo : IFoo {
  public string Bar {get; set;}
}
在VB中,使用get对属性进行解密的等效方法是将其声明为只读。然后不能使实现可写

Public Interface IFoo 

  ReadOnly Property Bar() As String

End Interface

Public Class Foo 
   Implements IFoo

  Public Property Bar() As String Implements IFoo.Bar  'Compile error here'

End Class
我发现这是VB的一个严重限制。我经常想定义一个接口,该接口只允许其他代码读取属性,但我需要在实现的类中使用一个公共setter,供持久化程序使用。

或者VB语言的一些被误解的功能正在调用一个具有
B的函数
Private Sub btnOKClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click
End Sub
Declare SetSuspendState Lib "powrprof" As Function (byval hibernate as Int32, byval forceCritical as Int32, byval disableWakeEvent) as Int32
public interface IFoo {
  string Bar {get;}
}

public class Foo : IFoo {
  public string Bar {get; set;}
}
Public Interface IFoo 

  ReadOnly Property Bar() As String

End Interface

Public Class Foo 
   Implements IFoo

  Public Property Bar() As String Implements IFoo.Bar  'Compile error here'

End Class