首頁>Program>source

我一直想知道為什麼在下面的示例中,對於 not来說可以 初始化例項欄位(依靠它具有預設值)並訪問它,而區域性變數顯然是 must 被初始化,即使我將其初始化為預設值也仍然会得到...

 public class TestClass
  {
    private bool a;
    public void Do()
    {
      bool b; // That would solve the problem: = false;
      Console.WriteLine(a);
      Console.WriteLine(b); //Use of unassigned local variable 'b'
    }
  }
最新回復
  • 5月前
    1 #

    對於區域性變數,編譯器對流程有很好的了解-它可以看到變數的"讀取"和變數的"寫入",並(在大多數情况下)證明 首次寫入將在首次讀取之前进行。

    例項變數不是這種情况.考虑一个簡單的屬性-您如何知道是否有人会在获得它之前對其进行設置? 這使得強製實施明智的規則基本上不可行-因此,您必须確保在構造函式中設置了all欄位,或者允许它们具有預設值. C#团队選擇了後一種策略。

  • 5月前
    2 #

    它受C#中的"確定分配"規則支配.必须先明確分配變數,然後才能對其进行訪問。

    5.3 Definite assignment

    At a given location in the executable code of a function member, a variable is said to be definitely assigned if the compiler can prove, by a particular static flow analysis (§5.3.3), that the variable has been automatically initialized or has been the target of at least one assignment.

    5.3.1 Initially assigned variables

    The following categories of variables are classified as initially assigned:

      Static variables.

      Instance variables of class instances.

      Instance variables of initially assigned struct variables.

      Array elements.

      Value parameters.

      Reference parameters.

      Variables declared in a catch clause or a foreach statement.

    5.3.2最初未分配的變數

    以下類別的變數分類為最初未分配的變數:

      Instance variables of initially unassigned struct variables.

      Output parameters, including the this variable of struct instance constructors.

      Local variables, except those declared in a catch clause or a foreach statement.

    p

    為新物件例項分配了一塊記憶體時,執行時会在整个塊上寫入零,以確保新物件以已知狀態開始-這就是為什麼整數預設為0,双精度預設為0.0, 指向null的指標和物件引用,等等。

    理論上,可以對作為方法呼叫的一部分分配的幀进行相同的處理.尽管開銷会很高-可能会增加 会减慢對其他方法的呼叫,因此不会尝試。

  • 5月前
    3 #

    例項變數具有預設值.根据C#3.0規範:

    drastically p

    這是編譯器的限製.編譯器会尝試阻止您尽可能使用未分配的變數,這是一件好事,因為使用未初始化的變數曾经是旧C代碼中常见的錯誤源.

    但是,編譯器無法在呼叫该方法之前知道例項變數是否已初始化,因為它可以由任何其他方法設置,可以由外部代碼以任何順序呼叫。

    5.1.2.1 Instance variables in classes

    An instance variable of a class comes into existence when a new instance of that class is created, and ceases to exist when there are no references to that instance and the instance’s finalizer (if any) has executed.

    The initial value of an instance variable of a class is the default value (§5.2) of the variable’s type.

    For the purpose of definite assignment checking, an instance variable is considered initially assigned.

  • javascript:nvd3 piechartjs-如何編輯工具提示?
  • html:為什麼要完全使用相對協議的URL?