New Rectangle(Point.X, Point.Y, 5, 5) Oder New Rectangle(Point, New Size(5,5))

  • Allgemein

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    New Rectangle(Point.X, Point.Y, 5, 5) Oder New Rectangle(Point, New Size(5,5))

    Da ich in letzter Zeit öfters vor dieser Frage stehe interessiert mich die Meinung anderer Programmierer.
    Ist es einfacher/sinnvoller/perfomanter

    VB.NET-Quellcode

    1. Dim Irgendwas As New Rectangle(Point1.X, Point1.Y, 5, 5)

    oder

    VB.NET-Quellcode

    1. Dim Irgendwas As New Rectangle(Point1, New Size(5, 5))

    zu verwenden?

    Point1 ist bereits vorhanden (vom Typ System.Drawing.Point) und Width bzw. Height sind fest vorgegeben.

    Die erste Methode erscheint mir schwieriger, wenn der Punkt erst über Umwege ermittelt werden muss (als Beispiel "DirectCast(sender, Button).Location")
    Allerdings wird bei der zweiten Methode eine Instanz einer Size erstellt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Du erzeugst bei nummer 2 ein neues objekt, und ich gehe davon aus dass dieses objekt mehr speicher als 2 int variablen verbraucht(ich weiß es nicht, ich gehe bloß davon aus)
    Und weil das Rectangle am ende eine eigne kopie der zahlen anfertigt (ob bloß als int oder als size ist egal) gibst du mit dem neuen Objekt deinem Garbage Collector bloß mehr arbeit.
    ich würd das erste nehmen
    Ich erlaube mir mal, zu vermuten, dass das überhaupt keinen Unterschied macht.
    Wahrscheinlich wird das Ganze intern sowieso so behandelt:

    VB.NET-Quellcode

    1. Public Class Rectangle
    2. Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal Width As Integer, ByVal Height As Integer)
    3. Me.Location = New Point(x, y)
    4. Me.Size = New Size(Width, Height)
    5. End Sub
    6. Public Sub New(ByVal Location As Point, ByVal Size As Size)
    7. Me.Location = Location
    8. Me.Size = Size
    9. End Sub
    10. End Class
    Wobei man bei letzterem gleich eine Referenz zu einem existierenden Point/Size-Objekt übergeben könnte, was dann auch wieder Speicher sparen würde...
    Es ist definitiv so, dass beide Verfahren denselben Speicher benötigen. Die Auswahl der Methode sollte sich nach den vorhandenen Daten richten.
    In Deinem Fall ist es definitiv egal.
    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!
    in deinem Beispiel ist das erste schneller, da es ein Objekt weniger erzeugt...
    intern sieht New bei der Rectangle-Klasse nämlich so aus:

    VB.NET-Quellcode

    1. Sub New(x As Integer,y As integer,width As Integer,height As Integer)
    2. Me.x = x
    3. Me.y = y
    4. Me.width= width
    5. Me.height = height
    6. End Sub
    7. Sub New(location As Point,Size As Size)
    8. Me.x = location.X
    9. Me.y = location.y
    10. Me.width = size.Width
    11. Me.height = size.Heigth
    12. End Sub
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Rectangle, Point, Size, ... sind Strukturen und keine Klassen, herrjeh.
    Himmelweiter Unterschied.

    Ob du nun in einer Struktur definierst welche Variablen wo liegen oder in der Signatur der Sub/Function ist irrelevant. Zuweisen musst du die Werte so oder so, ergo 0 Unterschied.

    Relevanter ist da eher das interne Handling, welches sich aber nahezu vernachlässigen lässt.

    Performanter wäre es die Point/Size/Rect's zu cachen (sprich in der Klasse / dem Control zu definieren) und dann nur bei Bedarf zu verändern (in OnResize z. B.). Sofern möglich.
    Herrjeh ich hab recht :P
    Strukturen und Klassen: Himmelweiter unterschied?!
    Eigentlich überhaupt nicht, der Hauptunterschied besteht darin, dass Klassen Referenztypen sind und Strukturen sind Wertetypen, somt sind Klassen für den Globalen/langlebigen Gebrauch da...

    Aber der Unterschied zwischen 1 und 2 bleibt weiterhin bestehen - wenn auch gering, um den Wert nur bei bedarf zu ändern braucht man ja auch nicht gleich eine neue Klasse zu machen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Herrjeh ich hab recht :P

    Nein, hast du nicht.
    Lies mal das hier: msdn.microsoft.com/de-de/library/2hkbth2a(v=vs.80).aspx
    Oder auch das hier: msdn.microsoft.com/en-us/library/aa289521(v=vs.71).aspx

    Wichtigster Punkt: "Strukturen verwenden Stapelzuweisung; Klassen verwenden Heapzuweisung."
    Erklärung:
    Reference types are managed on the heap, value types on the stack. There is a performance overhead for heap allocation, object access, and garbage collection, so class instances are less efficient than structure instances in this respect. The speed difference, which depends on many factors such as platform, loading, and data size, can range from unnoticeable to enormous.

    Edit by Manschula: Ein Vollzitat des vorhergehenden Beitrags ist nun wirklich unnötig --> Vollzitat gekürzt

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

    Hab ich weiterhin:

    jvbsl schrieb:

    der Hauptunterschied besteht darin, dass Klassen Referenztypen sind und Strukturen sind

    So groß ist der Unterschied nicht...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also erst mal danke für die ganzen Antworten.

    Werden aber bei (um das im ersten Post genannte Beispiel nochmal zu verwenden) New Rectangle(DirectCast(sender, Button).Location.X, DirectCast(sender, Button).Location.Y, 5, 5) nicht auch jedesmal neue Instanzen eines Buttons erstellt (also hier zwei mal)? Dann wäre die Frage, ob eine Instanz von Size nicht größer als zwei Instanzen von Button ist, oder?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Werden aber bei (um das im ersten Post genannte Beispiel nochmal zu verwenden) New Rectangle(DirectCast(sender, Button).Location.X, DirectCast(sender, Button).Location.Y, 5, 5)
    :?: im ersten Post steht nix von Button
    nicht auch jedesmal neue Instanzen eines Buttons erstellt (also hier zwei mal)?

    ;( Sehr daneben. DirectCast erstellt doch keine neue Button-Instanz!

    WarFlys Schreibweise is vlt. bisserl leserlicher, weil die Zeile nicht so elend lang ist. Nur wasses soll, den tmpButton auf Nothing zu setzen?
    @ErfinderDesRades: Ist ein bisschen unoffensichtlich, ich weiß
    Die erste Methode erscheint mir schwieriger, wenn der Punkt erst über Umwege ermittelt werden muss (als Beispiel "DirectCast(sender, Button).Location")


    Um es umzuschreiben: wird nicht jedes mal (also zwei mal) der Sender von Neuem in den Typ Button gecastet, was auch nicht Resourcen schonend ist?

    @Warfley: :D hätte mir nicht gedacht, dass die Referenz bei DirectCast vorhanden bleibt (ich muss mich mal ein Bisschen damit beschäftigen). Und weg ist der Button...
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    ErfinderDesRades schrieb:

    Ist piepegal.
    Nimm das was weniger umständlich hinzuschreiben ist.

    Wir müssen echt nicht die einzelnen Bytes zählen, die in einer Methode alloziiert werden (und anschließend natürlich sofort wieder frei sind).

    Und Directcast ist zwar ein grauenhaft unleserliches Schlüsselwort, aber gehört zu den schnellsten Operationen, die ausgeführt werden. Ich bin mir nicht sicher, aber vlt. löstes sich bei Übersetzung sogar in Nichts auf.
    Also dasses nur eine Anweisung an den Compiler ist: "Betrachte dieses "sender"-Token einfach mal nicht als vom Typ Object, sondern als vom Typ Button".

    Ich sachs nochma: Es ist unvergleichlich viel wichtiger, dass Code gut lesbar ist, als dass da 10 Bytes über einen Zeitraum von 1000 Takten eingespart werden oder sowas.
    Oder ob die Methode mw. auch um 1000 Takte länger dauert.

    Interessiert nicht die Bohne.
    Ich habe ja nur rein von der Theorie geredet :P
    Und es ist richtig DirectCast ist wirklich sehr schnell, da hier beim Objekt nur geschaut wird, ob es von dem Typen erbt, in den gecastet werden soll, andernfalls bekommt man sowieso einen Fehler...
    Bei CType wird z.B. geguckt ob es möglich ist zu konvertieren, was somit viel mehr Zeit in Anspruch nimmt...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---