Pregunta

El punto de const-corrección es ser capaz de proporcionar una vista de una instancia que no puede ser alterada o borrada por el usuario.El compilador soporta esto señalando al romper constness desde dentro de una constante a la función o al intentar utilizar una no-const de la función de un objeto const.Así que sin la copia de la const enfoque, existe una metodología que puedo usar en C# que tiene el mismo fin?

Soy consciente de la inmutabilidad, pero que realmente no se trasladan a los objetos contenedores para citar sólo un ejemplo.

¿Fue útil?

Solución

Me he encontrado con este problema muchas veces demasiado y terminó el uso de interfaces.

Creo que es importante dejar a la idea de que C# es cualquier forma, o incluso una evolución de C++.Son dos idiomas diferentes que comparten casi la misma sintaxis.

Yo generalmente express 'const ' corrección' en C# mediante la definición de una vista de sólo lectura de una clase:

public interface IReadOnlyCustomer
{
    String Name { get; }
    int Age { get; }
}

public class Customer : IReadOnlyCustomer
{
    private string m_name;
    private int m_age;

    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }

    public int Age
    {
        get { return m_age; }
        set { m_age = value; }
    }
}

Otros consejos

Para obtener el beneficio de la const-la locura (o pureza funcional en términos de programación), que se necesitan para el diseño de sus clases, de manera que son inmutables, como la clase String de c# es.

Este enfoque es mucho mejor que simplemente señalar un objeto como readonly, ya que con inmutable de las clases se puede pasar datos fácilmente en la multitarea de entornos.

Yo sólo quería nota de que muchos de los del Sistema.Las colecciones.Los medicamentos genéricos los contenedores tienen un AsReadOnly método que le va a devolver una inmutable de la colección.

C# no tiene esta característica.Usted puede pasar argumento por valor o por referencia.Referencia a sí mismo es inmutable, salvo que se especifique ref modificador.Pero se hace referencia a los datos no es inmutable.Así que hay que tener cuidado si usted desea evitar los efectos secundarios.

MSDN:

Paso De Parámetros

Las Interfaces son la respuesta, y en realidad son más poderosos que "const" en C++.const es un uno-tamaño-caber-toda la solución para el problema donde "const" se define como "no establece miembros o llamar a algo que los conjuntos de los miembros".Eso es un buen atajo para const-ness en muchos escenarios, pero no todos ellos.Por ejemplo, considere una función que calcula un valor basado en algunos de los miembros, pero también se almacena en caché los resultados.En C++, que se considera no-const, aunque desde la perspectiva del usuario es esencialmente const.

Interfaces de darle más flexibilidad en la definición de subconjunto específico de las capacidades que se desea proporcionar a los de su clase.Quiero const-ness?Acaba de proporcionar una interfaz sin la mutación de los métodos.Desea permitir el ajuste de algunas cosas pero en otras no?Proporcionar una interfaz con sólo esos métodos.

De acuerdo con algunos de los otros una mirada al uso de los campos readonly que se inicializa en el constructor, para crear objetos inmutables.

    public class Customer
    {
    private readonly string m_name;
    private readonly int m_age;

    public Customer(string name, int age)
    {
        m_name = name;
        m_age = age;
    }

    public string Name
    {
        get { return m_name; }
    }

    public int Age
    {
        get { return m_age; }
    }
  }

Alternativamente, usted puede también agregar el acceso ámbito de aplicación de las propiedades, es decir,público conseguir y conjunto protegido?

    public class Customer
    {
    private string m_name;
    private int m_age;

    protected Customer() 
    {}

    public Customer(string name, int age)
    {
        m_name = name;
        m_age = age;
    }

    public string Name
    {
        get { return m_name; }
        protected set { m_name = value; }
    }

    public int Age
    {
        get { return m_age; }
        protected set { m_age = value; }
    }
  }
  • El const palabra clave se puede utilizar para compilar constantes de tiempo, tales como tipos primitivos y cadenas
  • El readonly palabra clave se puede utilizar para constantes en tiempo de ejecución, tales como los tipos de referencia

El problema con readonly es que sólo se permite la referencia (puntero) a ser constante.La cosa se hace referencia (señaló) todavía pueden ser modificadas.Esta es la parte difícil, pero no hay manera alrededor de ella.Para implementar objetos constantes significa hacer que ellos no exponer los métodos o propiedades, sino que esto es incómodo.

Ver también Efectivos De C#:50 Maneras Específicas para Mejorar Su C# (Punto 2 - Prefieren readonly para const.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top