Frage

Der Punkt der const-Korrektheit ist eine Ansicht einer Instanz zu schaffen, in der Lage sein, die nicht verändert werden können, oder vom Benutzer gelöscht. Der Compiler unterstützt dies mit dem Hinweis, wenn Sie Konstantheit innerhalb einer konstanten Funktion brechen, oder versuchen, eine nicht konstante Funktion eines konstanten Objekts zu verwenden. Also ohne den const Ansatz zu kopieren, gibt es eine Methode, die ich in C # verwenden kann, die die gleichen Ziele haben?

Ich bin mir dessen bewusst Unveränderlichkeit, aber das wirklich nicht tragen überContainerObjekte, um nur ein Beispiel.

War es hilfreich?

Lösung

Ich habe zu viel Zeit in dieser Frage kommen und am Ende Schnittstellen.

Ich denke, es ist wichtig, die Idee fallen zu lassen, dass C # jede Form ist, oder sogar eine Entwicklung von C ++. Sie sind zwei verschiedene Sprachen, die fast die gleiche Syntax teilen.

ich in der Regel ausdrücken ‚const Korrektheit‘ in C # durch eine schreibgeschützte Ansicht einer Klasse definieren:

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; }
    }
}

Andere Tipps

Um den Nutzen von const-Verrücktheit (oder ness in der funktionalen Programmierung Begriffe) zu erhalten, müssen Sie Ihre Klassen in einer Weise zu gestalten, so dass sie unveränderlich sind, genau wie die String-Klasse von c # ist.

Dieser Ansatz ist viel besser als nur als Nur-Lese ein Objekt markiert, da mit unveränderlichen Klassen von Daten rund um leicht in Multi-Tasking-Umgebungen passieren kann.

Ich wollte nur für Sie beachten, dass ein AsReadOnly Verfahren viele der System.Collections.Generics Container haben, die Sie wieder eine unveränderliche Sammlung.

C # nicht über eine solche Funktion. Sie können Argument nach Wert oder Verweis übergeben. Referenz selbst unveränderlich ist, es sei denn Sie geben ref Modifikator. Aber referenzierten Daten sind nicht unveränderlich. Sie müssen also vorsichtig sein, wenn Sie Nebenwirkungen zu vermeiden.

MSDN:

Geben von Parametern

Schnittstellen sind die Antwort, und tatsächlich mächtiger als „const“ in C ++. const ist eine one-size-fits-all-Lösung für das Problem, wo „const“ ist definiert als „nicht Mitglieder gesetzt oder etwas nennen, die Mitglieder setzt“. Das ist eine gute Abkürzung für const-ness in vielen Szenarien, aber nicht alle von ihnen. Betrachten wir zum Beispiel eine Funktion, die einen Wert auf einige Mitglieder basierend berechnet, sondern auch die Ergebnisse zwischenspeichert. In C ++ ist, dass nicht-const betrachtet, obwohl aus Sicht der Benutzer es im Wesentlichen const ist.

Schnittstellen geben Ihnen mehr Flexibilität, um die spezifische Untergruppe von Fähigkeiten bei der Definition Sie von Ihrer Klasse zur Verfügung stellen möchten. Möchten Sie const-ness? Geben Sie einfach eine Schnittstelle ohne mutierenden Methoden. Möchten Sie einige Dinge zu ermöglichen, Einstellung, andere aber nicht? Eine Schnittstelle mit nur diesen Methoden.

mit einigen der anderen Zustimmen schauen mit Nur-Lese-Felder, die Sie im Konstruktor initialisieren, um unveränderliche Objekte zu erstellen.

    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; }
    }
  }

Alternativ können Sie auch Zugriffsbereich auf den Eigenschaften, das heißt öffentliche get und geschützt Satz hinzufügen?

    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; }
    }
  }
  • Die const Schlüsselwort für Kompilierung Konstanten wie primitive Typen und Zeichenfolgen
  • verwendet werden
  • Die Nur-Lese Schlüsselwort für Laufzeitkonstanten wie Referenztypen verwendet werden

Das Problem mit Nur-Lese ist, dass es ermöglicht, nur die Referenz (Zeiger) konstant. Die Sache verwiesen (wies auf) noch modifiziert werden. Dies ist der schwierige Teil, aber es gibt keinen Weg drum herum. Zur Umsetzung konstante Objekte bedeutet, sie keine wandelbaren Methoden oder Eigenschaften aussetzen, aber das ist umständlich.

Siehe auch Effective C #: 50 Spezifische Möglichkeiten, Ihre C # zu verbessern (Punkt 2 - Möchte nur lesbar zu konst.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top