取消设置时,属性是否始终具有值?

时间:2012-01-27 14:18:23

标签: c# .net properties

我有这样的房产:

public Tuple<String, String>[] Breadcrumbs { get; set; }

我在我的一个方法中进行了测试:

if (Breadcrumbs != null && Breadcrumbs.Length > 0) { }

根据调用此方法的时间,可能尚未设置Breadcrumbs。在一次测试中,Breadcrumbs == null评估为真。

未设置的属性是否总是有值? (它总是null吗?)

4 个答案:

答案 0 :(得分:19)

未经任何代码显式设置的自动实现的属性将始终具有属性类型的默认值 - 对于引用类型,该值为null。 (对于int,它将为0,对于char,它将为'\ 0'等。

像这样的自动实现的属性只是等同于:

private PropertyType property;
public PropertyType Property
{
    get { return property; }
    set { property = value; }
}

...除了后备变量有一个不可言说的名称(你不能在代码中引用它)所以它总是以该类型的默认值开始。

答案 1 :(得分:3)

自动属性使用支持字段并编译为常规属性。

如果Property-Type是引用类型,则该值将为null,否则该值将是默认值。

答案 2 :(得分:2)

类成员变量(称为字段),以及属性的支持变量,如果未明确初始化,则始终初始化为其默认值,对于引用类型,null。所有类型的默认值是其二进制表示由设置为0的所有位组成的值。

另一方面,C#要求您显式初始化局部变量。它们是:在方法,构造函数和属性访问器以及out方法参数中声明的变量;即,在为它们分配值之前,它们将被视为未定义。

答案 3 :(得分:0)

逻辑上不可能没有价值。它必须返回一些东西,一些1和0,至少被认为是对Tuple<String, String>[]的引用,所以在这种程度上它有一个值。

同样,类中的所有字段都设置为默认值(default(T),无论它们是什么类型T,对于所有引用类型都是null。否则就有可能让一个对象处于这样一种状态,这个状态不仅没有任何意义,而且对于.NET期望对象的规则没有任何意义。这包括自动属性背后的隐藏字段。

现在,在某些语言中,我们可以做到与此相同:

public Tuple<String, String>[] Breadcrumbs
{
  get
  {
    Tuple<String, String>[] whatIWillSend;
    return whatIWillSend;
  }
}

如果允许这样做,whatIWillSend的价值不是由你自己的任何有意义的决定定义的,而是由当时在记忆中发生的事情定义的。它可能是null,它可能是一个有效的Tuple<String, String>[]纯粹的巧合(但不是你想要使用的那个!),它可能是Dictionary<int, List<string>>,运行时现在认为实际上是Tuple<String, String>[](整个系统的类型安全性),它可能是decimal结构的四分之一。 (在允许这些内容的语言中,这些语言的调试程序在这些情况下的设置也可能是一个众所周知的值,以帮助查找由此引起的错误。)

这是我们最接近没有价值的房产。请注意:

  1. 它仍然会有一个值,而不是一个有意义的值。
  2. 我们不允许在C#中这样做。