重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
调用过程,调用过程有诸多技巧,它们与过程的类型、位置以及在应用程序中的使用方式有关。下面说明如何调用 Sub 过程和 Function 过程。
成都创新互联是一家专业提供东营企业网站建设,专注与成都网站设计、网站建设、H5响应式网站、小程序制作等业务。10年已为东营众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
调用 Sub 过程
与 Sub 过程不同,在表达式中,Sub 过程不能用其名字调用。调用 Sub 过程的是一个独立的语句。Sub 过程还有一点与函数不一样,它不会用名字返回一个值。但是,与 Function过程一样,Sub 过程也可以修改传递给它们的任何变量的值。
调用 Sub 过程有两种方法:
'以下两个语句都调用了名为 MyProc 的 Sub 过程。
Call MyProc (FirstArgument, SecondArgument)
MyProc FirstArgument, SecondArgument
注意,当使用 Call 语法时,参数必须在括号内。若省略 Call 关键字,则也必须省略参数两边的括号
调用函数过程
通常,调用自行编写的函数过程的方法和调用 Visual Basic 内部函数过程(例如 Abs)的方法一样;即在表达式中写上它的名字。
'下面的语句都调用函数 ToDec。
Print 10 * ToDec
X = ToDec
If ToDec = 10 Then Debug.Print "Out of Range"
X = AnotherFunction ( 10 * ToDec)
就像调用 Sub 过程那样,也能调用函数。下面的语句都调用同一个函数:
Call Year (Now)
Year Now
当用这种方法调用函数时,Visual Basic 放弃返回值。
调用其它模块中的过程
在工程中的任何地方都能调用其它模块中的公用过程。可能需要指定这样的模块,它包含正在调用的过程。调用其它模块中的过程的各种技巧,取决于该过程是在窗体模块中、类模块中还是标准模块中。
窗体中的过程
所有窗体模块的外部调用必须指向包含此过程的窗体模块。如果在窗体模块 Form1 包含 SomeSub 过程,则可使用下面的语句调用 Form1 中的过程:
Call Form1.SomeSub(arguments)
类模块中的过程
与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类实例的变量。例如,DemoClass 是类 Class1 的实例:
Dim DemoClass as New Class1
DemoClass.SomeSub
但是不同于窗体的是,在引用一个类的实例时,不能用类名作限定符。必须首先声明类的实例为对象变量(在这个例子中是 DemoClass )并用变量名引用它。
标准模块中的过程
如果过程名是唯一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用,结果总会引用这个唯一过程。如果过程仅出现在一个地方,这个过程就是唯一的。
如果两个以上的模块都包含同名的过程,那就有必要用模块名来限定了。在同一模块内调用一个公共过程就会运行该模块内的过程。例如,对于 Module1 和 Module2 中名为 CommonName 的过程,从 Module2 中调用 CommonName 则运行 Module2 中的 CommonName 过程,而不是 Module1 中的 CommonName 过程。
从其它模块调用公共过程名时必须指定那个模块。例如,若在 Module1 中调用 Module2 中的 CommonName 过程,要用下面的语句:
Module2.CommonName (arguments)
Public 用于声明对所有模块中的所有其它过程都可以使用的过程。
Private 用于声明只能在包含该声明的模块中使用的过程。
导入在引用的项目和程序集中定义的命名空间或编程元素 此外 导入在同一个项目中定义的命名空间或元素
Imports [ aliasname = ] namespace or Imports [ aliasname = ] namespace element
各部分说明
aliasname
可选 导入别名 或名称 代码可按该名称而不是完全限定字符串来引用 namespace
namespace
必选 所导入命名空间的完全限制名称 可以为嵌套到任意级别的命名空间的字符串
element
可选 命名空间中所声明编程元素的名称 可以为任何容器元素
备注
每个源文件可以包含任意数量的 Imports 语句 这些语句必须位于任何选项声明(如 Option Strict 语句)之后 任何编程元素声明(如 Module 或 Class 语句)之前
只能在文件级别使用 Imports 这意味着导入的声明上下文必须是源文件 而不能是命名空间 类 结构 模块 接口 过程或块
当需要使用在一个或多个命名空间中声明的同名项目时 导入别名十分有用
请注意 Imports 语句不会将其他项目和程序集中的元素提供给您的项目使用 导入不会取代对引用的设置 它只是使那些已经可用于项目的名称不再需要加以限定
规则
别名 不应使用与 aliasname 相同的名称在模块级别声明成员 如果这样做 Visual Basic 编译器只对声明的成员使用 aliasname 而不再将其识别为导入别名
命名空间名称 可以提供单个命名空间名称 也可以提供嵌套命名空间的字符串 每个嵌套命名空间都通过句点 ( ) 与下一个更高级别的命名空间分隔 如下面的示例中所述
Imports System Collections Generic
元素类型 如果提供 element 它必须表示 容器元素 即可包含其他元素的编程元素 容器元素包括类 结构 模块 接口和枚举
行为
范围 Imports 语句所提供元素的范围取决于是否指定了 element 如果仅指定了 namespace 则该命名空间中所有具有唯一名称的成员以及该命名空间内容器元素的成员无需限定即可使用 如果既指定了 namespace 又指定了 element 则只有该元素的成员无需限定即可使用
限定 命名空间或容器元素外部的代码通常必须使用该命名空间或容器元素的名称来限定成员的名称 除非您的项目要访问具有相同名称的另一个成员 否则使用 Imports 语句后将不必进行此类限定 在这种情况下 您可以在每个 Imports 语句中指定一个 aliasname 然后 您只需导入别名即可限定具有相同名称的成员
示例
下面的示例将导入 Microsoft VisualBasic Strings 类并给其分配一个别名 str 该别名可用于访问 Left 方法
Place Imports statements at the top of your program Imports str = Microsoft VisualBasic Strings Visual BasicClass testClass Sub showHello() Display only the word Hello MsgBox(str Left( Hello World )) End Sub End Class lishixinzhi/Article/program/ASP/201311/21880
在C#中有 静态类 的概念 自然里边全部的方法都是静态的 这意味着你可以直接通过 类名 方法名 去调用(例如System的Math类就是典型) 在VB NET中 没有 静态类 的概念(当然你可以用 单例模式 把构造函数弄成Private的方式 其它方法都是静态的)如果某些方法需要被其它地方频繁使用 可以创建 模块 在VB NET中一旦创建了模块 其中任何方法 属性或者变量都可以被其它地方引用 因此适合全局情况下频繁交互的情况(比如初始化加载的参数 可能后续程序要使用)等
现在问题在于 如果你把一个类似以下的模块代码封装成DLL类库 无论在C#或者是VB NET中都无法引用到其方法
Module A
Public Sub Test()
End Sub
End Module
或许你感到很奇怪——不是在VB NET中这样定义一个Module就直接可以使用其内部方法了么?为什么封装成类库就不可以了呢?上网问了一些人 众说纷纭 后来我在他人协助下终于成功解决了这个问题——解决方法很简单——只要在Module前加Public
理由是 为了兼容C# VB NET由Module封装成类库中这个模块不再是 模块 而是一个标准的类了 如果这样写 那么在 NET中被理解成(C#)
internal A
{
public void Test()
{
}
}
整个模块变成Internal的了!当然你到其它程序集中去引用就引用不到!而把类库中的Module的修饰符改为Public就可以了 这就是MSDN那位友人给我最好的提示
虽然这个提示不是令我太满意(因为要知道VB NET中可以直接不通过 类名 方式直接使用方法名) 但是这给了我很大的暗示 得出重要的结论
)VB NET中Module在制作成类库时候等同于VB NET中的类的规则(里边的方法都是静态的) 默认情况下是Friend(C#是internal)
)根据结论 那么我们知道引用该DLL类库的方法一定是 i)引用命名空间 ii)C#中直接 类名 方法名 对于VB NET 直接可以引用到方法名
lishixinzhi/Article/program/net/201311/12502