Tenir compte de ce type immuable:Contrats de code: Pourquoi certains invariants ne sont-ils pas considérés en dehors de la classe?
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;
}
}
Deux choses à remarquer ici:
- Il y a un contrat invariant qui garantit la propriété
Path
ne peut jamais êtrenull
- Le constructeur vérifie la valeur de l'argument
path
respecter l'invariant du contrat précédent
À ce stade, une instance Setting
ne peut jamais avoir une propriété null
Path
.
Maintenant, regardez ce type:
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"
}
Fondamentalement, il a son propre contrat invariant (sur le champ _path
) qui ne peut être satisfaite lors de la vérification statique (commentaire voir ci-dessus). Cela semble un peu bizarre pour moi, car il est facile de le prouver:
settings
est immuablesettings.Path
ne peut pas être nulle (parce que les paramètres a le contrat correspondant invariant)- en assignant
settings.Path
à_path
,_path
ne peut pas être nul
J'ai manqué quelque chose ici?
Oui, ils le font. Sinon, les invariants seraient très peu utiles. –