Frage

eine freundliche Diskussion mit einem Kollegen darüber zu haben. Wir haben ein paar Gedanken darüber, aber fragen, was die SO Menge darüber denkt?

War es hilfreich?

Lösung

Ein Grund ist, gibt es keine CLR Unterstützung für eine Nur-Lese-local. Nur-Lese wird in den CLR / CLI initonly Opcode übersetzt. Dieses Flag kann nur auf Felder angewandt werden und hat keine Bedeutung für eine lokale. In der Tat wird wahrscheinlich nicht überprüfbaren Code es zu einem lokalen Anwendung erzeugen.

Dies bedeutet nicht, dass C # dies nicht tun konnte. Aber es würde zwei verschiedene Bedeutungen auf die gleiche Sprache zu konstruieren. Die Version für Einheimische würden keine CLR Äquivalent-Mapping haben.

Andere Tipps

Ich denke, es ist ein schlechtes Urteil auf einen Teil der C # Architekten. Nur-Lese-Modifikator auf lokale Variablen hilft Programm Korrektheit halten (genau wie behauptet) und kann möglicherweise den Compiler Code optimieren helfen (zumindest im Fall von anderen Sprachen). Die Tatsache, dass es jetzt in C # nicht erlaubt ist, ist ein weiteres Argument, dass einige der „Features“ von C # sind nur eine Durchsetzung des persönlichen Codierung Stil seines Schöpfers.

Jared Antwort Adressierung, wäre es wahrscheinlich muß nur ein Compiler-Feature sein -. Die Compiler würden Sie verbieten nach der ersten Erklärung an die Variable zu schreiben (was müßte einen Auftrag enthält)

Kann ich Wert in diesem? Möglicherweise - aber nicht viel, um ehrlich zu sein. Wenn Sie sich nicht leicht sagen können, ob eine Variable zugewiesen werden wird an anderer Stelle im Verfahren, dann Ihre Methode ist zu lang.

Für das, was es wert ist, Java über diese Funktion verfügt (mit dem final Modifikator) und ich habe sehr nur selten verwendet, um andere zu sehen als in Fällen, in denen es hat zu sein verwendet die Variable zu ermöglichen, von einem anonymen inneren Klasse erfasst werden -. und wo es ist verwendet, ist es mir einen Eindruck von Unordnung gibt eher als nützliche Informationen

Ein Vorschlag Nur-Lese Einheimische und Parameter für war kurz von dem C # 7 Design-Team diskutiert. Aus C # Design Sitzung Hinweise für 21. Januar 2015 :

  

Parameter und Einheimische können von Lambdas und dadurch zugegriffen gleichzeitig erfaßt werden, aber es gibt keine Möglichkeit, sie von gemeinsam genutztem gegenseitigen Zustand Problemen zu schützen. Sie nicht nur lesbar sein

     

Im Allgemeinen sind die meisten Parameter und viele Einheimische sind nie zugewiesen werden soll, nachdem sie ihren Anfangswert erhalten. Zulassen nur lesbar auf sie ausdrücken würde diese Absicht deutlich.

     

Ein Problem ist, dass diese Funktion möglicherweise ein „attraktives Ärgernis“ sein. Während das „Richtige“ fast immer zu tun wäre, um Parameter und Einheimischer nur lesbar zu machen, wäre es den Code erheblich Krempel zu tun.

     

Eine Idee, zum Teil dieses zu lindern, ist die Kombination nur lesbar var auf einer lokalen Variablen zu ermöglichen, kurz val oder so etwas zu vergebende. Allgemeiner versuchen wir könnten einfach ein kürzeren Schlüsselwort zu denken, als die Nur-Lese die Nur-Lese-ness auszudrücken etabliert.

Diskussion setzt sich in der Sprache C # Design-Repo. Abstimmen Ihre Unterstützung zu zeigen. https://github.com/dotnet/csharplang/issues/188

ich war, dass Mitarbeiter und es war nicht freundlich! (Kleiner Scherz)

Ich würde die Funktion nicht beseitigen, weil es besser ist, kurze Methoden zu schreiben. Es ist ein bisschen wie zu sagen, Sie sollten nicht Threads verwenden, weil sie hart sind. Gib mir das Messer und lassen Sie mich nicht schneiden selbst verantwortlich sein.

