Solidity状态变量的可见性

    Solidity的状态变量,有private、public这2种,其中private表示私有,在本合约里可见;public表示公有,在本合约、以及它的子合约都可见。
    如果一个状态变量,既没有被private修饰、也没有被public修饰,则它默认是私有的。

uint _value;  <==> uint private _value; //这2者等价。

    比如,EventValue.sol合约与 EthValue.sol合约
    //EventValue.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract EventValue {
    event ValueChanged(address indexed author,uint oldValue,uint newValue);
    uint _value; //没有修饰符,默认为私有,不能继承

    constructor(uint value) public {
        uint tmp = _value;
        _value = value;
        emit ValueChanged(msg.sender, tmp, value);
    }
    function getValue() view public returns (uint) {
        return _value;
    }
    function setValue(uint value) public {
        uint tmp = _value;
        _value = value;
        emit ValueChanged(msg.sender, tmp, value);
    }
}

    //EthValue.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract EventValue {
    event ValueChanged(address indexed author,uint oldValue,uint newValue);
    uint public _value; //修饰符为public,表示公钥,可以继承

    constructor(uint value) public {
        uint tmp = _value;
        _value = value;
        emit ValueChanged(msg.sender, tmp, value);
    }
    function getValue() view public returns (uint) {
        return _value;
    }
    function setValue(uint value) public {
        uint tmp = _value;
        _value = value;
        emit ValueChanged(msg.sender, tmp, value);
    }
}

    在EventValue.sol中,_value是私有变量,是不可见的,它没有属性按钮,如图(1)所示;但在EthValue.sol中,_value是公有变量,是可见的,所以它有属性按钮,如图(2)所示。

图(1) 私有变量,没有属性按钮

图(2) 公有变量,才有属性按钮

    注意,这个可见性指定的是父子合约之间的访问权限,不是矿工或者用户的访问权限。无论是私有变量,还是公有变量,它们都存在Storage里,可以通过读取变量所在的插槽位置,来读取它的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值