不。让我们既考虑运营商本身,又考虑您对其的严格使用。
.?A
依赖于左值的类和方法返回的类型的知识量,也就是它本身.A != null
。它需要知道该A
属性是否存在,并返回可以与进行比较的值null
。
我们只能说,如果键入的属性确实违反了Demeter的定律。我们甚至没有被迫具有A
具体类型(它的值可以是派生类型)。这里的耦合很小。
现在让我们考虑一下var x = A?.B?.C?.D?.E?.F
。
这意味着该A
类型必须为可以为null的类型,或者可以具有B
属性,必须为可以为null的类型或具有C
属性,依此类推,直到该E
属性的类型可以为null或可能F
有财产。
换句话说,我们需要使用静态类型的语言来执行此操作,或者对类型松散的情况下可以返回的类型施加约束。C#在大多数情况下使用静态类型,因此我们没有做任何更改。
如果有的话,以下代码也将违反法律:
ExplicitType x;
var b = A.B;
if (b == null)
x = null;
else
{
var c = b.C;
if (c == null)
x = null;
else
{
var d = c.D;
if (d == null)
x = null;
else
{
var e = d.E;
if (e == null)
x = null;
else
x = e.F;
}
}
}
哪个完全一样。此代码使用不同元素的耦合,需要“知道”整个耦合链,但是它使用的代码并没有违反Demeter定律,每个单元都具有明确定义的耦合下一个。
A?.B?.C?.D?.E?.F?
会违反它-LoD并不是关于多少个点,并且如果调用方法具有关于其结构的信息而不违反其点,则这样的调用将是完全可以接受的。仅仅说这样的代码可能违反LoD,还不能说它的所有使用都违反了LoD。