Esto se conoce como operador nulo coalescencia y actúa de la siguiente manera, asumir a
es un int anulable y b
es un int normales
b = a ?? 1;
es igual a
b = (a != null ? (int)a : 1);
que es igual a
if(a != null)
b = (int)a;
else
b = 1;
Por lo tanto
public NameValueCollection Metadata
{
get { return metadata ?? (metadata = new NameValueCollection()); }
}
expandido debe ser similar a algo como esto
public NameValueCollection Metadata
{
get
{
if(metadata == null)
return (metadata = new NameValueCollection());
else
return metadata;
}
}
que es una especie de patrón singleton un trazador de líneas, debido a que los rendimientos getter metadata (un objeto NameValueCollection inicializado) cada vez que se solicita, se espera la primera vez que es nulo en ese punto, por lo que se inicializa y luego lo devuelve. Esto está fuera de tema, pero tenga en cuenta que este enfoque del patrón singleton no es seguro para subprocesos.
Downvote porque ninguna explicación. – problemofficer