簡體   English   中英

確保變量初始化C#

[英]Ensure Variable Initialization C#

考慮以下代碼:

public string Variable1 { get; set;}
public int Variable2 { get; set;}

public void Function()
{
 // Has been Variable1 Initialized?
}

在函數內部,我想知道在函數調用之前是否已將值發送到Variable1和Variable2,

即使已發送DEFAULT值,也沒問題(對於字符串為null,對於int為0)

考慮使用這樣的簡單包裝:

public struct AssignableProperty<T>
{
    private T _value;

    public T Value
    {
        get { return _value; }
        set
        {
            WasAssigned = true;
            _value = value;
        }
    }

    public bool WasAssigned { get; private set; }

    public static implicit operator AssignableProperty<T>(T data)
    {
        return new AssignableProperty<T>() { Value = data };
    }

    public static bool operator ==(AssignableProperty<T> initial, T data)
    {
        return initial.Value.Equals(data);
    }

    public static bool operator !=(AssignableProperty<T> initial, T data)
    {
        return !initial.Value.Equals(data);
    }

    public override string ToString()
    {
        return Value.ToString();
    }
}

然后你的課將如下所示:

public class Test
{
    public AssignableProperty<string> Variable1 { get; set; }
    public AssignableProperty<int> Variable2 { get; set; }

    public void Function()
    {
        if(Variable1.WasAssigned&&Variable2.WasAssigned)
            //do stuff
    }
}

你可以更進一步,將拋出異常或合約添加到getter,所以如果有人試圖訪問未初始化的值,它會拋出異常或顯示警告

關於C#中默認值的一些基礎知識:

創建類(或結構)的實例時,所有字段都初始化為其各自的默認值。

對於引用類型,它將為null 對於值類型,它將等於0 這很容易解釋,因為內存管理確保新分配的內存初始化為0x0字節。

自動屬性隱藏生成的字段,但有一個。 因此適用相同的規則。

現在回答你的問題 ,確保初始化值的最好方法是為每個字段/屬性創建一個帶有一個參數的構造函數,並隱藏沒有參數的默認構造函數:

public Yourtype(String param1, Int32 param2)
{
    this.Variable1 = param1;
    this.Variable2 = param2;
}

private Yourtype() { }

如果只需要初始化/檢查屬性/字段的子集,則在@Sean和@Alex答案中描述了其他替代方案。 但這隱藏了一些開銷(每個屬性/字段一個bool和一些間接)。

對於引用類型,您需要添加標志:

string m_Variable1;
bool m_IsVariable1Set;

public string Variable1
{
  get{return m_Variable1;}
  set{m_IsVariable1Set = true; m_Variable1 = value;}
}

對於值類型,您可以使用可空值

int? m_Variable2;

int Variable2
{
  get{return m_Variable2.GetValueOrDefault();}
  set{m_Variable2 = value;}
}

然后,您可以使用m_Variable2.HasValue檢查它是否已設置。

那么你可以簡單地檢查兩個變量,看它們是否在你的函數中分配了它們的值

public void Function()
{

    if (String.IsNullOrEmpty(Variable1) && Variable2 ==0 )
    {
      // Variables are not assigned
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM