2011-12-04 8 views

Respuesta

3

no he probado a mí mismo, pero according to the MSDNContract.OldValue podría ayudar a comprobar que un único valor de la propiedad no ha cambiado:

public bool IsValid 
{ 
    get 
    { 
    ... 
    } 
} 

public void SomeMethod() 
{ 
    Contract.Ensures(this.IsValid == Contract.OldValue(this.IsValid)); 
    ... 
} 
+0

Genial, gracias. Funciona. –

1

No, desafortunadamente C# no proporciona una lógica const tal como lo hace C++.

1

La única manera de hacerlo es controlar el código de manera que sepa que no cambiará. No existe un código o sintaxis específica para controlar esto de otra manera (como en C++).

5

Para este propósito, el atributo [Puro] se ha agregado al espacio de nombre System.Diagnostic.Contracts. Ver here para una explicación más detallada. Sin embargo, no puede evitar que se modifique una sola propiedad. El método no puede cambiar el estado del objeto en absoluto (como la const de C++).

EDITAR: Desafortunadamente, el atributo Pure no funciona con las herramientas actuales. He implementado una prueba con el siguiente código, ningún mensaje de error, ya sea en estático ni en la comprobación de tipos en tiempo de ejecución:

public class Test 
{ 
    private int x = 0; 

    [Pure] 
    public void Foo() 
    { 
     x++; 
    } 
} 

En cuanto a la documentación de Pure cheques será apoyado 'en el futuro'. Siempre que eso sea ("El equipo de Contratos de Código está trabajando mucho en eso, por lo tanto, para encontrar un verificador de pureza en una versión futura").

He estado usando el atributo en la creencia de que funciona correctamente. La documentación dice que todos los métodos llamados dentro de un contrato deben declararse como puros. No dice si eso está marcado o no.

Así que la respuesta a su pregunta es: No hay soporte actual para esto, pero puede ser en el futuro.

+4

estaba a punto de proponer la misma cosa, pero decidí ir a la MSDN. Una cosa me preocupa: "Este atributo no se aplica con las herramientas de análisis actuales, debe usar este atributo solo si está seguro de que los métodos son puros". en http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.pureattribute.aspx. Haré una revisión rápida si es un problema o no. – ViktorZ

+0

Confirmado: PureAttribute no produce advertencia o error en el analizador de contrato de código en un método que cambia el estado del objeto. Probado con tiempo de ejecución y comprobación estática. Así que no hay forma de usar contratos de código para este escenario – ViktorZ

+0

Ese es un punto interesante, ¡lo confirmé también! Entonces Microsoft implementa y documenta un atributo que no es de uso real. Eso es malo – slfan

Cuestiones relacionadas