Show/Hide Toolbars

XSharp

用途

声明过程名和形参。在 FoxPro DEFINE CLASS ...ENDEFINE 中使用时,将声明一个方法。

语法

 [Attributes] [Modifiers] PROCEDURE  <idProcedure>

 [Typeparameters]

 [([<idParam> [AS | REF|OUT|IN <idType>] [, ...])]

 [AS <idType>]

 [TypeparameterConstraints]

 [<idConvention>]

 [_INIT1 | _INIT2 | _INIT3 | EXIT]

 [EXPORT LOCAL]

 [DLLEXPORT STRING_CONST]

 [=> <expression>]

 CRLF

 [<Body>]

 [ENDPROC | END PROCEDURE]

 

替代 INIT / EXIT 程序

 

 [Attributes] [INIT | EXIT] PROCEDURE  <idProcedure>

 [Typeparameters]

 [([<idParam> [AS | REF|OUT|IN <idType>] [, ...])]

 [AS <idType>]

 [TypeparameterConstraints]

 [<idConvention>]

 [=> <expression>]

 CRLF

 [<Body>]

 [ENDPROC | END PROCEDURE]

 

参数

Attributes一个可选的特性列表,用于描述实体的元信息,例如在 MsTest 类库中包含测试的方法/函数上的 [TestMethod] 属性。请注意,当特性写在关键字上方的行时,特性必须在同一行或以分号结尾。

 

Modifiers一个可选的修饰符列表,用于指定主体的可见性或范围,例如:PUBLIC, STATIC, INTERNAL, EXPORT 和 UNSAFE.
请注意,在 FoxPro 兼容类中作为类成员使用的函数和过程可以有更多的修饰符。
 
<idProcedure>过程的有效标识符名称。 过程是一个实体,因此与其他实体共享相同的名称空间。 这意味着不可能出现过程和类同名的情况。

 

TypeParameters这适用于具有泛型类型参数的方法。这类似于 `<T>`,用于具有一个名为 T 的类型参数的方法。通常,参数列表中的一个参数也是类型 T。

 

<idParam>参数变量。 以这种方式指定的变量会自动声明为局部变量。 这些变量也称为形参(形式参数),用于接收调用实体时传递的参数。

 

AS | REF | OUT | IN <idType>指定参数变量的数据类型(称为强类型)。 AS 表示参数必须通过值传递,REF 表示参数必须通过带 @ 操作符的引用传递。OUT 是一种特殊的 REF 参数,不必在调用前赋值,必须在实体内部赋值。IN 参数作为 READONLY 引用传递。
列表中的最后一个参数也可以声明为 PARAMS <idType>[] ,这将告诉编译器函数/方法可以接收零个或多个可选参数。
使用 CLIPPER 调用约定的函数或方法将被编译为一个带有单个参数的函数,该参数被声明为 Args PARAMS USUAL[] 。
AS <idType>指定数据类型。如果省略,编译器依据编译选项来决定数据类型,或者是 USUAL,或者是由编译器自行决定。

 

 

TypeParameterConstraints在这里,您可以为类型参数指定约束,例如 WHERE T IS SomeName 或 WHERE T IS New。

 

<idConvention>指定此实体的调用约定。 <idConvention> 必须是以下内容之一:

o        CLIPPER

o        STRICT

o        PASCAL

o        CALLBACK

o        THISCALL

大多数 调用约定 仅用于向后兼容。
但是,存在两个例外情况:
1. CLIPPER 声明方法具有未类型化参数。通常只有没有声明参数的方法才需要这样做。否则,编译器在检测到未类型化参数时将假定使用 CLIPPER 调用约定。
2. 外部 DLL 的方法和函数可以使用 STRICT、PASCAL、 CALLBACK 调用约定。

 

 

EXPORT LOCALX# 允许使用该子句,但会被忽略。

 

_INITn, EXIT程序执行时,与程序相关的所有模块(包括库)中的所有 INIT 程序都会被自动调用。 INIT 程序有三个优先级,分别由 _INIT1、_INIT2 和 _INIT3 关键字表示。 _INIT1 程序首先被调用,_INIT2 其次,_INIT3 第三。 所有 INIT 程序都在应用程序 Start() 例程之前调用。
EXIT 程序在应用程序关闭时调用。

 

=> <Expression>替代实体多行正文(body)的单一表达式。不能与正文(body)一起编译

 

<Body>构成此主体代码的程序语句。
<Body> 可以包含一个或多个 RETURN 语句,以将控制权返回给调用例程,并作为函数的返回值。如果未指定 RETURN 语句,当函数定义结束时,控制权将返回给调用例程,并且函数将根据指定的返回值数据类型返回一个默认值(如果返回值没有强类型,则返回 NIL)。
不能与表达式主体(Expression Body)结合使用。

 

ENDPROC | END PROCEDURE这些(可选)关键字表示过程的逻辑终点。

 

在指定 INIT 程序时,必须遵循以下指导原则:

       不允许使用参数

 

备注

请注意,INIT 和 EXIT 程序的作用域始终是内部的。您不能从定义它们的程序集外部访问它们,因此要防止意外调用它们。如果需要调用它们,可以考虑将实际代码存储在普通函数或过程中,然后从 INIT 或 EXIT 过程中调用该代码。

示例

PROCEDURE First AS VOID PASCAL _INIT1

除了主启动模块(即包含 Start() 例程的模块)外,INIT 程序对于应用程序中的库和其他模块的自动初始化例程也是必要的。 虽然每个应用程序只能使用一个 Start() 例程,但对应用程序中 INIT 程序的总数量并无固有限制。

 

下面的示例展示了一个使用已声明变量的典型过程的框架:

PROCEDURE Skeleton(cName, cClassRoom, Bones, nJoints)
 LOCAL nCrossBones, aOnHand := {"skull", "metacarpals"}
 STATIC nCounter := 0        
 
 <Executable Statements>...

下一个示例将参数与 NIL 进行比较,以确定参数是否被跳过:

PROCEDURE MyProc(param1, param2, param3)
 IF param2 != NIL
         param2 := "default value"
 ENDIF
 <Statements>...

本例以别名表达式的形式调用存储过程 UpdateAmount():

USE invoices NEW
USE customer NEW
Invoices->UpdateAmount(Amount + Amount * nInterest)

参见

FIELD, FUNCTION, LOCAL, MEMVAR, METHOD,RETURN