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

13.03.2016, 11:03

C# struct to object casting vs using dynamic

hallo Leute,

ich möchte ganz gerne mal wissen, ist es aufwendiger einen Wertetyp nach Objekt zu casten oder (aufgrund von Polymorphie, auf Generics zu verzichten) dynamic zu verwenden.

also statt sowas:

C#-Quelltext

1
2
3
4
5
6
7
8
        void Add(TValue value, TKey key, Criterion criterion);

        void DeleteBy(TKey key);
        void DeleteBy(TKey key, Criterion criterion);
        void OrderBy(Criterion order);

        bool FoundBy(TKey key);
        bool FoundBy(TKey key, Criterion criterion);


doch sowas?

C#-Quelltext

1
2
3
4
5
6
7
8
        void Add(dynamic value, dynamic key, Criterion criterion);

        void DeleteBy(dynamic key);
        void DeleteBy(dynamic key, Criterion criterion);
        void OrderBy(Criterion order);

        bool FoundBy(dynamic key);
        bool FoundBy(dynamic key, Criterion criterion);


Weil dann kann man sich das zweite Interface doch sparen, wo das gleiche wie bei dem generischen Interface steht, nur statt TValue and TKey, dynamic drin ist.

Und auch ob dann nicht gecastet werden muss?

Wäre euch wie immer sehr dankbar!

Mfg

JP

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »JungleProgger« (13.03.2016, 11:12)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

13.03.2016, 11:11

Hier würde mich dann wirklich interessieren was deine Beweggründe für solche Konstruktionen sind.

Allgemein ist meiner Meinung nach dynamic eines der hässlichsten Keywords in C#.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

3

13.03.2016, 11:14

Seite nochmal laden, die Beweggründe habe ich nochmal editiert^^

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

13.03.2016, 12:01

Wenn du dynamic nicht unbedingt brauchst, nutze es nicht. Damit schaltest du die Typprüfung im Compiler aus und verschiebst sie damit in die Laufzeit. Damit fallen dir Fehler erst später auf und es ist deutlich langsamer.

Mir ist aber auch nicht klar warum dir die Variante mit Generics nicht reicht. Du kannst Wertetypen auch als Typparameter verwenden und brauchst nichts auf Object casten.

5

13.03.2016, 12:18

Also mir geht es konkret um folgendes:

* Verzicht auf ein weiteres Interface um Polymorphie trotz Generics zu ermöglichen

* Um [ValueCasting] zu verhindern, wenn ich das Polymorphe Interface nutze:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Interface IWork<TKey, TValue> : IWork ------> das will ich vermeiden
{
   TValue DoWork(Tkey key); // nur als Beispiel, irgend ein Quatsch Interface
   
}
Interface IWork ------> das will ich vermeiden
{
   object DoWork(object key); // nur als Beispiel, irgend ein Quatsch Interface
   
}

//Aufruf von IWork

object PolymorpheFunktion(IWork bla, object key)
{
  return bla.DoWork(); // das Ding ist, jetzt kann man für "key" ja ein struct übergeben und dann MUSS gecastet werden und das ist das was ich gerne verhindern würde wenn es geht, und ich weiß das dynamic nicht ganz ungefährlich ist, aber ich würde da aufpassen.
}



Leider geht sowas nicht:

object PolymorpheFunktion(IWork<?, ?> bla, ? key);

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

13.03.2016, 12:50


Leider geht sowas nicht:

object PolymorpheFunktion(IWork<?, ?> bla, ? key);

Ich denke das was du suchst sind generische Methoden:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// Interface
public interface IWork<TKey, TValue>
{
    TValue DoWork(TKey key);
}

// Methode in Klasse die mit beliebiger IWork Ausprägung funktioniert
TValue PolymorpheFunktion<TKey, TValue>(IWork<TKey, TValue> bla, TKey key)
{
  return bla.DoWork(key);
}

7

13.03.2016, 13:07

Ja das ist schon ehr das danke Dir!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

14.03.2016, 08:42

Allgemein ist meiner Meinung nach dynamic eines der hässlichsten Keywords in C#.


Das hat nichts mit Hässlich zu tun meiner Meinung nach. Dieses Schlüsselwort dient dem Abbilden von Late-Binding. Das wurde unter anderem für COM und ASP.NET eingeführt. Daher hat das schon seine Bewandtnis :). Allerdings würde ich es auch nur dafür nutzen.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

14.03.2016, 09:41

Late-Binding in COM kenne ich leider zur Genüge und wäre sehr froh wenn das nicht nach C# rübergeschwappt wäre. :P
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

10

14.03.2016, 09:44

Late-Binding in COM kenne ich leider zur Genüge und wäre sehr froh wenn das nicht nach C# rübergeschwappt wäre. :P


Tja, leider ist das schwer vermeidbar, besonders bei Altprojekten. Bestes Beispiel was mit da einfällt: Alte VB6 Anwendung, die voll auf COM setzt nach .NET portieren. Das ganze am besten noch Häppchenweise, weil die Anwendung zu groß ist, somit musst du VB6 mit .NET mischen. Da ist dann dynamic wohl keine schlechte Wahl.

Aber ja, es gibt schöneres keine Frage :D

Werbeanzeige