Solidity学习04 默认值、常量、修饰器
变量默认值
常用值类型变量的默认值
boolean: false
string: ""
int: 0
uint: 0
enum: 枚举中的第一个元素
address: 0x0000000000000000000000000000000000000000 (或 address(0))
function:
-internal: 空白函数
-external: 空白函数
引用类型的默认值,组成成员均为其默认值
delete操作符:
使用delete操作符会将变量更新为默认值
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
// 变量初始值
contract MyContract {
uint public age;
function Test()
public
returns (uint initinalValue, uint changedValue, uint deletedValue)
{
// 初始化值
initinalValue = age;
age = 100;
// 更新后的值
changedValue = age;
// 执行delete操作后的值
delete age;
deletedValue = age;
}
}
部署后调用Test函数
常数
两个常数关键字
constant 和 immutable
constant常数只能在定义时赋值。在其他地方赋值的话,会报错。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
contract MyContract {
uint256 constant NUM = 0;
function changeNum() public {
NUM = 100;
}
}
immutable 可以在声明时赋值、也可以在构造函数中赋值
若既在声明时赋值又在构造函数中赋值,则会变为构造函数中的赋值
contract ImmutableExample {
// 声明并初始化 immutable 变量
uint256 public immutable IMMUTABLE_NUM = 0;
uint256 public immutable IMMUTABLE_TEST;
// 利用构造函数初始化immutable变量,因此可以利用
constructor() {
IMMUTABLE_NUM = 100;
IMMUTABLE_TEST = test();
}
function test() public pure returns (uint256) {
uint256 what = 9;
return (what);
}
}
构造函数 constructor
与c#一样,sodility的构造函数用于在合约初始化时进行一些操作。
不同的是,sodility的构造函数的关键字是constructor。
修饰器
类似于c#的[Authorize],可以在函数执行前做一些校验
// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;
contract BaseContract {
address public owner;
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
}
contract MyContract is BaseContract {
constructor() {
owner = msg.sender; // 在构造函数中初始化 owner 变量为部署人
}
// 使用onlyOwner修饰器,限制只有合约owner能执行该合约
function sayHello() public view onlyOwner returns (string memory res) {
res = "Hello";
}
}
上面代码限制了只有owner能执行sayHello()函数。
使用owner地址,成功调用
使用其他地址,调用失败,revert