C# 属性在未设置时总是有值吗?

C# 属性在未设置时总是有值吗?,c#,.net,properties,C#,.net,Properties,我有一个这样的财产: public Tuple<String, String>[] Breadcrumbs { get; set; } if (Breadcrumbs != null && Breadcrumbs.Length > 0) { } 根据调用此方法的时间,可能未设置面包屑。在一个测试中,Breadcrumbs==nullevaluation为true 未设置的属性是否总是有值?(将始终为null?)未由任何代码显式设置的自动实现的属性将始终具有属

我有一个这样的财产:

public Tuple<String, String>[] Breadcrumbs { get; set; }
if (Breadcrumbs != null && Breadcrumbs.Length > 0) { }
根据调用此方法的时间,可能未设置面包屑。在一个测试中,
Breadcrumbs==null
evaluation为true


未设置的属性是否总是有值?(将始终为
null
?)

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

这样一个自动实现的属性相当于:

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

。。。除了支持变量有一个无法说出的名称(您不能在代码中引用它),因此它总是以类型的默认值开始。

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

如果属性类型是引用类型,则该值将为null,如果不是,则该值将为默认值。

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


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

从逻辑上讲,它不可能没有值。它必须返回一些东西,一些1和0,至少被认为是对
Tuple[]
的引用,因此在某种程度上它有一个值

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

现在,在一些语言中,我们可以做类似的事情:

public Tuple<String, String>[] Breadcrumbs
{
  get
  {
    Tuple<String, String>[] whatIWillSend;
    return whatIWillSend;
  }
}
公共元组[]面包屑
{
得到
{
元组[]whatIWillSend;
返回将要发送的内容;
}
}
如果这是允许的,
whatIWillSend
将有一个值,该值不是由您做出的任何明确决定定义的,而是由当时内存中发生的事情定义的。它可能是空的,它可能是一个有效的
元组[]
,这完全是巧合(但不是您想要使用的!),它可能是一个
字典
,运行时现在认为它实际上是一个
元组[]
(整个系统都有类型安全性),它可能是
十进制结构的四分之一。(在允许这样做的语言中,这也可能是一个众所周知的值,即在这些情况下,这些语言的调试器可以精确地设置这些值,以帮助查找由它引起的bug)

这是我们能得到的最接近无值属性的东西。但请注意:

  • 它仍然会有一个值,只是不是一个有意义的值
  • 无论如何,我们在C#中是不允许这样做的

  • 哎呀,到现在为止,我一直在编写C#代码,我的印象是我必须初始化所有东西,否则就要冒着发现大量随机垃圾的风险。不过,我想我会保持这个习惯,这样当我回到C时就不会犯那些非常微妙的错误。C#编译器在检测潜在的未初始化变量方面很好,所以不要太担心@奥利弗:不,你永远找不到随机垃圾;内存管理器总是初始化它。(在安全代码中;在不安全代码中,你只能靠自己。这就是为什么它被称为“不安全”。)然而,C#确实要求你在读取所有局部变量之前显式初始化它们;这不是为了防止你看到垃圾,而是为了防止你写错误。@EricLippert说,我想不出不坚持初始化的语言中的错误不是a)有一个默认值集,编码人员没有预料到它,导致错误或b)那里有随机垃圾,编码人员没有预料到它,导致错误。一个允许使用未经初始化的本地人的假设C#必须导致一个或另一个。(我猜前者也会导致太多的验证问题)。还有其他可能吗?外星名字哈哈哈