[英]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.