Autor Beitrag
funcry
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Mi 04.02.09 10:17 
Mir ist aufgefallen, dass fast in jedem Beispiel in der c# Hilfe, sowie auch im Netz fast vor jeder Methode Static steht.

So wie ich die Hilfe gelesen habe ist dies überhaupt nicht erforderlich und geht zur Lasten der Performance.

In einem speziellen Fall habe ich innerhalb einer Klasse eine weitere definiert, und diese mit static gekennzeichnet. Jetzt konnte ich auf die Methoden zugreifen, ohne dass ich die nested class vorher erzeugen musste. Das ist doch der einzige Sinn und Zweck von static, oder habe ich da etwas falsch verstenden / übersehen ?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 04.02.09 10:49 
user profile iconfuncry hat folgendes geschrieben Zum zitierten Posting springen:
Mir ist aufgefallen, dass fast in jedem Beispiel in der c# Hilfe, sowie auch im Netz fast vor jeder Methode Static steht.

Das ist mir ganz und gar nicht aufgefallen. Im Gegenteil: Wenn ich mir "Alle Member" der Control-Klasse, der Basisklasse für alle Controls in WinForms, anschaue, gibt es nur einige wenige statische Member. Etwas anderes sind Klassen, die spezielle Methoden bereitstellen, wie File, Directory oder auch String, Array.

user profile iconfuncry hat folgendes geschrieben Zum zitierten Posting springen:
So wie ich die Hilfe gelesen habe ist dies überhaupt nicht erforderlich und geht zur Lasten der Performance.

Zu "überhaupt nicht erforderlich" siehe die folgende Erklärung. Zur "Performance" hat static vermutlich keinerlei praktische Auswirkungen. Bei einer "normalen" public-Methode wird vorher eine Instanz der Klasse benötigt; bei einer statischen Methode wird intern so etwas wie eine virtuelle Instanz benötigt (irgendwo muss die Methode ja stehen und aktiviert werden). Das dürfte also keinen Unterschied ausmachen.

user profile iconfuncry hat folgendes geschrieben Zum zitierten Posting springen:
In einem speziellen Fall habe ich innerhalb einer Klasse eine weitere definiert, und diese mit static gekennzeichnet. Jetzt konnte ich auf die Methoden zugreifen, ohne dass ich die nested class vorher erzeugen musste. Das ist doch der einzige Sinn und Zweck von static, oder habe ich da etwas falsch verstenden / übersehen ?

Sinn und Zweck von static sind Sachen, die sich auf die Klasse selbst beziehen und nicht auf eine bestimmte Instanz. Siehe die Erläuterungen in der SDK-Doku/MSDN zum static-Schlüsselwort, z.B. zu dem dort genannten Beispiel:
Zitat:
... eine Klasse, die einen Firmenangestellten repräsentiert. Nehmen Sie an, dass die Klasse eine Methode zum Zählen der Angestellten und ein Feld zum Speichern der Angestelltenzahl enthält. Weder die Methode noch das Feld sind Elemente einer Angestellteninstanz. Stattdessen gehören sie zur Klasse. Daher sollten sie als Member des Typs static der Klasse deklariert werden

Ob die "nested class" oder ihre Eigenschaften oder ihre Methoden sinnvollerweise statisch sind oder nicht, hängt also vom Verwendungszweck ab.

Gruß Jürgen
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 04.02.09 12:25 
Zitat:
So wie ich die Hilfe gelesen habe ist dies überhaupt nicht erforderlich und geht zur Lasten der Performance.


Könntest du Bitte die Quelle zitieren wo du das gelesen hast? Das würde mich interessieren.
Eigentlich sollten statische Methoden schneller sein (auch wenn der Unterschied eher irrelevant ist, vielleicht messbar aber wohl so gut wie nie spürbar) da bei Instanzmethoden zusätzlich der this Pointer auf null geprüft wird.

Siehe dazu zum Beispiel dotnetperls.com/Content/callvirt.aspx
funcry Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Do 05.02.09 09:01 
Danke für die Ausführungen.

Vermutlich bringe ich da noch paar Sachen durcheinander. Daher auch die Frage im Forum weil mir da noch als Umsteiger so manches spanisch vorkommt :-)

Dass static langsam zu sein scheint habe ich aufgeschnappt bei einem Beispiel zu statischen Contructoren:

dotnetperls.com/Cont...tic-Constructor.aspx

Auf die Frage bin ich gestossen da ich derzeit versuche ein kleines Tesprogramm mittels Threading zu beschleunigen. Dazu studiere ich derzeit die Quellen im Internet und der c# Hilfe (thread, threadpool, parallel extension, delegates, events, anonyme Methoden, statthread, mtathread). Dabei bin ich auf eine Wissenlücke gestossen was Static betrifft.

Hier ist mir aufgefallen, dass in den Beispielen oft static genutzt wird:

msdn.microsoft.com/d...900fyy8e(VS.80).aspx
www.albahari.com/threading/
www.yoda.arachsys.co...arp/threadstart.html


Mein Problem ist, dass ich Programmierfehler in meinem kleinen Programm suche, die dazu führen, dass die Performance - ganz allgemein gesagt - sobald ich mit delegates arbeite (speziell wenn ich nur Codeblöcke als delegate innerhalb von Schleifen threaded ausführe(per thread oder threadpool oder mittels parallel extensions), massiv (Faktor 10) in den Keller geht. (mehr dazu besser in einem extra Thread, da es ein anderes Thema ist).


Zuletzt bearbeitet von funcry am Do 05.02.09 20:24, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.02.09 09:50 
user profile iconfuncry hat folgendes geschrieben Zum zitierten Posting springen:
Hier ist mir aufgefallen, dass in den Beispielen oft static genutzt wird:
Ein Grund dafür ist oft sehr einfach:
Wenn in einem Beispiel nur kurz etwas gezeigt werden soll, dann wird dafür oft die main Methode z.B. benutzt. Diese ist nun einmal static, und wenn ich jetzt etwas demonstrieren wollte und dafür eine nicht statische Methode verwenden wollte, dann müsste ich erst eine Instanz dieser Klasse erzeugen. Und dann könnte ich die Methode dieser Instanz aufrufen. Das würde die Beispiele aber aufblähen und damit unübersichtlicher machen.

Grundsätzlich kommt es immer auf die Anforderungen an, mehr dazu wurde ja bereits gesagt.