Visual Basic 8.0 和 C# 2.0语言增强

Visual Basic 8.0 C# 2.0语言增强

随着.net2.0的发布好多东西都发生了变化。不仅ASP.NET本身发生了变化,IDE也有了巨大的改变,windows窗体,visual basic, c#以及其他。因为visual basicc#ASP.NET开发最为常用的两种语言,所以这一章将重点讲述Visual basicC#的变化。由于这两种语言在web应用开发中大量运用,理解语言本身的特性和其所代表的方向将至关重要。

在微软世界的web应用程序开发中一个最为重要的变化就是.NET是用真正面向对象的语言比如Visual Basic.NETC#来创建Web应用程序。你将不在局限于使用VBScript这样的解释性语言来做Web开发了。尽管它们最近引入到web应用开发的世界中,这些面向对象的语言将会继续改进,把一些新的特性带到web应用开发中来。这一章主要讲述Visual BasicC#随着.NET框架的最新版本中发布都发生了怎样的变化。虽然这里并没有覆盖到所有的语言,但是本章所讲述的内容可以直接运用到ASP.NET2.0的应用程序中。

 

变化概述

Visual BasicC#都随着.NET Framework2.0的发布发生了变化。一些变化发生在两种语言上,而另外一些则是针对一种语言。最新的vb语言是Visual Basic8.0,C#的最新版本是C#2.0.

两种语言的新特性包括下面的列表所描述的这些条目。

 

语言新特性

Visual Basic8.0

C#2.0

Generics(泛型)

Yes

Yes

Iterators(迭代器)

No

Yes

Anonymous methods(匿名方法)

No

Yes

Operator Overloading(运算符重载)

Yes

Yes (already present)

Partial Classes(不完全类)

Yes

Yes

XML documentationXML文档)

Yes

Yes (already present)

Static Classes(静态类)

No

Yes

Property Accessor Accessibility

属性访问器的可访问性

Yes

Yes

Namespace Alias Qualifier

名称空间别名限定

Yes

Yes

Unsigned Types

无符号类型

Yes

Yes (already present)

 

Default Instances

默认实例

Yes

No

 

下面讲述这些新特性以及如何在应用程序中使用新特性。

 

