Estoy aprendiendo acerca de los contratos de código en .NET, y estoy tratando de entender la idea de constructores puros. La documentación de los contratos de código establece:
Todos los métodos que se llaman dentro de un contrato deben ser puros; es decir, no deben actualizar ningún estado preexistente. Un método puro puede modificar los objetos que se han creado después de ingresar al método puro.
Y la PureAttribute
documentación dice:
Indica que un tipo o método es puro, es decir, no realiza ningún cambio de estado visible.
Entiendo estas afirmaciones cuando se trata de métodos, pero ¿qué pasa con los constructores? Supongamos que tuvieras una clase como esta:
public class Foo
{
public int Value { get; set; }
public Foo(int value) {
this.Value = value;
}
}
Este constructor obviamente afecta el estado del nuevo Foo
objeto, pero no tiene otros efectos secundarios (por ejemplo, no manipula ninguno de los parámetros ni llama a métodos no puros). ¿Es este un candidato [Pure]
o no? ¿Cuál es el significado de colocar un [Pure]
atributo en un constructor, y cuándo debo hacer esto en mi propio código?
[Pure]
atributo, y usarlo en otro lugar en un contrato para tener una respuesta definitiva.El objeto no se puede usar hasta que se construya en este caso. Por lo tanto, el constructor es puro. Si el constructor llamó a otro código, o invocó a un delegado, y el otro código modificó la propiedad mutable, no sería puro. Para estar más seguro, es mejor hacer que la propiedad sea inmutable.
fuente