Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.07.2015, 18:48

[C#] Auf "normale" Klassen IEnumerable? VS Reflection?

Hey,

mir ist neulich ein "interessanter" Gedanke eingefallen und zwar, wieso implementieren nicht alle Klassen "IEnumerable". Logisch und Semantisch wäre es eigentlich korrekt, denn ein Objekt einer Klasse ist quasi eine Datenstruktur für ihre eigenen Properties.


C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Auto : IEnumerable
    {
        public int Velocity { get; set; }
        public string Number { get; set; }
        public string Color { get; set; }
        public DateTime Bought { get; set; }
        public TimeSpan Age { get; set; }        
        public int Price { get; set; }
        public int KilometerState { get; set; }


        public IEnumerator GetEnumerator()
        {
            yield return Velocity;
            yield return Number;
            yield return Color;
            yield return Bought;
            yield return Age;
            yield return Price;
            yield return KilometerState;
        }
    }


und dann:

C#-Quelltext

1
2
3
4
foreach (var propertyin objekt)
                {
                    Console.WriteLine(property);
                }


PS: bitte nicht jetzt auf kleineigkeiten rumhacken! warum struct, warum der Datentyp für das usw..^^

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »JungleProgger« (30.07.2015, 19:06)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

30.07.2015, 19:15

Ich frage mich was es bringen soll. Der Enumerator ist ungetypt, man müsste also erstmal wieder den Typ holen und entsprechend casten. Da bist du wieder so ziemlich bei Reflection.

3

30.07.2015, 19:22

ja stimmt, habe ich irgend wie nicht auf dem Schirm gehabt... :S

^^

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

4

30.07.2015, 20:20

Logisch und Semantisch wäre es eigentlich korrekt, denn ein Objekt einer Klasse ist quasi eine Datenstruktur für ihre eigenen Properties.


Das trifft dann aber nicht auf IEnumerable zu:

Zitat von »https://msdn.microsoft.com/en-us/library/9eekhta0(v=vs.110).aspx«

Exposes the enumerator, which supports a simple iteration over a collection of a specified type.


Dein kleines Beispiel hat alleine schon 4 verschiedene Typen.

5

30.07.2015, 21:49

Ja, ich habe es eingesehen^^ danke aber noch :)

6

30.07.2015, 22:10

Ich sehe es erst jetzt.. das was du meinst ist ja generic

Meins ist ja nur eben non-generic Iteration!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

30.07.2015, 22:23

Und dennoch ist der ohne Typ-Information völlig nutzlos und äquivalent zu einem IEnumerable<object>.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

8

30.07.2015, 22:29

Und wann soll sowas von Nutzen sein? Dein Beispiel ist stupides Printen, mir fiele noch (de-)serialisieren von Objekten ein. Aber für Beides gibt es eh' schon spezielle Funktionen à la ToString. Dieses Mehr an scheinbar logischen Konstrukten macht die Sprache eigentlich nur für wenig nutzen unnötig komplexer und komplizierter, und am Ende landest du bei Smalltalk, das kaum einer nutzt, weil es trotz seiner ach so puristischen OOP schlichtweg unhandlich ist.

Und ein finaler Sargnagel für diese Überlegungen:
Wenn du über eine List<T> iterierst... arbeitet die Schleife dann die Elemente dieser Liste ab, die Member-Pointer der Liste, oder Beides?

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

Werbeanzeige