泛型(Generics

为了使集合(collections)成为一种强大的特性并且提高效率和可用性,Visual BasicC#中都引入了泛型。泛型的概念并不是什么新东西,它们和C#中的模板(template)很相似。你还可以在其他语言中找到泛型的影子,例如Java.NET Framework2.0中引入泛型将使用户受益非浅。

 

泛型集合(Generic Collections

泛型可以帮助你创建强类型的对象集合,降低运行时出错的可能性,提高性能,还为你在使用集合时提供智能感知特性。创建一个泛型的对象集合并不需要什么新概念。在.NET1.0中也有集中可以创建泛型的对象集合的方法。下面的例子用到了两种泛型对象容器,栈(stack)和数组(Array)类。你能说出使用泛型的优势吗?

 

清单 A-1:一个没有使用泛型的集合

VB

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

Dim myStack As New Stack

myStack.Push(St. Louis Rams)

myStack.Push(5)

Dim myArray As Array

myArray = myStack.ToArray()

For Each item As String In myArray

Label1.Text += item.ToString() & <br />

Next

End Sub

 

C#

void Page_Load(object sender, EventArgs e)

{

Stack myStack = new Stack();

myStack.Push(St. Louis Rams);

myStack.Push(5);

Array myArray;

myArray = myStack.ToArray();

foreach (string item in myArray)

{

Label1.Text += item.ToString() + <br />;

}

}

栈代表一组简单的先进先出(FIFO)的对象。在这个代码实例中用Push方法往Stack中添加了两个成员变量,一个字符串“St. Louis Rams”,还有一个整数 5,这就是把众所周知的入栈操作。如果像这样使用栈将会引起一些性能问题。

首先,每次把一个值类型比如一个整数压如栈的时候,这个值在添加到栈之前必须装箱。

其次,因为添加到栈中的条目都当作对象保存,当从栈中取出条目时必须显式把它转化为原来的类型。代码实例中的For Each循环演示了这个操作。注意你必须在把一个对象显示在Label之前显式转化为一个字符串。

装箱和类型转换都会对应用程序产生性能影响,在这里泛型就派上用场了。利用泛型可以创建具体类型的集合。System.Collections.Generic 名称空间提供了StackDictionaryStoredDictionaryListQueue这些类的泛型版本。并且,使用具体类型的集合可以避免装箱和类型转化带来的性能损失,可以在设计时进行类型检查以避免运行时的类型异常,还可以在Visual Studio中提供更好的智能感知功能。在清单A-2中演示了如何创建一个泛型的保存一组字符串的Stack

 

清单 A-2:泛型Stack

VB

<%@ Page Language=VB %>

<script runat=server>

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

Dim myStack As New System.Collections.Generic.Stack(Of String)

myStack.Push(St. Louis Rams)

myStack.Push(Indianapolis Colts)

myStack.Push(Minneapolis Vikings)

Dim myArray As Array

myArray = myStack.ToArray()

For Each item As String In myArray

Label1.Text += item & <br />

Next

End Sub

</script>

<html xmlns=http://www.w3.org/1999/xhtml >

<head runat=server>

<title>Untitled Page</title>

</head>

<body>

<form id=form 1 runat=server>

<div>

<asp:Label runat=server ID=Label 1 ></asp:Label>

</div>

</form>

</body>

</html>

 

C#

<%@ Page Language=C# %>

<script runat=server>

void Page_Load(object sender, EventArgs e)

{

Stack<string> myStack = new Stack<string>();

myStack.Push(St. Louis Rams);

myStack.Push(Indianapolis Colts);

1174

Appendix A

myStack.Push(Minneapolis Vikings);

Array myArray;

myArray = myStack.ToArray();

foreach (string item in myArray)

{

Label1.Text += item + <br />;

}

}

</script>

注意在清单A-2代码实例中,Stack类被显式转化为一个string类型的集合。在Visual Basic中,你可以通过在集合类的后面追加(of String)或者(of Integer)或者任何你要用的类型实现泛型类。在C#中,你用尖括号来制定集合的类型。你可以使用Stack<string>定义一个字符串类型的栈。如果你想定义个整型的Stack集合,只需制定Stack<int>即可。因为现在Stack类式强类型的,所以不允许往集合中添加不是字符串的条目,因此所有的这些条目没有必要转化为object类型。此外在For Each循环中,集合中的值也不需要转化回string类型。由于事先指定集合的类型,因此可以提高集合的性能。切记在使用泛型集合的时候你必须在ASP.NET页面中导入System.Collections.Generic名称空间。现在,改变清单A-2中的Stack类,用integer类型代替string类型,见清单A-3

 

清单A-3 使用整数的泛型Stack

VB

<%@ Page Language=VB %>

<script runat=server>

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

Dim myStack As New Stack(Of Integer)

myStack.Push(5)

myStack.Push(3)

myStack.Push(10)

Dim myArray As Array

myArray = myStack.ToArray()

Dim x As Integer = 0

For Each item As Integer In myArray

x += item

Next

Label1.Text = x.ToString()

End Sub

</script>

<html xmlns=http://www.w3.org/1999/xhtml >

<head runat=server>

<title>Untitled Page</title>

</head>

<body>

<form id=form 1 runat=server>

<div>

<asp:Label runat=server ID=Label 1 ></asp:Label>

</div>

</form>

</body>

</html>

 

C#

<%@ Page Language=VB %>

<script runat=server>

void Page_Load(object sender, EventArgs e)

{

Stack<int> myStack = new Stack<int>();

myStack.Push(5);

myStack.Push(3);

myStack.Push(10);

Array myArray;

myArray = myStack.ToArray();

int x = 0;

foreach (int item in myArray)

{

x += item;

}

Label1.Text = x.ToString();

}

</script>

在清单A-3中的stack类指定了包含在集合中的所有条目都是整型。在这个例子中所有的数字加起来求和并显示在Label控件上。

 

泛型方法(Generic Methods

另外一种令人激动的使用泛型的方式是把泛型运用到委托和方法上。例如,你可以创建一个使用泛型参数的方法。泛型方法可以在每次调用的时候传递不同的参数,非常有用。清单A-4演示了使用泛型的方法。

 

清单A-4:一个泛型方法。

 

VB

Public Function GenericReturn(Of T)(ByVal input As T) As T

Return input

End Function

 

C#

public T GenericReturn<T>(T t)

{

return t;

}

 

       这个简单的例子接受一个任意类型的参数并且把传递给方法的值直接返回而不管这个值是什么类型。要创建一个泛型方法,你必须在函数名的后面追加(Of T)(vb的语法)或者<T>c#语法)。这就指定了当前的方法是一个泛型方法。传递给方法的这个参数也是T类型的,返回值和函数调用是传递的参数值类型一致。在清单A-5中,注意是如何调用泛型方法的。

 

清单A-5:调用一个泛型方法

 

VB

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

Label1.Text = GenericReturn(Of String)(Hello there!)

Label2.Text = (GenericReturn(Of Integer)(5) + 5).ToString()

End Sub

 

C#

void Page_Load(object sender, EventArgs e)

{

Label1.Text = GenericReturn<string>(Hello there!);

Label2.Text = (GenericReturn<int>(5) + 5).ToString();

}

 

清单A-5中的例子演示了GenericReturn方法的两种不同的调用。第一个例子传给GenericReturn方法一个字符串,并且把调用这个方法将返回值显示在一个Label上。当用这种方式调用的时候,就好像这个泛型方法是下面那样构建的。

 

Public Function GenericReturn(ByVal item As String) As String

Return item

End Function

Or:

public string GenericReturn(string item)

{

return item;

}

 

GenericReturn的第二次调用的时候传了一个整数,然后加5,最后将计算的结果显示在Label控件上。当用这种方式调用的时候,就好像这个泛型方法是下面那样构建的。

 

Public Function GenericReturn(ByVal item As Integer) As Integer

Return item

End Function

Or:

public int GenericReturn(int item)

{

return item;

}

正如你所看到的那样,泛型功能如此强大。泛型可以运用在两种.net语言种,因为泛型已经集成到框架里了。

 

迭代器(Iterators

迭代器可以指定你的类或者集合在foreach循环中分割的时候是如何工作的。迭代器只能用于C#. Visual Basic8.0的开发者目前还不能享受这一特性。你可以像在C#1.0中那样遍历集合中的所有条目,因为条目(item)实现了GetEnumerator方法。例如你可以对ArrayList使用foreach循环,见清单A-6.

 

清单A-6:对ArrayList使用foreach循环

 

void Page_Load(object sender, EventArgs e)

{

ArrayList myList = new ArrayList();

myList.Add(St. Louis Rams);

myList.Add(Indianapolis Colts);

myList.Add(Minneapolis Vikings);

foreach (string item in myList)

{

Response.Write(item.ToString() + <br />);

}

}

代码将添加到ArrayList中的三个值都写到浏览器屏幕上。迭代器可以用foreach循环来遍历你自己的条目比如类。要想这么做,你只需创建一个实现了IEnuerable接口的类。第一步是创建在你的web解决方案中创建一个类,先在你的解决方案中创建一个目录命名为Code,然后将.cs类文件放到Code目录中。见清单A-1.

 

清单A-7:创建一个可以使用foreach循环的类

 

using System;

using System.Collections;

public class myList:IEnumerable

{

internal object[] elements;

internal int count;

public IEnumerator GetEnumerator()

{

yield return St. Louis Rams;

yield return Indianapolis Colts;

yield return Minneapolis Vikings;

}

}

这个mylist类导入了System.Collections 名称空间这样就可以使用IEnumerable接口了。Myclass类用一个GetEnumerator方法实现了enumerator模式,这个方法返回一个被定义成IEnuerable的值。每个条目用yield return命令返回。现在mylist类准备好了,你可以初始化这个类然后用foreach循环来遍历这个类的集合了。见清单A-8.

 

清单A-8:遍历mylist

void Page_Load(object sender, EventArgs e)

{

myList IteratorList = new myList();

foreach (string item in IteratorList)

{

Response.Write(item.ToString() + <br />);

}

}

这个ASP.NET Page_Load事件只是简单创建一个myList的集合的一个实例然后用foreach循环遍历这个集合。因为mylist类实现了IEnumerable接口所以可以这么做。当运行页面的时候通过jield return命令从myList类中返回所有条目显示在浏览器中。

 

有趣的是你可以对你的自定义类myList使用C#提供的泛型能力,你可以使用泛型避免当前构建中的装箱和拆箱。清单A-9对前面的例子A-7做了一点改变.

 

清单A-9:创建一个可以使用foreach循环的泛型类

using System;

using System.Collections;

using System.Collections.Generic;

public class myList : IEnumerable<string>

{

internal object[] elements;

internal int count;

public IEnumerator<string> GetEnumerator()

{

yield return St. Louis Rams;

yield return Indianapolis Colts;

yield return Minneapolis Vikings;

}

}

 

 

匿名方法(Anonymous Methods

C#语言的另一个特性是匿名方法。匿名方法使用委托来代替创建一个全新的方法。匿名方式可以用几种方式处理。在类文件里的其他地方可以找到不使用匿名方法而是用代理引用方法的相关代码。在清单A-10中,当委托被引用时(被一个button-click事件),委托会调用它指向的方法。

清单A-10:传统方式使用委托。

void Page_Load(object sender, EventArgs e)

{

this.Button1.Click += ButtonWork;

}

void ButtonWork(object sender, EventArgs e)

{

Label1.Text = Welcome to the camp, I guess you all know why youre here.;

}

在清单A-10中的代码实例中,你看到一个ButtonWork方法在Page_Load中被委托调用。匿名方法可以将方法直接放到代理声明的位置以避免创建单独的方法。清单A-11中是一个使用匿名方法的例子。

 

清单A-11:用委托实现匿名方法。

void Page_Load(object sender, EventArgs e)

{

this.Button1.Click += delegate(object myDelSender, EventArgs myDelEventArgs)

{

Label1.Text = Welcome to the camp, I guess you all know why youre here.;

};

}

当使用匿名方法的时候,没有必要创建独立的方法,取而代之的是你只需把必要的代码放到委托声明的后面即可。代理的声明和步骤放到大括号中结尾用分号结尾。在匿名方法中可以使用变量或者类。见清单A-12.

 

清单A-12:使用(代理)外部的对象

string myString = Out of scope item.;

void Page_Load(object sender, EventArgs e)

{

this.Button1.Click += delegate(object myDelSender, EventArgs myDelEventArgs)

{

Label1.Text = myString;

};

}

然后在匿名方法中你可以使用一个Page_Load事件之外的一个变量,你还可以在匿名方法中使用在解决方案中其他的类和方法。

 

运算符重载(Operator Overloading

 

使用运算符重载你可以像在系统类中那样在自己的类中定义+,-,*,/和其他的一些运算符。这个特性早就存在于C#中了,现在在visual basic8.0中也可以使用了。当使用操作符重载时可以对你的类中的对象像字符串和整数那样直接使用运算符。如果你想在类中使用这一特性,只需使用创建一个新的方法把Operator关键字放在你想重载的运算符的前面。清单A-13是一个使用Operator方法的例子。

 

清单A-13:一个使用运算符重载方法的例子。

 

Public Shared Operator +(ByVal Left As Point, ByVal Right As Size) As Point

Return New Point(Left.X + Right.Width, Left.Y + Right.Height)

End Operator

Public Shared Operator -(ByVal Left As Point, ByVal Right As Size) As Point

Return New Point(Left.X Right.Width, Left.Y Right.Height)

End Operator

 

Visual Basic中有两种类型的运算符可以重载,一元和两元运算符。可以重载的一元运算符包括+  -  Not  IsTrue  IsFalse  Widening Narrowing.可以重载的两元运算符包括 +  - / / & Like Mod Or Xor ^ <<  >> =  <> > < >= <=

 

全局名称空间限定词(Global Namespace Qualifiers)

.NET1.0语言中的一个问题是,开发者或者一些常用的代码生成工具无法搜索到根名称空间层次的类型。Visual Basic 8.0 C#2.0使用一个新的关键字提供了这一问题的解决方案。在Visual BasicGlobal关键字代表最顶层名称空间以避免相似名称空间带来的名称空间冲突。一个使用Global关键字的例子:Global.System.String。在C#中全局名称空间限定词引入了::关键字如:::System.String。使用全局名称空间限定词的优势在于现在你可以创建名称空间来模仿一个Framework名称空间而不必和.NET框架内置名称空间造成冲突。例如:你现在可以在你的应用程序中创建下面的名称空间。

namespace MyCompany

{

namespace System

{

class String

{

static void Main ()

{

::System.String copy = ::System.String.Copy(Hello);

}

}

}

}

使用限定词可以使应用程序中的名称空间于根名称空间(system)区分开来。

 

不完整类型(Partial Classes

不完整类是包含在.NET Framework 2.0中的一个新特性并且在C#Visual Basic 8.0都是有效的。这些类可以分开到多个类文件中,后期编译的时候会合并成一个类。不完整类是ASP.NET新的code-behind模式如此简单的秘密所在。在ASP.NET1.0/1.1中,code-behind模式包含一些标记为machine-generated code的代码,并且隐藏在#REGION标记中。现在ASP.NET2.0code-behind的模式相当简单。清单A-14中演示了使用不完全类的新的code-behind模式。

 

清单A-14:使用不完整类实现新的code-behind模式。

 

VB

Imports Microsoft.VisualBasic

Namespace ASP

Partial Class TestPage

Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)

Label1.Text = Hello & Textbox1.Text

End Sub

End Class

End Namespace

C#

using System;

namespace ASP {

public partial class TestPage

{

void Button1_Click (object sender, System.EventArgs e)

{

Label1.Text = Hello + Textbox1.Text;

}

}

}

 

Code-behind文件只包含一个简单的button-click事件。如果你和ASP.NET1.0/1.1code-behind模式中的designer-code你会发现两者之间存在的巨大差异。原来的code-behind文件发生了什么变化呢?这个文件依然存在,但是使用不完整类文件中不是把必要的代码保存在一个独立的类文件中。在编译的时候清单A-14中的代码会和其他的类文件合并到一起。结果显示了ASP.NET2.0中的code-behind文件可以有几个简单的对象组成。不完整类可以在visual basic中使用Partial关键字在C#中使用partial来创建。Partial关键字放到所有将会被合并成一个类的所有类的class关键字的前面。除了在ASP.NET2.0 code-behind模式可以用不完整类以外,普通的类文件也可以使用这一技术。A-15A-15中的两个类可以做为一个类的两个partial类。

 

清单A-15:第一个类

 

VB

Public Class Calculator

Public Function Add(ByVal a As Integer, ByVal b As Integer)

Return (a + b)

End Function

End Class

 

C#

public class Calculator

{

public int Add(int a, int b)

{

return a + b;

}

}

 

清单A-16:第二个类

 

VB

Partial Class Calculator

Public Function Subtract(ByVal a As Integer, ByVal b As Integer)

Return (a - b)

End Function

End Class

 

C#

public partial class Calculator

{

public int Subtract(int a, int b)

{

return a - b;

}

}

当这两个独立的文件在编译时会合并成一个对象。清单A-15中的类和普通的类的构建方式一样,只是加了partial关键字以便于做为一个常规完整类的一部分。当使用Calculator类创建一个实例的时候,这个实例同时包含AddSubstract两个方法。见图A-1.

 partial class合并的效果

Visual Basic xml文档(Visual Basic XML Documentation

c#一样vb8也包含从vb文件的注释中创建XML文档的功能。Vb中用三个连续的注释符号(’)来表示注释标记。C#使用三个反写杠来表示。VB代码中的注释可以被转化为xml文档。清单A-17演示了如何在代码中使用XML文档。

 

清单A-17VB代码中的可以被转化为xml文档的注释

Imports Microsoft.VisualBasic

‘’’ <summary>My Calculator Class</summary>

Public Class Class1

‘’’ <summary>This Add method returns the value of two numbers

‘’’ added together</summary>

‘’’ <param name=a>First number of the collection of numbers to

‘’’ be added</param>

‘’’ <param name=b>Second number of the collection of numbers to

‘’’ be added</param>

Public Function Add(ByVal a As Integer, ByVal b As Integer)

Return (a + b)

End Function

End Class

 

Visual Basic 8.0编译器现在包含一个新的/doc命令,和c#生成xml文档的方式很相似。当用/doc命令来编译vb代码的时候,编译器会在编译过程中生成xml文档。

 

C#中的静态类(Static Classes C#)

C#现在支持静态类的概念,在静态类中所有的成员必须声明成static类型。静态类意味着通过只包括静态成员来取代原来使用private构造函数的密封类的设计模式。清单A-18演示了如何创建一个静态类。

 

清单A-18:用c#创建一个静态类。

public sealed static class Settings

{

// class methods

}

静态类意味着现在编译器可以捕获到所有实例的在类中声明了的方法。

 

属性访问器(Property Accessors

在用.NET1.0语言写属性的时候,属性的settergetter的访问级别必须相同。这样当你创建一个只读的public属性,同时又想在类的内部使用私有的setter的逻辑时就会出现问题。在.NET2.0中,Visual BasicC#都可以分别指定gettersetter的访问器,见清单A-19

 

清单A-19:使用属性访问器。

 

VB

Private firstname As String

Public Property FirstName() As String

Get

Return _firstname

End Get

Friend Set(ByVal value As String)

If value.Trim.Length > 0 Then

_firstname = value.Trim

Else

value = Default Name

End If

End Set

End Property

 

C#

private string firstname;

public string FirstName

{

get

{

return_firstname;

}

internal set

{

if (value.Trim().Length > 0)

{

_firstname = value.Trim();

}

else

{

value = Default Name;

}

}

}

 

无符号类型(Unsigned Types)

现在Visual basic也提供了对无符号类型的支持,例如SByteUShortUIntegerULlong。无符号类型和常规类型一样工作,只是无符号类型只能存储正数。无符号类型在调用Win32 API的时候非常有用。这个函数要求传递一个UInteger类型,并且返回值也是UInteger类型。

 

清单A-20:在Visual Basic中使用无符号类型。

Private Const uintOK As UInteger = 0

Private Declare Auto Function WinMessageBox Lib _

user32.dll Alias MessageBox _

(ByVal hWnd As Integer, ByVal lpText As String, _

ByVal lpCaption As String, ByVal uType As UInteger) _

As UInteger

Public Function DirectMessageBox(ByVal message As String, _

ByVal caption As String) As String

Dim r As UInteger = WinMessageBox(0, message, caption, uintOK)

If (r=0) Then

Return OK

End If

If (r=8) Then

Return Cancel

End If

End Function

 

默认实例(Default Instances

Visual Basic.NET的另一个变化妨碍了开发者从VB6过渡到vb.net,因为缺少窗体的默认实例。如果想创建一个特定的窗体,你必须先创建一个窗体的实例。

Dim frm As New Form2

frm.Show()

Visual Basic现在支持默认实例,你可以用下面熟悉的语法。

Visual Basic now supports form default instances, so you can use the familiar syntax:

Form2.Show()

 

Visual Basic中的新关键字(New Visual Basic Keywords)

Visual Basic 8.0引入了一些可以用于ASP.NET2.0的应用程序中的新关键字。语言中引入这些关键字可以简化一下常用的工作,比如使用循环或者尽可能早的释放资源。看一下Visual Basic的一些新特性。

 

Continue

Continue语句是vb语言一个显著的新特性,使用continue可以在特定场合使用循环更具逻辑性。在使用循环的时候,有时候当不满足条件是需要停止条件流然后直接移动到下一个条目上。这样的逻辑有了continue语句实现起来更方便了。清单A-21给了一个使用continue语句的例子。

 

清单A-21:使用continue语句。

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

Dim myString As String

Dim count As Integer = 0

myString = The St. Louis Rams will go to the Superbowl this year.

For i As Integer = 0 To (myString.Length() - 1)

If (myString(i).Equals(“ “c)) Then Continue For

count += 1

Next

Label1.Text = There are & count.ToString() & _

characters used (minus spaces).

End Sub

 

这个小例子记录一个完整字符串中除空格以外字符的个数。如果遇到一个空格,continue语句就会停止执行循环里的操作直接跳到集合中的下一个条目。在这个例子中你可以用嵌套的if语句来检验字符,但是用多个嵌套的if语句容易让人迷惑。使用continue语句可以是for循环中的程序逻辑明显而且干净。Continue关键字不只是用于for循环,而且可以用到遍历集合中条目的其他语言特性,比如dowhile语句。下面部分演示了如何在四种可能的选择中使用continue语句。

For [statement]

...

If [statement] Then Continue For

...

Next

For Each [statement]

...

If [statement] Then Continue For

...

Next

Do While [statement]

...

If [statement] Then Continue Do

...

Loop

While [statement]

...

If [statement] Then Continue While

...

End While

 

Using

尽管C#开发这早就可以使用using关键字定义一个对象的生存域了,现在visual basic中这个新的using关键字也为vb开发者提供了这一特性。 Visual Basic中的Using关键字可以尽快释昂贵的资源,而不是在方法执行的时候一直放在内存里。现在像数据库连接对象和com包装器这写昂贵的资源可以在使用完毕马上释放,而不是等待垃圾收集器来收集。清单A-22演示了一个使用using关键字的小例子。

清单A-22:使用using关键字。

Using myConn As New SqlConnection

Work with the SqlConnection object

End Using

在清单A-22中用using而不是Dim来声明一个SqlConnection对象的实例。如果你使用了using关键字那必须使用End Using语句做为结束语句。在End Using语句的位置SqlConnection对象从内存释放。

 

My

One of the most challenging issues a developer faces when using the .NET Framework is the sheer size of the class library. Knowing where to find the proper class for a particular function in the Framework can prove challenging. If you do find it, figuring out its usage can be just as challenging. In order to help developers overcome this problem, Visual Basic has added the My keyword. This new keyword is a novel concept that is designed to quickly give you access to a large variety of resources you may need to access when developing your applications.

The My keyword is divided into several main areas of functionality, but using the keyword can be a bit

deceiving depending on the type of project you are working with. For example, if you are working in an ASP.NET project and you use the My keyword, you see five objects available for you to use. If you switch to working in a Windows Forms application, the objects available to you using the My keyword are slightly different. The My keyword understands the type of project you are working with and can present you the appropriate objects based on the resources available to you in that project type. Figure A-2 shows how IntelliSense for the My keyword differs for an ASP.NET project type.

对于一个开发者来说使用.NET Framework其中一个很大的挑战是如此多的类库。在.NET框架中找到一个具有某种功能的类是很难的,即使找到了明白其用法也不容易。为了帮助开发者解决这一难题,Visual Basic加了My这个关键字。这个新的关键字是个很新颖的概念,借助这一关键字你可以快速访问你在开发应用程序过程中需要访问的大量的资源。My关键字在功能上有几个部分组成,在开发不同的项目的时候其表现是不同的。

 

例如,如果你开发ASP.NET项目时使用My关键字,你会看到5个可用的对象变量。

图A-2

 

当开发windows’窗体应用程序时,可用的对象变量会稍微不同。My关键字可以根据根据资源变量来确定你当前的工程然后对应的对象。

A-3显示了在windows窗体应用程序中My关键字的智能感知

A-3

因为这里主要讲的式ASP.NET,因此列表中只列除了在ASP.NET应用程序中My关键字的只能感知提供的几个对象。

 

对象

描述

Computer

访问主机及其资源,服务和数据。

Log  

访问应用程序日志

Request

访问当前的web request

Response

访问当前的web response

User

访问当前用户的安全上下文

 

下面的部分演示了如何使用这几种不同的My对象来完成不同的操作。

Retrieve the computer name

Dim computername As String = My.Computer.Info.OSFullName

Write a message to the applications event log listeners

My.Log.WriteEntry(This page has loaded., Diagnostics.TraceEventType.Information)

Retrieve the requesting browsers User-Agent string

Dim agent As String = My.Request.Browser.Browser

Set the CacheControl proerty to allow

proxy servers to cache this content

My.Response.CacheControl = Public

Retrieve the current ahtuenticated users name

Dim username As String = My.User.Name

请记住My关键字所提供的所有功能都是.net框架提供的。

 

IsNot

IsNot运算符和Is运算符正好相反。这样可以在比较表示式中就消除了Not运算符。

If myObject1 IsNot myObject2 Then

 

TryCast

Visual Basic.NET中有两种类型转换的方法,CType或者DirectCast。这两种方法的问题是如果对象部分不能转换时会引发异常。使用TryCast方法可以执行转换但是没有必要去理会无效的转换引发异常。取而代之的是,当转换无效时将返回Nothing值,见清单A-23

清单A-23:在Visual Basic 8.0中使用TryCast

cust = TryCast(obj, Customer)

If cust IsNot Nothing Then

use the Customer object

End If

这个关键字和C#中的as关键字是等价的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值