Laden...

[gelöst] Warum sind die Klassen im Framework nicht partial?

Erstellt von markus111 vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.222 Views
markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren
[gelöst] Warum sind die Klassen im Framework nicht partial?

Hallo,

warum sind die Klassen im .NET Framework eigentlich nicht partial? So kann man sie nicht 'erweitern'. Gibt es da einen Grund?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
5.942 Beiträge seit 2005
vor 15 Jahren

Hallo markus11

Ich nehme an um die Konsistenz zu bewahren.
Oder weil es überhaupt nicht gewollt ist: sealed Schlüsselwort.

Was kannst du denn nicht mit Extensionmethods abbilden?
Oder mit eigenem Code, also was hast du genau vor?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

4.207 Beiträge seit 2003
vor 15 Jahren

Eigene Erweiterungen könnten in Konflikt stehen mit Erweiterungen seitens MS in zukünftigen Versionen von .NET.

Wenn Du sie erweitern willst, gibt's dafür außerdem Vererbung / Aggregation.

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

Das ich z.B. in der Math Klasse einige Methoden hinzufügen kann.
Die ist sealed.

@ Golo Roden: Stimmt.

[Follow me on Twitter](http://twitter.com/blendingsky)
3.971 Beiträge seit 2006
vor 15 Jahren

Partial ist ein Schlüsselwort für den C#-Compiler, nicht aber der Runtime. MS und du müssten immer den kompletten Quellcode mit ausliefern, was ansich schwachsinn ist.

"Erweiterbarkeit" erreichst du über Vererbung. bei selead-Klassen ist Erweiterbarkeit mittels Extension-Methods möglich.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

Partial ist ein Schlüsselwort für den C#-Compiler, nicht aber der Runtime.

Aha!

"Erweiterbarkeit" erreichst du über Vererbung. bei selead-Klassen ist Erweiterbarkeit mittels Extension-Methods möglich.

Ok, funktioniert. Nur wie mach ich das, wenn ich etwas statisch erweitern möchte, wie die Math-Klasse?

Also das ich z.B. eine Lerp-Methode hinzufüge?

[Follow me on Twitter](http://twitter.com/blendingsky)
3.971 Beiträge seit 2006
vor 15 Jahren

Probier mal ob es funktioniert, wenn du selbst eine Klasse Math erstellst und du statische Member hinzufügst, die es noch nicht in System.Math gibt. Der Compiler sollte in der Lage sein ohne NameSpace-Angabe die richtige Klasse zu finden.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

3.003 Beiträge seit 2006
vor 15 Jahren

Also das ich z.B. eine Lerp-Methode hinzufüge?

Das wäre dann eine Methode, die nicht zu Math gehört, sondern eher zu Klassen, die Datenwolken / Punktwolken repräsentieren.

Gruß,

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

War ja nur ein Beispiel. Im XNA Framework ist es in der MathHelper Klasse.

[Follow me on Twitter](http://twitter.com/blendingsky)
5.942 Beiträge seit 2005
vor 15 Jahren

Hallo markus111

Ok, funktioniert. Nur wie mach ich das, wenn ich etwas statisch erweitern möchte, wie die Math-Klasse?

Also das ich z.B. eine Lerp-Methode hinzufüge?

Indem du eine eigene Bibliothek für sowas erstellst.

@kleines_eichhörnchen
Das geht nicht, der Benutzer muss schlussendlich durch eine Vollqualifikation entscheiden.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

3.003 Beiträge seit 2006
vor 15 Jahren

Ja, ich wollte damit eher verdeutlichen, dass - immer meiner Meinung nach 😉 - solche Methoden, sobald sie etwas komplexer werden, nicht als statischen Methoden irgendeiner Hilfsklasse, wie Math es ist, taugen. Ist alles Speicher, der während der Ausführung permanent belegt ist.

Gruß,

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

S
248 Beiträge seit 2008
vor 15 Jahren

Ist alles Speicher, der während der Ausführung permanent belegt ist.

Auf was genau beziehst du diese Aussage?

3.003 Beiträge seit 2006
vor 15 Jahren

Speicherverwaltung von Klassen mit statischen Methoden. Ist immer besser (soweit der gc das zulaesst) die Kontrolle über die Lebenszeit eines Objekts samt seiner Methoden zu haben. Meiner Meinung nach.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

4.207 Beiträge seit 2003
vor 15 Jahren

Also, ich müsste es auch erst noch mal nachgucken, aber wenn ich 20.000 Objekte von Typ Foo instanziiere, habe ich doch nicht 20.000 Kopien der Methode Bar im Speicher?

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

3.003 Beiträge seit 2006
vor 15 Jahren

Wäre schlimm 😉.

Ich rede von statischen Methoden. Wann wird der Speicher reserviert? Wann wird er freigegeben? Weisst du's? Ich hab' nur eine vage Vermutung.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

4.207 Beiträge seit 2003
vor 15 Jahren

Nein, weiß ich nicht.

Nur würde ich mal behaupten, dass es keinen Unterschied macht, ob eine Methode statisch ist oder nicht, sobald ich mindestens eine Instanz erstellt habe.

(Ja ich weiß, dass es hier um Methoden geht, für die man nicht zwingend eine Instanz braucht 😉)

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

S
248 Beiträge seit 2008
vor 15 Jahren

Nur würde ich mal behaupten, dass es keinen Unterschied macht, ob eine Methode statisch ist oder nicht, sobald ich mindestens eine Instanz erstellt habe.

Das ist auch der Fall, daher meine Verwunderung.

3.003 Beiträge seit 2006
vor 15 Jahren

Glaub wir reden immer noch aneinander vorbei 😄.

Keine Diskussion, solang das Ding im Speicher liegt, dürfte sich das recht wenig nehmen. Um die Methode ausführen zu können, brauch ich nunmal Speicher, in den die Methode geschrieben wird. Logo. Nur halte ich es für eine feine Sache, wenn ich nach Benutzung der Methode aufräumen und den Speicher anderweitig benutzen kann. Bzw. wenn ich wenigstens weiß, wann ungefähr es soweit ist. Bei statischen Methoden hab ich ehrlich gesagt keinen Schimmer, ob und wann die wieder weggeräumt werden.

LaTino
EDIT: und wir reden ja von Klassen mit vielen komplexen Methoden. Würd ich nie im Leben statisch machen.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

4.207 Beiträge seit 2003
vor 15 Jahren

Wir müssen unterscheiden zwischen der MSIL-Repräsentation der Methode, und der kompilierten Variante.

Prinzipiell gilt:

Die MSIL-Variante wird bei statischen und Instanzmethoden in jedem Fall im Speicher gehalten, allein dadurch, dass die Assembly von der Platte gelesen wird. Hier nehmen sich beide nichts.

Beim ersten Zugriff (erste Ausführung) wird die jeweilige Methode kompiliert und der Maschinencode im Speicher abgelegt. Dieser wird gegebenenfalls wieder weggeworfen, wenn zB Speicher knapp wird. Da macht es auch keinen Unterschied, ob's eine statische oder eine Instanzmethode ist.

Instanzmethoden liegen nur einmal im Speicher, egal, wie viele Instanzen es gibt (aber erst, wenn sie aufgerufen wurden). Statische Methoden liegen ebenfalls nur einmal im Speicher, egal, ob und wie viele Instanzen es gibt (ebenfalls erst, wenn sie aufgerufen werden).

Fazit: Statische Methoden verbrauchen nicht mehr und nicht weniger Speicher als Instanzmethoden.

Ausnahme 😉: Virtuelle Instanzmethoden verbrauchen mehr Speicher als statische Methoden, da in jeder Ableitung der ursprünglichen Klasse ein Eintrag in der VTable notwendig ist. Aber selbst das sind nur ein paar Bytes.

All das zusammengenommen ergibt sich für mich im Moment (mag sein, dass ich noch was übersehen habe), dass es aus Performance- oder Speichergründen keinen Grund gibt, eine Instanzmethode einer statischen Methode vorzuziehen.

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

3.003 Beiträge seit 2006
vor 15 Jahren

Die Dauer, die sie im Speicher bleibt. DAS ist mein Problem. Nicht die Menge an Speicher. Sondern die Kontrolle darüber, wann er reserviert wird, und wann er freigegeben wird.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

4.207 Beiträge seit 2003
vor 15 Jahren

Okay, kapiert ^^

Ist IMHO aber kein Unterschied:

Die MSIL-Repräsentation bleibt in beiden Fällen über die gesamte Lebenszeit der AppDomain im Speicher, die kompilierte Version nach Bedarf.

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

3.971 Beiträge seit 2006
vor 15 Jahren

Die Dauer, die sie im Speicher bleibt. DAS ist mein Problem.

Eigene AppDomain erstellen und nach der Ausführung der Funktion wieder entladen.

Allerdings sehe ich keinen Grund, warum der Zeiger auf eine Funktion freigegeben werden soll. Es müsste ständig von der Platte gelesen werden, der JIT-Compiler wäre am rödeln ohne Ende und Knappheit des Arbeitsspeicher sehe ich auch nicht als Problem

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

3.003 Beiträge seit 2006
vor 15 Jahren

Knappheit des Arbeitsspeicher sehe ich auch nicht als Problem

Wenn man aus 'ner Ecke kommt, wo man in max. 2k Arbeitsspeicher programmieren musste, wird man der automatischen Speicherverwaltung von .NET und Konsorten immer etwas zweifelnd gegenüberstehen. Ist vielleicht nur 'ne Macke von mir.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo LaTino,

Ist vielleicht nur 'ne Macke von mir.

lach, ja, das ist es wohl. Und ich denke dabei sollten wir es belassen., Ich habe diese offtopic-Diskussion mal ausgegraut. Die Entscheidung, ob etwas statisch sein sollte oder nicht sollte man vom Modell abhängig machen, nicht von einer derart fragwürdigen Optimierung. Premature optimization is the root of all evil. 😃

herbivore