Appearance
变量
在 Solidity
中,有三种类型的变量:状态变量、局部变量和全局变量。
- 状态变量是指变量值永久保存在智能合约的存储空间中的变量;
- 局部变量是指变量值仅在函数执行期间有效的变量,在函数退出后无效;
- 全局变量保存在全局命名空间中,是一种特殊变量,用于获取整个区块链相关信息,与当前合约无关,例如时间戳和块高等。
Solidity
在变量声明时指定变量类型。每个变量声明时都有一个基于其类型的默认值,例如 int
类型的默认值为 0
,不存在 undefined
或 null
的概念。
1. 状态变量
状态变量的值可以被多次访问和修改,且在合约生命周期内保持不变。它们可以被用于存储重要的数据和状态信息,例如存储用户账户信息或者记录合约历史状态。
示例
solidity
pragma solidity ^0.8.0;
contract MyContract {
uint public myUint; // 声明一个公共的无符号整数状态变量,名为 myUint
function setUint(uint _myUint) public {
myUint = _myUint; // 设置 myUint 的值为函数传入的参数 _myUint
}
}
在这个示例程序中,我们定义了一个名为 MyContract
的合约,并在其中声明了一个公共的无符号整数状态变量 myUint。我们同时为这个合约定义了一个名为 setUint
的函数,用于设置 myUint
变量的值。
在 Solidity
中,公共变量可以被合约内外的所有人访问。在这个示例中,myUint
变量使用了 public
关键字,因此可以在合约外部访问这个变量,并查询它的值。同时,我们也可以调用 setUint
函数来修改 myUint
变量的值。
2. 局部变量
与状态变量不同,局部变量是在 Solidity
函数内部和生命周期期内有效,主要用于函数内部运算和临时数据存储,例如简单的数学运算或临时转换数据类型。
示例
solidity
pragma solidity ^0.8.0;
contract MyContract {
function exampleFunction() public returns (uint) {
uint num1 = 10; // 声明一个无符号整数局部变量,名为num1,赋初值为10
uint num2 = 5; // 声明一个无符号整数局部变量,名为num2,赋初值为5
uint sum = num1 + num2; // 声明一个无符号整数局部变量,名为sum,值为num1和num2的和
return sum; // 返回sum的值
}
}
在这个示例程序中,我们定义了一个名为 exampleFunction
的函数,在函数中声明了三个无符号整数类型的局部变量 num1、num2 和 sum
。在函数执行过程中,我们将 num1
和 num2
的和赋值给了 sum
,并返回了 sum
的值。
需要注意的是,局部变量的作用域只限于当前函数中。在示例函数 exampleFunction
内部执行完成后,局部变量num1、num2和sum
的值会被销毁。
3. 全局变量
全局变量通常是一个只读的变量,可以用于获取区块链的相关信息,例如区块高度、当前时间戳、消息发送者地址等信息。以下是一些常见的 Solidity
内置全局变量:
block.number
: 当前块的块号。block.timestamp
: 当前块的时间戳。msg.sender
: 消息发送者的地址。msg.value
: 以wei
为单位的消息value
植。now
: 当前区块时间戳(等同于block.timestamp
)。
示例
solidity
pragma solidity ^0.8.0;
contract MyContract {
uint public blockNumber; // 声明一个公共的无符号整数状态变量,名为blockNumber
function getCurrentBlockNumber() public {
blockNumber = block.number; // 将当前块的块号赋值给blockNumber
}
}
在这个示例程序中,我们定义了一个名为 MyContract
的合约,并声明了一个公共的无符号整数状态变量 blockNumber
。
在 getCurrentBlockNumber
函数中,我们将全局变量 block.number
的值赋给了 blockNumber
变量。
需要注意的是,全局变量通常是只读的,不允许修改。因此,我们只能将全局变量的值赋给其他变量,而不能修改全局变量的值。