¿Cuándo usar [Pure] en un constructor?

15

Estoy aprendiendo sobre los contratos de código en .NET, y estoy tratando de entender la idea de constructores puros. La documentación de code indica:

  

Todos los métodos que se llaman dentro de un contrato deben ser puros; es decir, no deben actualizar ningún estado preexistente. A un método puro se le permite modificar los objetos que se han creado después de la entrada en el método puro.

Y el PureAttribute documentación indica:

  

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 tienes 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 objeto Foo , pero no tiene otros efectos secundarios (por ejemplo, no manipula ninguno de los parámetros ni llama a ningún método que no sea puro). ¿Es este un candidato para [Pure] o no? ¿Cuál es el significado de colocar un atributo [Pure] en un constructor, y cuándo debo hacer esto en mi propio código?

    
pregunta p.s.w.g 01.07.2014 - 18:20
fuente

2 respuestas

11

Decoras un método con [Pure] :

  • Si el método no tiene efectos secundarios. Por ejemplo, si el método accede a una base de datos y la modifica o su resultado depende de la base de datos, no es pura.

  • Y si espera usarlo en contratos de código. Por ejemplo, si el método es puro , pero no tiene intención de usarlo en los contratos de código, agregar [Pure] no tendría ningún beneficio y no hará que su código sea más rápido.

En lo que respecta a los constructores, parece que se supone que son puros en .NET y no necesitan un atributo explícito. Miré a varios constructores en la fuente de .NET Framework, como DateTime , y no tienen [Pure] atributo.

Supongo que esto se hace por varias razones:

  • Puede ser muy poco práctico tener que escribir un constructor sin parámetros con el atributo [Pure] solo para poder usar la clase / estructura en un contrato.

  • Algunos, como String , no tienen constructores explícitos.

  • Los constructores reciben un tratamiento especial incluso fuera de los contratos de código; por ejemplo, no se espera que lance excepciones dentro de ellos .

  • [Pure] es solo una convención que está aquí para simplificar su vida, pero no hay una verificación estática real para garantizar que el método decorado con este atributo sea puro. void DestroyDatabase() puede ser decorado como puro, y los contratos de código no notarán nada incorrecto.

      

    Actualmente, no hay ningún componente de los Contratos de Código que verifique si los métodos declarados puros son puros. Por lo tanto, si un programador decoró un método con [Puro], simplemente se cree.

         

    De Contratos de código # 5: Pureza del método

  • .NET Framework contiene constructores que no son puros. Por ejemplo, List<T>(IEnumerable<T> collection) es realmente impuro si recorrer la colección tiene efectos secundarios.

  • Los contratos de gritos se mantendrán simples. Puedo imaginar fácilmente un contrato como Contract.Requires(!string.IsNullOrEmpty(name)) , por lo que hay buenas razones para declarar el string.IsNullOrEmpty estático.

    Por otra parte, si necesita un StringBuilder para construir la cadena, comprobará si hay algo llamando a un método de instancia de su clase de negocios, probablemente esté haciendo un mal uso de los contratos. También es por eso que StringBuilder.ToString no está marcado como puro, incluso si pudiera estarlo (¿Lo es?)

respondido por el Arseni Mourzenko 01.07.2014 - 18:52
fuente
1

El objeto no se puede usar hasta que se construya en este caso. Por eso el constructor es puro. Si el constructor llamara a otro código, o invocara a un delegado, y el otro código modificara la propiedad mutable, no sería puro. Para estar más seguro, es mejor hacer que la propiedad sea inmutable.

    
respondido por el Frank Hileman 01.07.2014 - 18:26
fuente

Lea otras preguntas en las etiquetas