Show/Hide Toolbars

XSharp

注意此命令在 Core 和 Vulcan 方言中不可用。

用途

创建应用程序中所有例程都能看到的变量和数组。

语法

PUBLIC <memVarList>
PUBLIC <idVar> [:= <uValue>] | <ArraySpec> [, ...]
PUBLIC <idVar> [:= <uValue>] [AS <Type> [OF <ClassLibrary>] ]                                                 // 仅用于 FoxPro 方言
PUBLIC ARRAY <arrayName> ( <nRows> [, <nColumns>] ) [, <arrayName> ( <nRows> [, <nColumns>] ) ]     // 仅用于 FoxPro 方言
PUBLIC ARRAY <arrayName> [ <nRows> [, <nColumns>] ] [, <arrayName> [ <nRows> [, <nColumns>] ] ]     // 仅用于 FoxPro 方言

参数

<memVarList>一个或多个变量名,用逗号分隔。

 

<idVar>要创建的公有变量的有效标识符名称。
idVar 可以加上一个“&”前缀(例如PUBLIC &name)。在这种情况下,编译器会认为 idVar 应包含一个已声明和初始化的变量名称字符串。

 

<uValue>为变量赋值的初始值。 可以是任何有效的表达式。 如果没有指定 <uValue>,变量将被初始化为 FALSE。但也有例外:
在 FoxPro 方言中,PUBLIC FOX 和 FOXPRO 初始化为 TRUE。
在其他方言中,PUBLIC CLIPPER 初始化为 TRUE。

 

<ArraySpec>要创建的动态数组的规格。 <ArraySpec> 是以下内容之一:
<idArray>[<nElements>, <nElements>, <nElements>]
<idArray>[<nElements>][<nElements>][<nElements>]
除第一个 nElements 外,其他均为可选。
<idArray>        是要创建的数组的有效标识符名称。 数组元素初始化为 NIL。
<nElements>        定义数组特定维数的元素个数。 维数由指定 <nElements> 参数的个数决定。

 

<Type> & <ClassLibrary>编译器可以识别 FoxPro 方言中的 AS <Type> 和 AS <Type> of <Classlibrary> 子句。
<Type> 和 <ClassLibrary> 子句被忽略,因为动态内存变量的类型始终是 USUAL

 

<arrayName>数组的变量名。数组的大小与 <nRows> 和 <nColumns> 所声明的一样。数组可以使用小括号作为分隔符,也可以使用方括号。
<nColumns> 是可选项
我们建议使用方括号。

描述

PUBLIC 是一条可执行语句,这意味着您必须在定义例程中的任何变量声明语句(即 FIELD、LOCAL 和 MEMVAR)之后指定它。

 

警告 除非未声明变量(Undeclared Variables)编译器选项被选中,否则使用此语句创建的任何变量引用都会产生编译器错误。

 

任何与现有公有或私有变量同名的声明变量(如 LOCALs)都会暂时隐藏公有或私有变量,直到覆盖变量被释放或不再可见。

 

如果试图创建一个与现有可见的私有变量同名的公有变量,则会被直接忽略;但 PUBLIC 语句的赋值部分不会被忽略。 例如,下面几行代码改变了变量 x 的值,但并没有将其作用域从私有变为公有:

PRIVATE x := 1000
...
PUBLIC x := "New value for x"
? x                                        // 结果:  "New value for x"

对这种行为的解释是,在内部,PUBLIC 语句和赋值被视为不同的语句。 因此,这段代码将被处理如下:

PRIVATE x := 1000
...
PUBLIC x
x := "New value for x"
? x                                        // 结果:  "New value for x"

 

PUBLIC 语句会被忽略,但赋值语句会被执行,从而改变私有变量 x 的值。

 

当你使用一个已经存在的私有变量名声明一个公有数组时,这种行为会产生一个有趣的影响。 例如

 

PRIVATE x := 1000
...
PUBLIC x[10]
? x[1]                                // 结果:  NIL

在这种情况下,PUBLIC 语句也被视为两个单独的语句:

PRIVATE x := 1000
...
PUBLIC x
x := ArrayNew(10)
? x[1]                                // 结果:  NIL

同样,PUBLIC 语句被忽略,赋值将 x 从一个私有数值变量变为对 10 个元素数组的私有引用。

 

如果试图指定一个与可见的已声明变量(例如 LOCAL、GLOBAL 或 DEFINE)冲突的公有变量,编译器不会将其视为错误,因为 PUBLIC 并不是编译器声明语句。 相反,声明的变量会在运行时隐藏公有变量。 这意味着,在声明的变量被释放之前,你根本无法访问公有变量。

 

在类方法中,实例变量(ACCESS/ASSIGN变量除外)总是比同名的公有变量更可见。 如果存在名称冲突,请使用 _MEMVAR-> 别名访问方法中的公有变量。 对于ACCESS/ASSIGN变量,使用 SELF: 前缀来覆盖与公有变量名称冲突的情况。

公有变量是动态作用域。 它们在程序运行期间或使用  CLEAR ALL 或  CLEAR MEMORY 明确释放之前一直存在。

备注

PUBLIC Clipper:  为了在应用程序中包含 XSharp 扩展名,并允许应用程序在 dBASE III PLUS 下运行,在使用 PUBLIC 创建时,特殊公有变量 Clipper 初始化为 TRUE。

示例

本例创建了两个 PUBLIC 数组和一个 PUBLIC 变量:

PUBLIC aArray1[10, 10], var2
PUBLIC aArray2[20][10]

以下 PUBLIC 语句创建变量并初始化变量值:

PUBLIC cString := Space(10), cColor := SetColor()
PUBLIC aArray := {1, 2, 3}, ;
 aArray2 := ArrayNew(12, 24)

参见

GLOBAL, MEMVAR, PARAMETERS, PRIVATE, DIMENSION, DECLARE