Solidity 是一门用于编写智能合约的编程语言,它经常在以太坊及其他区块链平台上使用。在 Solidity 的版本 0.8.0 之前,构造函数没有可见性修饰符,但是从 Solidity 0.8.0 开始,构造函数的可见性修饰符被忽略,并且构造函数默认为 public。这一变化可以在你的 Solidity 合约中引发警告。
让我们看看以下示例合约代码:
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
contract HelloWord {
string public _name;
constructor(string memory name) public {
_name = name;
}
function setName(string memory name) public {
_name = name;
}
function getName() public view returns (string memory) {
return _name;
}
}
在这段代码中,构造函数被声明为 public,但是 Solidity 编译器在编译时会发出一个警告:
vbnetCopy code
Warning: Visibility for constructor is ignored. If you want the contract to be non-deployable, making it "abstract" is sufficient.
--> project:/contracts/HelloWord.sol:7:1:
这个警告的意思是,构造函数的可见性修饰符被忽略了。在 Solidity 0.8.0+ 版本中,构造函数默认为 public,因此在构造函数声明中指定 public 可见性是多余的。
为了消除这个警告,我们只需简单地移除构造函数声明的可见性修饰符。修改后的代码如下:
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
contract HelloWord {
string public _name;
constructor(string memory name) {
_name = name;
}
function setName(string memory name) public {
_name = name;
}
function getName() public view returns (string memory) {
return _name;
}
}
现在,构造函数仍然是公开可见的,但不再产生警告。
这个改变是 Solidity 编译器版本升级所带来的一项改进,旨在简化和统一构造函数的可见性处理。对于那些习惯于旧版本的开发者来说,可能需要注意这一变化,以避免产生警告信息。
总结一下,在 Solidity 0.8.0+ 中,构造函数的可见性修饰符被忽略,构造函数默认为 public。因此,在声明构造函数时指定 public 可见性是多余的,可能会引发警告。为了消除警告去除public声明即可。