Visual Basic中允许的';C#中禁止使用s(或反之亦然)?
这是与代码相关的,编译器允许您使用一种语言,但不允许您使用另一种语言(例如,VB中的可选参数在C#中不存在)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.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语言“功能”:
- 可选参数
- 后期装订
- 案例不敏感
很清楚,我并不是说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在函数上有可选参数 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