VB.NET的隐藏功能?VB.NET的隐藏功能?(Hidden Features of VB.NET

2019-05-13 13:57发布

我经历学到了很多浏览的C#隐藏的功能 ,并很惊讶,当我找不到VB.NET类似的东西。

那么,什么是它的一些隐藏或鲜为人知的特点是什么?

Answer 1:

Exception When从句主要是未知的。

试想一下:

Public Sub Login(host as string, user as String, password as string, _
                            Optional bRetry as Boolean = False)
Try
   ssh.Connect(host, user, password)
Catch ex as TimeoutException When Not bRetry
   ''//Try again, but only once.
   Login(host, user, password, True)
Catch ex as TimeoutException
   ''//Log exception
End Try
End Sub


Answer 2:

自定义Enum小号

一个VB的真正隐藏的功能是completionlist可用于创建自己的XML文档标签Enum样类型的扩展功能。 此功能不会在C#中工作,虽然。

从我最近的代码的一个例子:

'
''' <completionlist cref="RuleTemplates"/>
Public Class Rule
    Private ReadOnly m_Expression As String
    Private ReadOnly m_Options As RegexOptions

    Public Sub New(ByVal expression As String)
        Me.New(expression, RegexOptions.None)
    End Sub

    Public Sub New(ByVal expression As String, ByVal options As RegexOptions)
        m_Expression = expression
        m_options = options
    End Sub

    Public ReadOnly Property Expression() As String
        Get
            Return m_Expression
        End Get
    End Property

    Public ReadOnly Property Options() As RegexOptions
        Get
            Return m_Options
        End Get
    End Property
End Class

Public NotInheritable Class RuleTemplates
    Public Shared ReadOnly Whitespace As New Rule("\s+")
    Public Shared ReadOnly Identifier As New Rule("\w+")
    Public Shared ReadOnly [String] As New Rule("""([^""]|"""")*""")
End Class

现在,值分配给声明为一个变量时Rule ,该IDE提供了可能的值从智能感知列表RuleTemplates

/编辑:

由于这是依赖于IDE功能,很难说明如何,这看起来当您使用它,但我就用截图:

在动作完成列表http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png

事实上,智能感知是100%相同,你使用时,你得到什么Enum



Answer 3:

你是否注意到了Like比较运算符?

Dim b As Boolean = "file.txt" Like "*.txt"

更多来自MSDN

Dim testCheck As Boolean

' The following statement returns True (does "F" satisfy "F"?)'
testCheck = "F" Like "F"

' The following statement returns False for Option Compare Binary'
'    and True for Option Compare Text (does "F" satisfy "f"?)'
testCheck = "F" Like "f"

' The following statement returns False (does "F" satisfy "FFF"?)'
testCheck = "F" Like "FFF"

' The following statement returns True (does "aBBBa" have an "a" at the'
'    beginning, an "a" at the end, and any number of characters in '
'    between?)'
testCheck = "aBBBa" Like "a*a"

' The following statement returns True (does "F" occur in the set of'
'    characters from "A" through "Z"?)'
testCheck = "F" Like "[A-Z]"

' The following statement returns False (does "F" NOT occur in the '
'    set of characters from "A" through "Z"?)'
testCheck = "F" Like "[!A-Z]"

' The following statement returns True (does "a2a" begin and end with'
'    an "a" and have any single-digit number in between?)'
testCheck = "a2a" Like "a#a"

' The following statement returns True (does "aM5b" begin with an "a",'
'    followed by any character from the set "L" through "P", followed'
'    by any single-digit number, and end with any character NOT in'
'    the character set "c" through "e"?)'
testCheck = "aM5b" Like "a[L-P]#[!c-e]"

' The following statement returns True (does "BAT123khg" begin with a'
'    "B", followed by any single character, followed by a "T", and end'
'    with zero or more characters of any type?)'
testCheck = "BAT123khg" Like "B?T*"

' The following statement returns False (does "CAT123khg" begin with'
'    a "B", followed by any single character, followed by a "T", and'
'    end with zero or more characters of any type?)'
testCheck = "CAT123khg" Like "B?T*"


Answer 4:

类型定义

VB知道原始的一种typedef通过Import别名:

Imports S = System.String

Dim x As S = "Hello"

与一般类型一起使用时,这是更加有用:

Imports StringPair = System.Collections.Generic.KeyValuePair(Of String, String)


Answer 5:

哦! 并且不要忘记XML文本 。

Dim contact2 = _
        <contact>
          <name>Patrick Hines</name>
          <%= From p In phoneNumbers2 _
            Select <phone type=<%= p.Type %>><%= p.Number %></phone> _
          %>
        </contact>


Answer 6:

对象的初始化是在那里呢!

Dim x as New MyClass With {.Prop1 = foo, .Prop2 = bar}


Answer 7:

DirectCast

DirectCast是一个奇迹。 在表面上,它的工作原理类似于CType在于它的对象从一种类型转换成另算。 然而,它的工作原理是更严格的规则。 CType因此它的实际行为往往是不透明的,这是一种执行转换它并不明显。

DirectCast只支持两种不同的操作:

  • 值类型的拆箱,和
  • 向上转型中的类层次结构。

任何其他剧组将无法正常工作(例如试图拆箱一个IntegerDouble ),并会导致编译时/运行时错误(视情况而定,哪些可以通过静态类型检查来检测)。 因此,我使用DirectCast只要有可能,因为这最能抓住我的意图:根据不同的情况,我要么需要拆箱已知类型的值或执行上溯造型。 故事结局。

使用CType ,在另一方面,离开代码想知道什么是程序员真正意图,因为它解决了各种不同的操作,包括调用用户定义的代码的读者。

为什么这是一个隐藏的功能? VB的团队出版了一本指南1不鼓励使用DirectCast为了使代码更均匀(即使它实际上更快!)。 我认为这是一个坏的指导方针应该是相反的: 只要有可能,有利于DirectCast在更一般的CType运营商。 它使代码更清晰。 CType ,在另一方面,应该只,如果这确实是有意调用,即当一个缩小CType操作(参见运算符重载 )应调用。


1)我无法想出一个链接到该准则,但我发现保罗维克的就可以采取 (VB的团队的首席开发者):

在现实世界中,你很少会注意到其中的差别,所以你还不如用更灵活的转换操作符,如CTYPE,CINT等去


(编辑由扎克:这里了解更多: ?我应该如何在VB.NET中投 )



Answer 8:

If条件和接合操作

我不知道如何隐藏你叫它,但IIF([表达],[值,如果真],[如果值为false])为目标函数可以指望。

它与其说是隐藏的不推荐 ! VB 9有If运营商是好多了,正好可以作为(取决于你想要什么)C#的条件和凝聚运营商:

Dim x = If(a = b, c, d)

Dim hello As String = Nothing
Dim y = If(hello, "World")

编辑,以显示另一个例子:

这将工作If()但会导致异常IIf()

Dim x = If(b<>0,a/b,0)


Answer 9:

这是一个很好的一个。 内VB.Net Select Case语句是非常强大的。

当然有标准

Select Case Role
  Case "Admin"
         ''//Do X
  Case "Tester"
         ''//Do Y
  Case "Developer"
         ''//Do Z
  Case Else
       ''//Exception case
End Select

但是,还有更多...

你可以做的范围:

Select Case Amount
 Case Is < 0
    ''//What!!
 Case 0 To 15
   Shipping = 2.0
 Case 16 To 59
    Shipping = 5.87
 Case Is > 59
    Shipping = 12.50
 Case Else
    Shipping = 9.99
 End Select

甚至更多...

你可以(虽然可能不是一个好主意)做多变量布尔检查:

Select Case True
 Case a = b
    ''//Do X
 Case a = c
    ''//Do Y
 Case b = c
    ''//Do Z
 Case Else
   ''//Exception case
 End Select


Answer 10:

保护我用所有的时间一个主要的时间是随着关键字:

With ReallyLongClassName
    .Property1 = Value1
    .Property2 = Value2
    ...
End With

我只是不喜欢打字比我更需要!



Answer 11:

最好的和简单的CSV解析器:

Microsoft.VisualBasic.FileIO.TextFieldParser

通过向一个Microsoft.VisualBasic程序参照,这可以在任何其他.NET语言,例如C#被用于



Answer 12:

  • AndAlso / OrElse运算的逻辑运算符

(编辑:这里了解更多: 我应该总是使用AndAlso和OrElse运算经营者? )



Answer 13:

静态成员的方法。

例如:

Function CleanString(byval input As String) As String
    Static pattern As New RegEx("...")

    return pattern.Replace(input, "")
End Function

在上面的功能,模式正则表达式将只一次无论功能调用多少次创建。

另一个用途是保持“随机”围绕一个实例:

Function GetNextRandom() As Integer
    Static r As New Random(getSeed())

    Return r.Next()
End Function 

此外,这是不一样的只是它声明为类的共享成员; 项目申报这样的保证是线程安全的。 它不会因为中表达永远不会改变这种情况下无所谓,但也有其他地方可能。



Answer 14:

在VB中有这些运营商之间的不同:

/Double
\Integer忽略其余

Sub Main()
    Dim x = 9 / 5  
    Dim y = 9 \ 5  
    Console.WriteLine("item x of '{0}' equals to {1}", x.GetType.FullName, x)
    Console.WriteLine("item y of '{0}' equals to {1}", y.GetType.FullName, y)

    'Results:
    'item x of 'System.Double' equals to 1.8
    'item y of 'System.Int32' equals to 1
End Sub


Answer 15:

我真的很喜欢这是在Visual Basic 2005 推出了“我的”命名空间是一个快捷方式的信息和功能几组。 它提供了快速和直观的访问以下类型的信息:

  • My.Computer:获得有关计算机,如文件系统,网络,设备,系统信息等,它提供了访问一些包括My.Computer.Network,My.Computer.FileSystem,而且很重要的资源信息我.Computer.Printers。
  • My.Application:访问相关的特定的应用,如名称,版本,当前目录等信息
  • My.User:访问与当前验证的用户信息。
  • My.Resources:获得由居住在资源文件中的一个强类型的方式应用程序使用的资源。
  • My.Settings:在一个强类型的方式访问应用程序的配置设置。


Answer 16:

自定义事件

虽然很少有用的,事件处理可高度定制:

Public Class ApplePie
    Private ReadOnly m_BakedEvent As New List(Of EventHandler)()

    Custom Event Baked As EventHandler
        AddHandler(ByVal value As EventHandler)
            Console.WriteLine("Adding a new subscriber: {0}", value.Method)
            m_BakedEvent.Add(value)
        End AddHandler

        RemoveHandler(ByVal value As EventHandler)
            Console.WriteLine("Removing subscriber: {0}", value.Method)
            m_BakedEvent.Remove(value)
        End RemoveHandler

        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            Console.WriteLine("{0} is raising an event.", sender)
            For Each ev In m_BakedEvent
                ev.Invoke(sender, e)
            Next
        End RaiseEvent
    End Event

    Public Sub Bake()
        ''// 1. Add ingredients
        ''// 2. Stir
        ''// 3. Put into oven (heated, not pre-heated!)
        ''// 4. Bake
        RaiseEvent Baked(Me, EventArgs.Empty)
        ''// 5. Digest
    End Sub
End Class

这可以然后在下面的方式进行测试:

Module Module1
    Public Sub Foo(ByVal sender As Object, ByVal e As EventArgs)
        Console.WriteLine("Hmm, freshly baked apple pie.")
    End Sub

    Sub Main()
        Dim pie As New ApplePie()
        AddHandler pie.Baked, AddressOf Foo
        pie.Bake()
        RemoveHandler pie.Baked, AddressOf Foo
    End Sub
End Module


Answer 17:

我刚刚找到了一篇文章谈到了“!” 运营商,也知道作为“字典查询经营者”。 下面是文章摘录于: http://panopticoncentral.net/articles/902.aspx

技术名称为! 经营者是“字典查询操作。” 字典是由一个键而不是数字索引,就像在英文字典中的条目由你想定义的字索引的方式任何集合类型。 一个字典类型的最常见的例子是System.Collections.Hashtable,它允许你(键,值)对加入到哈希表中,然后检索使用按键值。 例如,下面的代码添加三个条目一个哈希表,并使用该密钥“猪肉”看上去起来之一。

Dim Table As Hashtable = New Hashtable
Table("Orange") = "A fruit"
Table("Broccoli") = "A vegetable"
Table("Pork") = "A meat" 
Console.WriteLine(Table("Pork"))

该! 运营商可以使用使用字符串索引它的价值可以从任何类型的字典中查找值。 后标识符! 被用作在查找操作的关键。 所以上面的代码可以代替已被写入:

Dim Table As Hashtable = New Hashtable
Table!Orange = "A fruit"
Table!Broccoli = "A vegetable"
Table!Pork = "A meat"
Console.WriteLine(Table!Pork)

第二个例子是完全相当于第一,但只是看起来要好很多,至少我的眼睛。 我发现有很多的地方! 可以使用,特别是当它涉及到XML和网络,那里只是吨是由字符串索引的集合。 一个不幸的限制是继事情! 仍然是一个有效的标识符,因此,如果您想为要使用的密钥字符串有一些无效的标识字符,你不能用! 运营商。 (你不能,例如,说“表!AB $ CD = 5”,因为在$标识符是不合法的。)在VB6和之前,你可以使用括号逃避无效标识符(即“表![AB $ CD]“),但是当我们开始使用方括号逃跑关键字,我们失去了这个能力。 在大多数情况下,然而,这是不是一个太大的限制。

要获得真正的技术,X Y!工作,如果x的,需要一个字符串或对象作为参数的默认属性。 在这种情况下,X!y被改为x.DefaultProperty( “Y”)。 一个有趣的方面值得注意的是,有在语言的词法一个特殊的规则,以使这一切工作。 该! 字符也被用作在语言中的类型的字符,和类型的字符运算符之前食用。 因此,没有一个特殊的规则,X!Y就应该被扫描为“x!y”的,而不是“X!Y”。 幸运的是,由于是在连续两个标识符是有效的语言没有地方,现在我们引入了规则,如果接下来的文字后! 是一个标识符的开始,我们考虑的! 是操作者,而不是一个类型的字符。



Answer 18:

这是内置的,并有一定的优势超过C#。 实现接口的方法,而不必使用相同的名称的能力。

如:

Public Sub GetISCSIAdmInfo(ByRef xDoc As System.Xml.XmlDocument) Implements IUnix.GetISCSIInfo

End Sub


Answer 19:

强制BYVAL

在VB中,如果你换一个额外的括号你的论点,你可以重写方法的ByRef声明,并把它变成一个BYVAL。 例如,下面的代码产生4,5,5代替4,5,6-

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim R = 4
    Trace.WriteLine(R)
    Test(R)
    Trace.WriteLine(R)
    Test((R))
    Trace.WriteLine(R)
End Sub
Private Sub Test(ByRef i As Integer)
    i += 1
End Sub

参见参数不被程序调用修改-基础变量



Answer 20:

按名称传递参数,所以他们重新排序

Sub MyFunc(Optional msg as String= "", Optional displayOrder As integer = 0)

    'Do stuff

End function

用法:

Module Module1

    Sub Main()

        MyFunc() 'No params specified

    End Sub

End Module

“:=”按任意顺序参数说明也可以使用被叫:

MyFunc(displayOrder:=10, msg:="mystring")


Answer 21:

using语句是新的VB 8,C#从一开始就受够了。 它要求自动地处理你。

Using lockThis as New MyLocker(objToLock)

End Using


Answer 22:

进口别名也是知之甚少:

Import winf = System.Windows.Forms

''Later
Dim x as winf.Form


Answer 23:

考虑下列事件的声明

Public Event SomethingHappened As EventHandler

在C#中,您可以通过下面的语法检查活动的用户:

if(SomethingHappened != null)
{
  ...
}

然而,VB.NET编译器不支持此功能。 它实际上是创建一个隐藏的私有成员字段,它是不可见的智能感知:

If Not SomethingHappenedEvent Is Nothing OrElse SomethingHappenedEvent.GetInvocationList.Length = 0 Then
...
End If

更多信息:

http://jelle.druyts.net/2003/05/09/BehindTheScenesOfEventsInVBNET.aspx http://blogs.msdn.com/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug -rothaus.aspx



Answer 24:

如果你需要一个变量名以匹配关键字的是,用方括号括起来。 不NEC。 最好的做法,但 - 但它可以用在刀刃上。

Class CodeException
Public [Error] as String
''...
End Class

''later
Dim e as new CodeException
e.Error = "Invalid Syntax"

例如,从实施例的评论(@Pondidum):

Class Timer
Public Sub Start()
''...
End Sub

Public Sub [Stop]()
''...
End Sub


Answer 25:

有一对夫妇约XML文本的答案,但不是这种特殊情况下:

您可以使用XML文本包围,否则将需要转义字符串文字。 包含双引号,比如字符串文字。

取而代之的是:

Dim myString = _
    "This string contains ""quotes"" and they're ugly."

你可以这样做:

Dim myString = _
    <string>This string contains "quotes" and they're nice.</string>.Value

这是,如果你正在测试一个字面的CSV解析特别有用:

Dim csvTestYuck = _
    """Smith"", ""Bob"", ""123 Anywhere St"", ""Los Angeles"", ""CA"""

Dim csvTestMuchBetter = _
    <string>"Smith", "Bob", "123 Anywhere St", "Los Angeles", "CA"</string>.Value

(您不必使用<string>标签,当然,你可以用你喜欢的任何标记。)



Answer 26:

日期时间可通过与周围的#日进行初始化

Dim independanceDay As DateTime = #7/4/1776#

您还可以使用类型推断这个语法一起

Dim independanceDay = #7/4/1776#

这比使用构造更好的很多

Dim independanceDay as DateTime = New DateTime(1776, 7, 4)


Answer 27:

你可以有2行代码中只有一行。 因此:

Dim x As New Something : x.CallAMethod


Answer 28:

可选参数

选配这么比创建一个新的过载,如要容易得多:

Function CloseTheSystem(Optional ByVal msg AS String = "Shutting down the system...")
   Console.Writeline(msg)
   ''//do stuff
End Function


Answer 29:

在VB.Net标题案例可以通过一个老VB6 FXN来实现:

StrConv(stringToTitleCase, VbStrConv.ProperCase,0) ''0 is localeID


Answer 30:

与参数属性

我一直在做一些C#编程,并发现一个特点,是缺少VB.Net了,但这里没有提到。

(以及C#的限制)如何做到这一点的例子可以看出在: 在C#中使用典型的获取设置属性...带参数

我摘录了从答案的代码:

Private Shared m_Dictionary As IDictionary(Of String, Object) = _
             New Dictionary(Of String, Object)

Public Shared Property DictionaryElement(ByVal Key As String) As Object
    Get
        If m_Dictionary.ContainsKey(Key) Then
            Return m_Dictionary(Key)
        Else
            Return [String].Empty
        End If
    End Get
    Set(ByVal value As Object)
        If m_Dictionary.ContainsKey(Key) Then
            m_Dictionary(Key) = value
        Else
            m_Dictionary.Add(Key, value)
        End If

    End Set
End Property


文章来源: Hidden Features of VB.NET?