# IsSet / IsSetRef

如果指定变量已经被赋值, 则返回一个非零数字.

    VarIsSet := IsSet(Var)

    VarIsSet := IsSetRef(&Ref)

## 参数

Var

  类型: 变量

  一个直接变量引用. 例如: `IsSet(MyVar)`.

&Ref

  类型: VarRef

  对变量的间接引用. 通常不会像在 `IsSetRef(&MyVar)` 中那样直接传递, 而是间接传递, 比如在解引用一个 包含 VarRef 的参数之前检查它.

## 返回值

类型: 整数(布尔值)

如果 Var 或由 Ref 表示的变量已经被赋值, 则返回值为 1(true), 否则为 0(false).

## 备注

使用 IsSet 来直接检查一个变量, 如 `IsSet(MyGlobalVar)`.

使用 IsSetRef 来检查一个 VarRef, 它通常被一个变量所包含, 如下面的示例所示.

未赋值的变量也称为未初始化变量. 默认情况下, 试图读取一个未初始化的变量会导致异常抛出. IsSet 可以用来避免这种情况, 例如在第一次使用全局变量或静态变量时是否需要初始化.

注意: 静态初始化 如 `static my_static_array := []` 只被计算一次, 即在执行过程中第一次到达时, 因此通常不需要使用 IsSet.

尽管 IsSet 使用了与函数调用相同的语法, 但它可以被认为是一个操作符而不是一个函数. 关键字 IsSet 保留用于此处所示的用法, 不能被重新定义为一个变量或函数. IsSet 不能被间接调用, 因为任何试图传递一个未初始化的变量的行为都会导致错误的产生.

IsSetRef 也可以用来检查一个特定的变量, 通过与引用操作符一起使用. 当以这种方式使用它时, 要注意如果是全局变量需要先声明该变量. 例如, 如果在一个没有声明 `global MyVar` 的假设-局部函数中使用的话, `IsSetRef(&MyVar)` 中的 `&` 会导致 MyVar 默认解析为一个局部变量.

## 相关

ByRef 参数

## 示例

显示 IsSet 和 IsSetRef 的不同用法.

    Loop 2
        if !IsSet(MyVar)  ; 是否是第一次 "使用" MyVar?
            MyVar := A_Index  ; 第一次 "使用" 时进行初始化.
    MsgBox Function1(&MyVar)
    MsgBox Function2(&MyVar)

    Function1(&Param)  ; ByRef 参数.
    {
        if IsSet(Param)  ; 传递 Param 本身, 它是 MyVar 的别名.
            return Param  ; ByRef 参数会自动解引用.
        else
            return "unset"
    }
    Function2(Param)
    {
        if IsSetRef(Param)  ; 传递包含 VarRef 的 Param.
            return %Param%  ; 显式解引用 Param.
        else
            return "unset"
    }

dftg