Funktionsparameter als Const ByRef

  • In einigen Skripten findet man Funktionsparameter als Const $param oder Const ByRef $param definiert.

    Welchen Vorteil bringt das - wenn überhaupt?

    Eine ByRef-Definition ist verständlich, dort wird dann mit dem Original gearbeitet, das Kopieren entfällt.

    Was aber bringt eine Const-Definition? Und da Const nicht veränderbar sind, ist doch eine Const ohne ByRef eher sinnlos?

    Also wenn mich mal jemand erleuchten könnte... 8o

    Ich habe in den vergangenen 16 Jahren bei Bedarf ByRef genutzt und mir hat bisher nichts anderes gefehlt.

  • Naja der Vorteil einer Konstante ist das sie halt nicht veränderbar ist.

    Man nutzt es also für Werte, die sich nicht verändern sollten oder dürfen. Das kann natürlich auch die Referenz sein, die erhalten bleiben soll (es darf keine andere Referenz oder Wert eingetragen werden).

    Sprich wenn du versuchst später im Code diese zu verändern schlägt es beim kompilieren fehl und du musst nach bessern.

    Ich nutze nach Möglichkeit immer Local/Global Const für fixe Werte (z.B. Benutzername, Passwort, Serveradresse, Pfad,...).

    Variablen nur, wenn ich das nicht vorab defnieren kann oder der Wert veränderbar sein darf/soll.

    Beispiel (Versionsnummer als Konstante):

    Global Const $Ver = Number(StringSplit(_FileGetProperty(@Scriptdir & '\tocopy\Installer\GoogleChromeStandaloneEnterprise.msi', $comment), '.')[1])

    Edit: Hat auch den Vorteil, das du dir sicher sein kannst, was für einen Wert diese Konstante hat (weil sie eben nach der Initialisierung nicht mehr veränderbar ist).

    Einmal editiert, zuletzt von Moombas (21. März 2022 um 12:00)

  • Welchen Vorteil bringt das - wenn überhaupt?

    Beispiel: Du übergibst Strings mit mehreren Megabyte Größe an deine Funktion.
    In dieser willst du den String selbst nicht verändern - nur analysieren.

    Wie du selbst sagtest wäre eine Übergabe ohne ByRef unnötig lahm und frisst unnötig Speicher, da erst eine Kopie des Strings erstellt werden muss.

    Deswegen macht also schonmal ein ByRef Sinn.

    Um nun noch klar zu machen und ganz sicher zu gehen, dass du diesen String in der Funktion nicht veränderst, wird dann noch einfach das Const dazu geschrieben.

    Kurz: Sorgt dafür, dass sich außerhalb der Funktion die übergebene Variable nicht ändert und bleibt dennoch performant und Speicherfreundlich.

  • Kurz: Sorgt dafür, dass sich außerhalb der Funktion die übergebene Variable nicht ändert und bleibt dennoch performant und Speicherfreundlich.

    Also ist (etwas provokant gesagt) der Sinn dahinter, der Schutz vor eigener Dummheit. Denn wenn ich die Variable an eine Funktion z.B. nur ByRef übergebe, liegt es doch an mir aufzupassen, dass ich sie nicht versehentlich manipuliere, wenn das nicht gewollt ist.

    Einen programmtechnischen Vorteil (ausser dem vorgenannten Aspekt) bietet es also nicht.

  • Ja klar - du könntest das auch ohne Const machen wenn du einfach in der Funktion von der Variable die Finger lässt.

    Das Const bringt hierzu lediglich zusätzlich:

    1. eine technische Schutzschicht vor Veränderungen und
    2. eine menschenlesbare Klarstellung darüber, dass nicht geplant ist diese Variable in der Funktion zu verändern. (wenn du später den Code anschaust weißt du sofort, dass das ByRef nur aus Performance-Gründen dort steht)
  • BugFix 21. März 2022 um 13:17

    Hat das Label von [ offen ] auf [ gelöst ] geändert.
  • BTW: AutoIt erstellt erst dann eine lokale Kopie von Parametern, wenn sie geändert werden.
    Da Const nicht geändert werden kann, ist ByRef nicht notwendig.

  • In der Hilfe für "Func"

    Zitat

    Entire arrays can be passed to functions (and returned from them) by simply using the array name without any brackets. Arrays should be passed to user-defined functions using the ByRef keyword to avoid the overhead of copying all the data in the array. Note that AutoIt only copies an array parameter if the contents are changed, so it is only in this case that ByRef offers an advantage, although it is recommended that to use it in all cases.

    Ich glaube aber, mich erinnern zu können, dass dies nicht nur für Arrays gilt. War vor ewigen Zeiten mal eine Diskussion im engl. Forum.

  • Gilt scheinbar doch nur für Arrays.

  • Ne scheint schon so zu sein - hab es mal mit nem großen String probiert - kein relevanter Unterschied feststellbar:

  • Ich frage mal die Gurus im engl. Forum :)
    Vielleicht sollte man dann die Hilfe etwas anpassen.

  • Melba meint, dass das nur für Arrays gilt.