Warum eine Konstante benutzen und keine normale Variable

  • Allgemein

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    Warum eine Konstante benutzen und keine normale Variable

    Tach auch,

    ich habe mich mal gefragt, welchen praktischen Nutzen es hat, eine Konstante zu benutzen?
    Klar ne Konstante kann man nicht ändern... Aber nen "Vorteil" ist das für mich nicht.
    Gibt es einen Performance-Vorteil?! Muss für eine Konstante kein zusätzlicher Speicher reserviert werden, sondern nur jener, der einmalig zugewiesen wird?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Einen minimalen Vorteil bringt es, da das Programm nicht ständig testen muss, ob die Variable geändert wurde,
    die leistungsersparniss ist allerdings so klein, dass es fast nichts bringt.
    Außerdem läufst du nicht Gefahr, die Variable mit einer ähnlichen Variable zu verwechseln.
    Aber sonst sehe ich auch keine Nennenswerten Vorteile
    in einer anderen Sprache die ich für die Arbeit brauche benutze ich ziemlich oft Konstanten aber auch nur aus dem Grund das wenn ich in Rechnungen später auch noch weiß warum ich jetzt den einen Wert abgezogen habe.

    z.b. Tischunterkante = Tischhoehe - Konstante Plattenstärke anstelle Tischunterkante = Tischhoehe - 25mm

    ist zwar ein einfaches beispiel aber mir hilft die konstante immer dabei einem Wert einen Namen zu geben.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Ich frage mich, warum sollte ich Konstante Plattenstärke benutzen und nicht Plattenstärke :D
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Es gibt einen - wenn auch vernachlässigbaren (in allermeisten Fällen) - Performanceunterschied. Der grössere Punkt ist, dass man je nach Problem Variablem braucht, die unter keinen Umständen verändert werden dürfen. Wenn jemand eine Methode zur Flächenberechung von Kreisen schreibt, wäre es natürlich verheerend wenn man die Konstante PI innerhalb der Methode ändern könnte. Für den Author der Methode mag es klar sein, dass eine grösse immer die selbe sein sollte. Wird dieser Code an andere Leute weitergegeben, kann das natürlich anders aussehen.
    "I think Microsoft has abused the Windows brand so much that it has lost its cachet."
    Paul Thurrott

    MemoAnMichSelbst schrieb:

    Ich frage mich, warum sollte ich Konstante Plattenstärke benutzen und nicht Plattenstärke :D


    ja wenn es verschiedene Stärken gibt dann trifft dies ja auch zu ;) gibt aber andere Fälle (zumindest bei mir) wo sich Werte nie verändern.
    In meinem Fall ist es schwer zu erklären wenn man das was ich mache nicht kennt aber auch in VB ist es ja nützlich wenn man die Konstante ändern kann
    wenn mal was sein sollte und nicht den ganzen Code nach Werten absuchen muss oder?
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Hey,

    ich meine auch mal iwo gelesen zu haben, dass eine Const vom Compiler direkt in die IL geschrieben wird, anstatt den Wert aus dem Speicher zu holen.

    Z. B. folgender QuellCode:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Const a As Integer = 10
    3. Dim b As Integer = 100
    4. MessageBox.Show(a.ToString())
    5. MessageBox.Show(b.ToString())
    6. End Sub


    Mit IL-Spy dekompiliert:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs)
    2. Dim b As Integer = 100
    3. MessageBox.Show(10.ToString())
    4. MessageBox.Show(b.ToString())
    5. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    ich meine auch mal iwo gelesen zu haben, dass eine Const vom Compiler direkt in die IL geschrieben wird, anstatt den Wert aus dem Speicher zu holen.
    Das meinst du nicht nur, das ist sogar wirklich so ;). Der Compiler ersetzt verweise auf Konstanten direkt durch deren Wert. Zusätzlich werden private Konstanten sogar gelöscht bzw. entfernt und dienen somit eigentlich nur der Wartbarkeit.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @MemoAnMichSelbst: Konstanten solltest Du immer dann verwenden, wenn der Wert nie geändert werden kann/darf und Du dem Wert einen aussagekräftigen Namen geben willst.
    Beispiele:
    Math.Pi
    Math.E
    Byte.MinValue
    Byte.MaxValue
    (Das selbe für andere primitive Datentypen)
    Double.Epsilon
    Double.PositiveInfinity
    Double.NegativeInfinity
    Double.NaN
    (Das selbe für Single)
    DateTime.TicksPerMillisecond
    (Und TicksPerSecond, Minute, etc.)
    Timeout.Infinite

    Das sind alles Werte, die nie geändert werden, weil es keinen Sinn machen würde. Und da verwendet man Konstanten.

    Und ja, es gibt einen kleinen Performance-Unterschied.
    Beispiel:

    VB.NET-Quellcode

    1. Public Class Foo
    2. Private Shared (ReadOnly) ValueA As Integer = 2
    3. Private Const ValueB As Integer = 4
    4. Public Sub Bar()
    5. Dim Temp As Integer
    6. Temp = ValueA
    7. Temp = ValueB
    8. End Sub
    9. End Sub

    Also die Bar-Methode weist der lokalen Variable einmal ValueA zu, welches ein (ReadOnly)-Feld ist, und danach ValueB, welches eine Konstante ist.
    Die Bar-Methode wird zu folgendem IL-Code kompiliert:

    Quellcode

    1. .method public instance Bar() cil managed
    2. {
    3. .locals init ( [0] valuetype Int32 'Temp' )
    4. ldsfld Foo.ValueA
    5. stloc_0
    6. ldc_i4_4
    7. stloc_0
    8. ret
    9. }

    Wie Du siehst, muss beim Feld tatsächlich der Inhalt des Feldes geladen werden (ldsfld). Macht Sinn, denn der Compiler weiß ja nicht, dass Du den Wert nie verändern wirst.
    Hingegen "verschwindet" die Konstante beim Kompilieren. Da wird direkt der Wert 4 auf den Auswertungsstapel gelegt (ldc_i4_4). Das ist schneller. Insbesondere, wenn man kein statisches Feld verwendet, sondern (unnötigerweise) ein Instanzfeld. Denn dann kommt das heraus:

    Quellcode

    1. ldarg_0
    2. ldfld Foo.ValueA
    3. stloc_0

    Also da wird nochmal zuerst die aktuelle Instanz auf den Stapel gelegt, und dann muss da der Wert des Feldes rausgepuhlt werden.

    Also es gibt einen Performance-Unterschied, aber der ist, wie gesagt wurde, so gering, dass er vernachlässigbar ist.
    Viel wichtiger ist die zusätzliche Information, die die Konstante bekommt, dadurch, dass sie als konstant deklariert wurde. Denn dadurch weiß man als Programmierer "Aha, das ist eine Konstante".

    Edit: War zu langsam.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Der (vernünftige) Name einer Konstante liest sich im Quelltext besser als eine Zahl.
    @MemoAnMichSelbst:: Welchen Wert gibst Du der Zahl, die sich aus der Division von Kreisumfang und Durchmesser ergibt? :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, also gibt es für mich zwei wirkliche Gründe eine Konstante zu verwenden anstelle einer normalen Variable:
    1. Konstanten werden vom Compiler direkt in die IL geschrieben
    2. Konstanten können als optionaler Parameter eingesetzt werden

    Dass man ne Konstante sinnvoll benennt und dass sie aussagekräftiger als ne Zahl ist, steht ja nicht zur Abrede... Gleiches gilt schließlich auch für eine normale Variable. Meine Frage hingegen war ja, warum sollte ich eine Konstante und keine Variable nehmen.

    Ich denke die zwei obigen Punkte, sind interessant.


    @RodFromGermany: Kreiszahl :P
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    jo - und punkt 1 ist auch noch irrelevant, denn kein proggi wird jemals laggen, weils seine Konstanten variabel definiert (beachte die sprachliche Paradoxie ;)).

    Konstanten sind also v.a. eine inhaltliche Aussage: "dieser Wert ist Konstant".

    So, wie man eine Property ebensogut (ich finde sogar: eiglich besser) durch Setter- und Getter- Methode simulieren kann (ist es im Hintergrund sogar), so kann man auch eine Konstante durch ein Shared Readonly Feld "simulieren".
    Aber für die menschliche OOP-Denkweise ists günstiger, man spricht von der Eigenschaft eines Objekts.
    Und so ists fürs menschliche Hirn auch besser, eine Konstante als Konstante zu denken - nicht als Shared Readonly.

    MemoAnMichSelbst schrieb:

    Kreiszahl
    Math.PI, eine Konstante.
    Oder wieviele Stellen schreibst Du davon in Deinen Code? :D

    VB.NET-Quellcode

    1. Dim pi As Double = Math.PI
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Na, darum geht's doch garnicht.
    Pi könnte ja genausogut von mir einmal als Variable definiert werden und ich wäre (programmierertechnisch) damit genauso durch wie wenn ich "Const" noch zu schreib...
    Für mich ist das kein Mehrwert einer Konstante... Das ist ne typische Funktion einer Variable. Mir geht's ja darum was der Mehrwert ist gegenüber einer Variable (nicht gegenüber dem darin gespeicherten Wert). Ein nicht-veränderbar sein ist kein Vorteil... Das ist ein Nachteil... Den man in Kauf nehmen kann wenn man eine Variable nicht ändern muss, da sie konstant ist. Aber nunmal kein Mehrwert.

    EDIT: Gut dass es von nem Menschen anders wahrgenommen wird, damit könntest sogar recht haben.
    Aber vom Prinziep her macht es für mich keinen schlechteren Eindruck wenn ich nen Wert als Variable hinterlege und nicht als Konstante.
    Ich muss zugeben ich hab in meinen ganzen Variablensammlungen bislang kaum ne Konstante definiert und habe mich deshalb mal gefragt... warum gibbets sowas eigentlich.

    Ich komme dann zu dem Schluss...
    Es geht um die Lesbarkeit des Codes und es schwingt noch ein minimaler Performance-Vorteil mit, der aber bei Sprachen wie .Net allgemein nicht wirklich im Vordergrund steht.
    Demnach handelt es sich um ne eher für den Entwickler gedachte Hilfe in dem er drauf gestoßen wird "ACHTUNG Konstante"...
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    Mehrwert ist das bessere Verständnis.
    Man kann das Programm auch in einer Funktion runterschreiben, unstrukturiert. Warum tut man das nicht (zumindest sollte man nicht ;) )? Weil es unverständlich, schlecht wartbar und nur schwer veränderbar und anpassbar ist.
    Wenn eine Konstante auch als Konstante definiert und benannt ist (auch im Namen), sieht ein Mensch, der dein Programm anschaut (auch du einige Monate später), sofort, dass es eine Konstante ist und braucht nicht mehr zu überprüfen, ob auf diese Variable irgendwo zugegriffen wird und deren Wert sich verändert.
    Wenn man ein Programm anschaut, hat man ein Bild, eine Struktur, ein Modell im Kopf (sollte man zumindest) - und "Konstante" ist ein Puzzlestein, welches es erleichtert, dieses Modell schneller zu bilden. Wenn es natürlich an der Stelle sinnvoll ist...
    Hi
    wie schon gesagt, es ist in gewissen Bereichen ein Nachteil, aber Pi wird sich nicht von heute auf morgen ändern, auch wenn von gewissen Menschen immer wieder Versuche dahingehend unternommen werden. D.h. sie ist eben konstant. Konstante Werte werden, wie bereits gesagt wurde, nicht aus dem Heap genommen, sondern direkt in den IL-Code geschrieben, d.h. der Zugriff ist effizienter, sofern der JITC das nicht wegkompiliert, was er afaik nicht tut/kann, da das Festlegen im statischen Konstruktor des enthaltenden Typs festgelegt wird. D.h. hier wird ebenfalls ein "Methoden"aufruf ausgeführt, der beim Kompilieren von IL-Code zu nativem Code (einmalig) stattfindet (mittels lazy evaluation, wenn ich mich an die Tests richtig erinnere).
    Statische readonly-Properties sind nicht konstant (!), ebenso ist der Inhalt konstant definierter Strings nicht konstant, sondern lediglich das darstellende Handle auf den String. D.h. der Wert, der das Objekt darstellt ist konstant. Für Wertetypen, wie Integer, usw. ist somit auch der Wert konstant, der Speicher, an dem der Wert steht, aber nicht. Daher kann man String-Inhalte mittels Zeiger eben auch beschreiben, obwohl das Speicherhandle konstant ist (der Wert liegt ja im Heap!).
    Insgesamt dienen schreibgeschützte Werte natürlich einem Zweck und es ist auch kein Nachteil. Nicht-primitive Typen außer String, Type und einige ausgewählte Typen (z.B. auch Enums) sind außerdem nicht als Konstante darstellbar.

    Gruß
    ~blaze~
    Es ist kein Mehrwert, offensichtlich konstante Werte veraenderlich zu machen. Es ist mir frueher oft passiert, dass ich an Sachen wie Stringformat.Genericdefault rumgepfuscht hab, weil ich dachte es waere konstant (inzwischen weiss ich ja, dass das bei Klassen gar nicht geht und auch ein Readonly nur vor der Zuweisung schuetzt, nicht aber vir dem Aendern der Eigenschaften). Und das hatte dann ziemlich unschoene Folgen, wie du dir vielleicht vorstellen kannst.
    Ein nicht-veränderbar sein ist kein Vorteil... Das ist ein Nachteil... Den man in Kauf nehmen kann wenn man eine Variable nicht ändern muss, da sie konstant ist. Aber nunmal kein Mehrwert.

    Aber das ist doch genau der Vorteil, den man durch Konstanten bekommt 8|
    Gott sei Dank kann man das nicht mit Konstanten machen:

    VB.NET-Quellcode

    1. Sub Foo()
    2. MessageBox.Show(CalculateCircumfence(15).ToString)
    3. Math.Pi = 3.0
    4. MessageBox.Show(CalculateCircumfence(15).ToString)
    5. End Sub
    6. Function CalculateCircumfence(Diameter As Double) As Double
    7. Return Diameter * Math.Pi
    8. End Function

    Das ist ja der Sinn von Konstanten, dass man sie nicht verändern kann.
    Man kann Pi nicht versehentlich auf 3 ändern... oder auf 7.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Also...
    Versehentlich ne Variable ändern sollte man allgemein nicht...
    Auch wenn ich ne Variable habe die keine Konstante ist, werde ich es tunlichst vermeiden diese zu ändern wenn ich es nicht explizit WILL!
    Ich hoffe mal du änderst nicht wild die von dir deklarierten Variablen ohne Absicht dahinter ^^


    ErfinderDesRades - Moderator - Notiz: ich hoffe, es ist in Ordnung für euch, das Thema hier mal abzuschließen. Soweit ich sehe, ist alles zum Thema gesagt, und hat auch jeder verstanden, und weiteres kann sich nur noch im Kreise drehen
    --> closed
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()