Ich persönlich wollte einen anderen „var“ type Stichwort wie „inv“ (invarient) oder „rvar“ Unordnung zu vermeiden. Ich habe als in den letzten F # studiert und finden Sie die unveränderliche Sache ansprechend.

Nie wusste Java dies hatte.

Ich mag lokale Read-only Variablen in der gleichen Weise wie ich lokales wie const Variablen. Aber es hat weniger Priorität als andere Themen.
Vielleicht ist es Priorität ist der gleiche Grund für Designer C # nicht zu (noch!) , um diese Funktion zu implementieren. Aber es sollte leicht sein (und rückwärtskompatibel) lokale Nur-Lese-Variablen in zukünftigen Versionen zu unterstützen.

Es ist eine Aufsicht für c # -Sprache Designer. F # hat val Schlüsselwort und es basiert auf CLR. Es gibt keinen Grund, C # nicht die gleiche Sprache Funktion haben kann.

Read-only bedeutet, den einzigen Ort, das Instanz-Variable in dem Konstruktor werden kann. Wenn Sie eine Variable deklariert lokal ist es nicht eine Instanz hat (es ist nur in scope), und es kann nicht vom Konstruktor berührt werden.

Ich weiß, diese Antwort nicht das Warum auf Ihre Frage. Wie auch immer, diejenigen, diese Frage zu lesen könnten den Code dennoch zu schätzen wissen.

Wenn Sie wirklich besorgt sind mit sich selbst in den Fuß zu schießen, wenn eine lokale Variable überschreiben, die nur einmal eingestellt werden sollte, und Sie nicht wollen, machen es zu einem mehr global zugängliche Variable, Sie so etwas tun könnte.

    public class ReadOnly<T>
    {
        public T Value { get; private set; }

        public ReadOnly(T pValue)
        {
            Value = pValue;
        }

        public static bool operator ==(ReadOnly<T> pReadOnlyT, T pT)
        {
            if (object.ReferenceEquals(pReadOnlyT, null))
            {
                return object.ReferenceEquals(pT, null);
            }
            return (pReadOnlyT.Value.Equals(pT));
        }

        public static bool operator !=(ReadOnly<T> pReadOnlyT, T pT)
        {
            return !(pReadOnlyT == pT);
        }
    }

Beispiel Nutzung:

        var rInt = new ReadOnly<int>(5);
        if (rInt == 5)
        {
            //Int is 5 indeed
        }
        var copyValueOfInt = rInt.Value;
        //rInt.Value = 6; //Doesn't compile, setter is private

Vielleicht nicht ganz so weniger Code als rvar rInt = 5 aber es funktioniert.

Sie können nur lesbar lokale Variablen in C # erklären, wenn Sie den C # Compiler interaktiven csi verwenden:

>"C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe"
Microsoft (R) Visual C# Interactive Compiler version 1.3.1.60616
Copyright (C) Microsoft Corporation. All rights reserved.

Type "#help" for more information.
> readonly var message = "hello";
> message = "goodbye";
(1,1): error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer)

Sie können auch nur lesbar lokale Variablen im .csx Skriptformat deklarieren.

c # hat bereits einen Nur-Lese-var, wenn auch in einer etwas anderen Syntax:

Beachten Sie die folgenden Zeilen:

var mutable = myImmutableCalculationMethod();
readonly var immutable = mutable; // not allowed in C# 8 and prior versions
return immutable;

Vergleichen mit:

var mutable = myImmutableCalculationMethod();
string immutable() => mutable; // allowed in C# 7
return immutable();

Zwar könnte die erste Lösung möglicherweise weniger Code zu schreiben. Aber der zweite Schnipsel machen die nur lesbar explizit, wenn Verweis auf die Variable.

Ich denke, das ist, weil eine Funktion, die eine nur lesbare Variable hat, kann nie genannt werden, und es ist wahrscheinlich etwas darüber aus Tragweite geht, und wann würden Sie müssen?

Verwendung const Schlüsselwort nur Variable gelesen werden.

Referenz: https://docs.microsoft .com / en-us / dotnet / csharp / Sprache Verweis / Keywords / konst

public class SealedTest
{
    static void Main()
    {
        const int c = 707;
        Console.WriteLine("My local constant = {0}", c);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top