确保变量初始化C#

时间:2015-05-20 08:47:20

标签: c# .net variables instance-variables

考虑以下代码:

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

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

在函数内部,我想知道是否已将值发送到Variable1&变量2,在函数调用之前,

即使已经发送了DEFAULT值,也没问题(对于字符串为null而对于int为0)

4 个答案:

答案 0 :(得分:8)

考虑使用这样一个简单的包装器:

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,所以如果有人试图访问未初始化的值,它会抛出异常或显示警告

答案 1 :(得分:2)

有关C#默认值的一些基础知识:

创建类(或结构)的实例时,所有字段都初始化为各自的默认值。

对于参考类型,它将是null。对于值类型,它将等同于0。这很容易解释,因为内存管理确保新分配的内存初始化为0x0字节。

自动属性隐藏生成的字段,但有一个。因此适用相同的规则。

现在回答你的问题,确保初始化值的最佳方法是为每个字段/属性创建一个带有一个参数的构造函数,并隐藏没有参数的默认构造函数: / p>

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

private Yourtype() { }

如果只需要初始化/检查属性/字段的子集,则在@Sean和@Alex答案中描述了其他替代方案。但这隐藏了一些开销(每个属性/字段一个bool和一些间接)。

答案 2 :(得分:0)

对于参考类型,您需要添加标记:

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检查是否已设置。

答案 3 :(得分:-2)

您可以简单地检查两个变量,看看它们是否在您的函数中分配了任何值

public void Function()
{

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

}