External
external是合同的一部分,这意味着可以从其他合同和交易中调用它们。 外部方法f不能在内部调用(即f()不起作用,但this.f()起作用)。 外部方法在接收大量数据时有时更高效。
实现为合约的外部消息调用。所以在合约初始化时不能 external 的方式调用自身函数,因为合约还未初始化完成。
public
public 可以在内部或通过消息调用。 对于公共状态变量,会生成一个自动获取getter方法(下文)。
internal
internal 这些函数和状态变量只能在该合约内部进行访问。但是 继承的子类可以访问。
实现时转为简单的EVM跳转,所以它能直接使用上下文环境中的数据,对于引用传递时将会变得非常高效(不用拷贝数据)。
private
private 这些函数和状态变量只能在该合约内部进行访问。即使继承的子类也不能访问。
注意:
所有外部观察者都可以看到合约内的所有内容。private信息只会阻止其他合约访问和修改信息,但在区块链之外,整个世界仍然可以看到它。
Getter Functions
编译器自动为所有公共状态变量创建getter方法。 对于下面给出的合同,编译器将生成一个名为data的方法,该方法不接受任何参数并返回uint(状态变量数据的值)。 状态变量的初始化可以在声明中完成。
pragma solidity ^0.4.0;
contract C {
uint public data = 42;
}
contract Caller {
C c = new C();
function f() public {
uint local = c.data();
}
}