none
C# Features RRS feed

  • Frage

  •  

    Hallo,

     

    kann mir bitte jemand diese Schreibweise erklären.

    Wann macht das Sinn, wann verwendet man das?

     

     internal void Analyse<Input>(int x, Input input)
                where Input : IInputBaseAnalyse
            {

     Habe das gegoogelt und will wissen, on ich das brauchen kann.

     Ist das ein neues C# Feature?

     where kenne ich nicht, nur von LinQ, SQL.

     

     Viele Grüße Sandra

        
    Mittwoch, 17. Mai 2017 16:59

Antworten

  • Hallo Sandra,

    dabei handelt es sich um Einschränkungen für die Typ-Parameter, was in jedem brauchbaren C# Lehrbuch, das .NET 2.0 und später behandelt zu finden sein sollte. Oben wird es für eine Methode angewendet, das gilt aber auch für Klassenebene uam.

    Für oben wird damit bestimmt, dass das Typ-Argument Input die Schnittstelle IInputBaseAnalyse implementieren muss. Somit kann die Methode Analyse die von der Schnittstelle implementierten Eigenschaften und Methoden verwenden. Übergibt man etwas, was diese Bedingung nicht erfüllt, löst bereits der Compiler einen Fehler aus.

    Siehe auch: Einschränkungen für Typparameter (C#-Programmierhandbuch).

    Gruß Elmar

    Mittwoch, 17. Mai 2017 18:22
    Beantworter
  • Hi Sandra,
    stell Dir vor, dass Deine Klasse CTest eine Methode hat, die ein neues Objekt vom Typ K erzeugen muss und dies mit einem einfachen new machen soll. Um die Typsicherheit zu gewährleisten, muss die den formalen Parameter K ersetzende reale Klasse einen parameterlosen Konstruktur haben.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks


    Montag, 22. Mai 2017 18:32
  • Hallo Sandra,

    Die new Einschränkung benötigst Du immer dann, wenn Du im Code eine Instanz des generischen Typs mittels new erzeugen willst:

           public T GetNewInstance<T>() where  T : new()
           {
                return new T();
           }
    

    Fehlt oben die new() Einschränkung ist new T() nicht erlaubt, da der Compiler nicht wissen kann, ob es einen parameterlosen öffentlichen Konstruktor gibt. Der Compiler wird zudem für T jeden Typ abweisen, der über keinen solchen Konstruktor verfügt. (Beachte, dass C# im Standard für Typen einen öffentlichen Konstruktor erstellt, wenn kein anderer Konstruktor existiert.)

    Gruß Elmar

    • Als Antwort markiert Sandra Bauer Dienstag, 23. Mai 2017 16:46
    Montag, 22. Mai 2017 18:53
    Beantworter

Alle Antworten

  • Hallo Sandra,

    dabei handelt es sich um Einschränkungen für die Typ-Parameter, was in jedem brauchbaren C# Lehrbuch, das .NET 2.0 und später behandelt zu finden sein sollte. Oben wird es für eine Methode angewendet, das gilt aber auch für Klassenebene uam.

    Für oben wird damit bestimmt, dass das Typ-Argument Input die Schnittstelle IInputBaseAnalyse implementieren muss. Somit kann die Methode Analyse die von der Schnittstelle implementierten Eigenschaften und Methoden verwenden. Übergibt man etwas, was diese Bedingung nicht erfüllt, löst bereits der Compiler einen Fehler aus.

    Siehe auch: Einschränkungen für Typparameter (C#-Programmierhandbuch).

    Gruß Elmar

    Mittwoch, 17. Mai 2017 18:22
    Beantworter
  • Siehe auch: Einschränkungen für Typparameter (C#-Programmierhandbuch).


    Hallo Elmar,

    hallo Dimitar,

    ja Frage beantwortet. Wenn möglich bitte um die Erklärung des new. Evtl. um ein Praxisbeispiel.

    public class CTest<K> where K: new() {}
    
    new()// kennst Ihr hierzu eine Praxisbeispiel, wo das Sinn machen könnte.
    Viele Grüße Sandra
    Montag, 22. Mai 2017 16:55
  • Hi Sandra,
    stell Dir vor, dass Deine Klasse CTest eine Methode hat, die ein neues Objekt vom Typ K erzeugen muss und dies mit einem einfachen new machen soll. Um die Typsicherheit zu gewährleisten, muss die den formalen Parameter K ersetzende reale Klasse einen parameterlosen Konstruktur haben.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks


    Montag, 22. Mai 2017 18:32
  • Hallo Sandra,

    Die new Einschränkung benötigst Du immer dann, wenn Du im Code eine Instanz des generischen Typs mittels new erzeugen willst:

           public T GetNewInstance<T>() where  T : new()
           {
                return new T();
           }
    

    Fehlt oben die new() Einschränkung ist new T() nicht erlaubt, da der Compiler nicht wissen kann, ob es einen parameterlosen öffentlichen Konstruktor gibt. Der Compiler wird zudem für T jeden Typ abweisen, der über keinen solchen Konstruktor verfügt. (Beachte, dass C# im Standard für Typen einen öffentlichen Konstruktor erstellt, wenn kein anderer Konstruktor existiert.)

    Gruß Elmar

    • Als Antwort markiert Sandra Bauer Dienstag, 23. Mai 2017 16:46
    Montag, 22. Mai 2017 18:53
    Beantworter