No. Consideriamo sia l'operatore da solo che l'uso pesantemente incatenato che hai per questo.
Di per sé .?A
dipende dalla stessa quantità di conoscenza della classe del valore di sinistra e del tipo restituito dal metodo come fa .A != null
, vale a dire. È necessario sapere che la proprietà A
esiste e restituisce un valore che può essere confrontato con null
.
Possiamo solo obiettare che questo viola la legge di Demetra se le proprietà tipizzate lo fanno. Non siamo neppure forzati ad avere A
come tipo concreto (il suo valore potrebbe essere di tipo derivato). L'accoppiamento qui è minimo.
Ora consideriamo var x = A?.B?.C?.D?.E?.F
.
Ciò significa che A
deve essere di un tipo che potrebbe essere nullo o che potrebbe avere una proprietà B
, che deve essere di un tipo che potrebbe essere nullo o avere una proprietà C
e così via fino a il tipo della proprietà E
è qualcosa che potrebbe essere nullo o potrebbe avere una proprietà F
.
In altre parole, dobbiamo farlo con un linguaggio tipizzato staticamente o applicare un vincolo sui tipi che possono essere restituiti se la digitazione è libera. Nella maggior parte dei casi, C # utilizza la digitazione statica, quindi non abbiamo modificato nulla.
Se avessimo allora il seguente codice violerebbe anche la legge:
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;
}
}
}
Che è esattamente lo stesso . Questo codice che utilizza l'accoppiamento di elementi diversi deve "conoscere" l'intera catena di accoppiamento, ma sta usando un codice che non viola la Legge di Demetra per farlo, con ogni unità avere un accoppiamento ben definito con il prossimo.