Solidity

儲存變數的賦值(在建構子中的聲明 VS 中)

  • December 26, 2021

如果我在聲明它的同一行中分配儲存變數的值與在建構子中分配它的值有什麼區別?哪種方法是首選方法?如果兩者都具有相同的確切效果,那麼哪一個是最省氣的實施方式?

例子:

contract Demo {
  uint256 public a = 10_000_000;
  constructor() {}
}

對比

contract Demo {
  uint256 public a;
  constructor() {
     a = 10_000_000;
  }
}

在您的特定範例中,差異可以忽略不計。第一種情況使用 137 個操作碼,第二種情況使用 140 個操作碼。在第一種情況下,儲存實際上是立即初始化的:

在此處輸入圖像描述

而在第二種情況下,有一些樣板程式碼可以進行初始化:

在此處輸入圖像描述

(solidity 0.8.0 和 a=10 而不是 10000000)

但是,建構子用於自定義部署腳本中初始值的契約。或者當合約由其他合約創建時。

例如,您希望您的合約沒有硬編碼名稱而是從部署腳本初始化,因此您使用建構子:

contract MyContract {
  string private _name;
  constructor(string memory name) {
     _name = name;
  }
  function getName() public view returns(string memory) {
    return _name;
  }
} 

引用自:https://ethereum.stackexchange.com/questions/117299