consideran este tipo inmutable:Contratos de código: ¿Por qué algunos invariantes no se consideran fuera de la clase?
public class Settings
{
public string Path { get; private set; }
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(Path != null);
}
public Settings(string path)
{
Contract.Requires(path != null);
Path = path;
}
}
Dos cosas a notar aquí:
- hay un contrato invariante que asegura la propiedad
Path
nunca puede sernull
- El constructor comprueba el valor
path
argumento para respetar el contrato anterior invariante
En este punto, una instancia Setting
nunca puede tener una propiedad null
Path
.
Ahora, mira a este tipo:
public class Program
{
private readonly string _path;
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(_path != null);
}
public Program(Settings settings)
{
Contract.Requires(settings != null);
_path = settings.Path;
} // <------ "CodeContracts: invariant unproven: _path != null"
}
Básicamente, tiene su propio contrato invariante (en _path
campo) que no puede ser satisfecha durante la comprobación estática (véase comentario anterior). Eso suena un poco raro para mí, ya que es fácil de demostrar que:
settings
es inmutablesettings.Path
no puede ser nulo (debido a la configuración tiene el contrato correspondiente invariante)- por lo asignando
settings.Path
a_path
,_path
no puede ser nulo
¿Echaba de menos algo aquí?
Sí, lo hacen. De lo contrario, las invariantes serían de muy poca ayuda. –