当属性引用其自身时,我何时应使用“NotNullIfNotNull”?

6
Microsoft.Net.Http.Headers.ContentRangeHeaderValue 类中,有一个可空值类型的属性 (long?),该属性带有一个引用自身(属性 Length)的 NotNullIfNotNull 特性。
[NotNullIfNotNull(nameof(Length))]
public long? Length { get; private set; }

在值类型中,这个属性的目的是什么?与简单省略属性声明有什么不同?

如果指定参数的输入参数不为null,则返回值不为null。 - gunr2171
@gunr2171:在 OP 的示例中,没有名为 Length 的参数。同样,属性的 getter 可能有一个“返回值”,但属性本身没有。 (而且属性 getter 明确没有参数 - 与 VB.NET 相反,在 C# 中不支持这种方式。) - Heinzi
2个回答

1

我认为我慢慢地明白了这个声明试图解决的问题:

属性可以将其接收到的值写入与返回的变量不同的变量中(使用此类属性)

[NotNullIfNotNull(nameof(Length))]
public long? Length {
    get { return _length }
    private set { _anotherLength = value }
}

或者只是忽略Setter中的值,或进行其他奇怪的操作,这个Attribute就需要告诉分析器在Getter中返回的变量确实被Setter设置了对应的值。


问题仍然存在,我何时会在可空值类型上使用属性?那么我是否可以省略对 Length.Value 的调用,直接使用 Length - Christoph

1
根据定义:如果指定参数的参数不为空,则返回值、属性或参数不为空。 使用案例: 有时,返回值的空状态取决于一个或多个参数的空状态。只要某些参数不为空,这些方法就会返回非空值。为了正确地注释这些方法,您可以使用NotNullIfNotNull属性。 示例或代码片段可以在此处找到。

谢谢您提供的链接,该页面对不同的可空属性有很好的总结,但它并没有回答我的问题。在可空引用类型的上下文中,我知道NotNullIfNotNull属性在引用声明之外的其他属性时是做什么的。 - Christoph
所以使用装饰器的方法确保返回值非空,这是正确的吗? - carloswm85
抱歉给你点了踩,但是这并没有回答问题。在 OP 的例子中,没有叫做 Length 的参数,只有一个属性。同样地,在你提到的“使用场景”中,OP 的例子中也没有方法。 - Heinzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接