Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 3341|Απάντηση: 0

[Πηγή] .NET/C# νέος τύπος καρτέλας δυνατότητας

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 2/10/2023 9:25:51 π.μ. | | | |
Ξεκινώντας από το C# 9, μπορείτε να χρησιμοποιήσετε τον τροποποιητή εγγραφής για να ορίσετε έναν τύπο αναφοράς που παρέχει ενσωματωμένη λειτουργικότητα για την ενθυλάκωση δεδομένων. Η C# 10 επιτρέπει στη σύνταξη της κλάσης εγγραφών ως συνώνυμο να αποσαφηνίζει τους τύπους αναφοράς και επιτρέπει στη δομή εγγραφών να ορίζει τύπους τιμών χρησιμοποιώντας την ίδια λειτουργικότητα.

Περιπτώσεις χρήσης για εγγραφή σε C#(Το ChatGPT απαντά):

Ο τύπος εγγραφής στη C# είναι μια νέα δυνατότητα που εισήχθη στην πιο πρόσφατη έκδοση. Μπορεί να χρησιμοποιηθεί σε πολλά σενάρια, συμπεριλαμβανομένων, ενδεικτικά, των εξής:

Αμετάβλητο αντικείμενο δεδομένων: Ο τύπος εγγραφής είναι αμετάβλητος, που σημαίνει ότι μόλις δημιουργηθεί, η τιμή ιδιότητάς του δεν μπορεί να τροποποιηθεί. Αυτό τα καθιστά ιδανικά για την αναπαράσταση αμετάβλητων δομών δεδομένων, όπως αντικείμενα μεταφοράς (DTOs) ή ρυθμίσεις διαμόρφωσης.
Αντικείμενα τιμών: Ο τύπος καρτέλας μπορεί να χρησιμοποιηθεί για την αναπαράσταση αντικειμένων τιμών των οποίων η ισότητα καθορίζεται με βάση τις τιμές των χαρακτηριστικών τους και όχι την ισοδυναμία αναφοράς. Αυτό τα καθιστά ιδανικά για τη σύγκριση και την αποθήκευση αντικειμένων αξίας, όπως εύρη ημερομηνιών, σημεία συντεταγμένων και άλλα.
Αντιστοίχιση προτύπων: Ο τύπος εγγραφής μπορεί να χρησιμοποιηθεί σε συνδυασμό με την αντιστοίχιση προτύπων, γεγονός που τον καθιστά πιο βολικό όταν εργάζεστε με πολύπλοκες δομές δεδομένων. Μπορείτε να χρησιμοποιήσετε την αντιστοίχιση μοτίβων για να ελέγξετε και να εξαγάγετε τις τιμές χαρακτηριστικών του αντικειμένου εγγραφής, ώστε να μπορείτε να εκτελέσετε την κατάλληλη ενέργεια.
Αμετάβλητες συλλογές: Ο τύπος εγγραφής μπορεί να χρησιμοποιηθεί με αμετάβλητους τύπους συλλογής όπως ImmutableList, ImmutableDictionary κ.λπ., για τη δημιουργία αμετάβλητων αντικειμένων συλλογής. Αυτό διασφαλίζει ότι το περιεχόμενο της συλλογής δεν τροποποιείται, βελτιώνοντας έτσι την αξιοπιστία και την ασφάλεια του κώδικα.
Αυτές είναι μερικές μόνο από τις περιπτώσεις χρήσης για τον τύπο εγγραφής και μπορείτε να αποφασίσετε εάν θα χρησιμοποιήσετε τον τύπο εγγραφής με βάση τις συγκεκριμένες ανάγκες και τη δομή του κώδικα.
Διαφορά μεταξύ εγγραφής και κλάσης και δομής

Η σύνταξη που χρησιμοποιείται κατά τη δήλωση και τη δημιουργία μιας κλάσης ή δομής είναι η ίδια όπως κατά την εγγραφή μιας λειτουργίας. Απλώς αντικαταστήστε τη λέξη-κλειδί κλάσης με εγγραφή ή χρησιμοποιήστε τη δομή εγγραφής αντί για τη δομή. Ομοίως, η κλάση record υποστηρίζει την ίδια σύνταξη για σχέσεις κληρονομικότητας. Η διαφορά μεταξύ ενός δίσκου και μιας κλάσης είναι η εξής:

  • Μπορείτε να χρησιμοποιήσετε παραμέτρους θέσης στον κύριο κατασκευαστή για να δημιουργήσετε και να δημιουργήσετε τύπους με αμετάβλητες ιδιότητες.
  • Οι μέθοδοι και οι τελεστές που υποδεικνύουν ισότητα αναφοράς ή μη ισότητα σε (π.χ. Object.Equals(Object) και ==) υποδεικνύουν ισότητα τιμών ή μη ισότητα στην εγγραφή.
  • Μπορείτε να χρησιμοποιήσετε την έκφραση with για να δημιουργήσετε ένα αντίγραφο ενός αμετάβλητου αντικειμένου με μια νέα τιμή στο επιλεγμένο χαρακτηριστικό.
  • Η μέθοδος ToString της εγγραφής δημιουργεί μια συμβολοσειρά μορφής που εμφανίζει το όνομα τύπου του αντικειμένου και τα ονόματα και τις τιμές όλων των κοινών ιδιοτήτων του.
  • Μια εγγραφή μπορεί να μεταβιβαστεί από μια άλλη εγγραφή. Αλλά οι εγγραφές δεν μπορούν να κληρονομηθούν από, ούτε μπορούν να κληρονομηθούν από εγγραφές.
  • Η διαφορά μεταξύ της δομής εγγραφής και της δομής είναι ότι ο μεταγλωττιστής συνθέτει μεθόδους για τον προσδιορισμό της ισότητας και του ToString. Ο μεταγλωττιστής συνθέτει τη μέθοδο Deconstruct για τη δομή εγγραφής θέσης.


Ο μεταγλωττιστής συνθέτει μια κοινή ιδιότητα μόνο αρχικοποίησης για κάθε κύρια παράμετρο κατασκευαστή στην κλάση record. Σε μια δομή εγγραφής, ο μεταγλωττιστής συνθέτει δημόσιες ιδιότητες ανάγνωσης/εγγραφής. Ο μεταγλωττιστής δεν δημιουργεί ιδιότητες για τα κύρια ορίσματα κατασκευαστή σε τύπους κλάσης και δομής που δεν περιέχουν τον τροποποιητή εγγραφής.

καταγράφω

Τύπος αναφοράς κλάσης εγγραφής (προεπιλογή: η κλάση μπορεί να παραλειφθεί)
τύπος τιμής δομής εγγραφής

Εγγραφή γραμματικής ζάχαρης

είναι στην πραγματικότητα ότιΣύνταξη ζάχαρη, και το τελικό αποτέλεσμα είναι κλάση ή κώδικας δομής。 Πάρτε για παράδειγμα τον ακόλουθο κώδικα:

Τέλος, μεταγλωττίζεται στον ακόλουθο κώδικα:

χρησιμοποιώντας το Σύστημα.
χρησιμοποιώντας το System.Collections.Generic.
χρησιμοποιώντας το System.Diagnostics.
χρησιμοποιώντας το System.Reflection.
χρησιμοποιώντας το System.Runtime.CompilerServices.
χρησιμοποιώντας το System.Security.
χρησιμοποιώντας το System.Security.Permissions.
χρησιμοποιώντας το System.Text.
χρησιμοποιώντας το Microsoft.CodeAnalysis.

[συναρμολόγηση: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.DisableOptimizations)]
[συναρμολόγηση: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[συναρμολόγηση: AssemblyVersion ("0.0.0.0")]
[module: Μη επαληθεύσιμος κώδικας]
[λειτουργική μονάδα: System.Runtime.CompilerServices.RefSafetyRules(11)]

[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
δημόσια τάξη PersonInfo : IEquatable<PersonInfo>
{
    [Μεταγλωττιστής]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    ιδιωτική συμβολοσειρά μόνο <FirstName>για ανάγνωση k__BackingField.

    [Μεταγλωττιστής]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    ιδιωτική συμβολοσειρά μόνο για ανάγνωση <LastName>k__BackingField.

    [Μεταγλωττιστής]
    προστατευμένο εικονικό Συμβόλαιο Ισότητας Τύπου
    {
        [Μεταγλωττιστής]
        αποκτώ
        {
            τύπος επιστροφής(PersonInfo);
        }
    }

    Όνομα δημόσιας συμβολοσειράς
    {
        [Μεταγλωττιστής]
        αποκτώ
        {
            <FirstName>επιστροφή k__BackingField?
        }
        [Μεταγλωττιστής]
        init
        {
            <FirstName>k__BackingField = τιμή;
        }
    }

    δημόσια συμβολοσειρά LastName
    {
        [Μεταγλωττιστής]
        αποκτώ
        {
            <LastName>επιστροφή k__BackingField?
        }
        [Μεταγλωττιστής]
        init
        {
            <LastName>k__BackingField = τιμή;
        }
    }

    public PersonInfo(συμβολοσειρά FirstName, συμβολοσειρά LastName)
    {
        <FirstName>k__BackingField = Όνομα;
        <LastName>k__BackingField = Επώνυμο;
        βάση.. ctor();
    }

    [Μεταγλωττιστής]
    δημόσια συμβολοσειρά παράκαμψης ToString()
    {
        StringBuilder stringBuilder = νέο StringBuilder();
        stringBuilder.Append("PersonInfo");
        stringBuilder.Append(" { ");
        if (PrintMembers(stringBuilder))
        {
            stringBuilder.Append(' ');
        }
        stringBuilder.Append('}');
        επιστροφή stringBuilder.ToString();
    }

    [Μεταγλωττιστής]
    προστατευμένο εικονικό bool PrintMembers(StringBuilder builder)
    {
        RuntimeHelpers.EnsureSufficientExecutionStack();
        οικοδόμος. Append("Όνομα= ");
        οικοδόμος. Append((αντικείμενο)Όνομα);
        οικοδόμος. Append(", Επώνυμο = ");
        οικοδόμος. Append((object)LastName);
        επιστροφή αληθής?
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [Μεταγλωττιστής]
    δημόσιος στατικός τελεστής bool !=(PersonInfo αριστερά, PersonInfo δεξιά)
    {
        επιστροφή! (αριστερά == δεξιά);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [Μεταγλωττιστής]
    δημόσιος στατικός τελεστής bool ==(PersonInfo αριστερά, PersonInfo δεξιά)
    {
        return (αντικείμενο)αριστερά == δεξιά || ((αντικείμενο)αριστερά != null && αριστερά. Equals(δεξιά));
    }

    [Μεταγλωττιστής]
    δημόσια παράκαμψη int GetHashCode()
    {
        επιστροφή (EqualityComparer<Type>. Default.GetHashCode(EqualityContract) * -1521134295 + EqualityComparer<string>. Default.GetHashCode(<FirstName>k__BackingField)) * -1521134295 + EqualityComparer<string>. Default.GetHashCode(<LastName>k__BackingField);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [Μεταγλωττιστής]
    δημόσια παράκαμψη bool Equals(αντικείμενο obj)
    {
        return Equals(obj ως PersonInfo);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [Μεταγλωττιστής]
    δημόσιο εικονικό bool Equals(PersonInfo άλλο)
    {
        return (αντικείμενο)this == άλλο || ((αντικείμενο)άλλο != null && EqualityContract == άλλο. EqualityContract && EqualityComparer<string>. Προεπιλογή.Ισούται με (<FirstName>k__BackingField, άλλο.<FirstName>k__BackingField) && EqualityComparer<string>. Προεπιλογή.Ισούται με (<LastName>k__BackingField, άλλο.<LastName>k__BackingField))·
    }

    [Μεταγλωττιστής]
    δημόσιο εικονικό PersonInfo <Clone>$()
    {
        επιστροφή νέου PersonInfo(this);
    }

    [Μεταγλωττιστής]
    προστατευμένο PersonInfo (πρωτότυπο PersonInfo)
    {
        <FirstName>k__BackingField = πρωτότυπο. <FirstName>k__BackingField;
        <LastName>k__BackingField = πρωτότυπο. <LastName>k__BackingField;
    }

    [Μεταγλωττιστής]
    public void Deconstruct(out string FirstName, out string LastName)
    {
        FirstName = αυτό. Όνομα;
        Επώνυμο = αυτό. Επώνυμο;
    }
}

χώρος ονομάτων Microsoft.CodeAnalysis
{
    [Μεταγλωττιστής]
    [Ενσωματωμένο]
    εσωτερική σφραγισμένη κλάση EmbeddedAttribute : Χαρακτηριστικό
    {
    }
}

χώρος ονομάτων System.Runtime.CompilerServices
{
    [Μεταγλωττιστής]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | ΧαρακτηριστικόTargets.Field | ΧαρακτηριστικόTargets.Event | ΧαρακτηριστικόTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
    εσωτερική σφραγισμένη κλάση NullableAttribute : Χαρακτηριστικό
    {
        δημόσιο byte μόνο για ανάγνωση[] NullableFlags;

        public NullableAttribute(byte P_0)
        {
            byte[] πίνακας = νέο byte[1];
            πίνακας[0] = P_0;
            NullableFlags = πίνακας;
        }

        public NullableAttribute(byte[] P_0)
        {
            NullableFlags = P_0;
        }
    }

    [Μεταγλωττιστής]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | ΧαρακτηριστικόTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
    εσωτερική σφραγισμένη κλάση NullableContextAttribute : Χαρακτηριστικό
    {
        δημόσια σημαία byte μόνο για ανάγνωση.

        public NullableContextAttribute(byte P_0)
        {
            Σημαία = P_0;
        }
    }

    [Μεταγλωττιστής]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
    εσωτερική σφραγισμένη κλάση RefSafetyRulesAttribute : Χαρακτηριστικό
    {
        δημόσια έκδοση μόνο για ανάγνωση int;

        public RefSafetyRulesAttribute(int P_0)
        {
            Έκδοση = P_0;
        }
    }
}
Δημιουργεί αυτόματα κατασκευαστές και ξαναγράφει τις μεθόδους ToString, GetHashCode, Equals και δημιουργεί αυτόματα ορισμένες μεθόδους.


Τα p1 και p2 είναι στην πραγματικότητα δύο διαφορετικά αντικείμενα, αλλά επειδή ο μεταγλωττιστής δημιούργησε αυτόματα τον συγκριτή (IEquatable) και ξαναέγραψε τις μεθόδους Equals και GetHashCode, η έξοδος ήταν αληθής. Η κλήση της μεθόδου ToString είναι επίσης πολύ διαισθητική για την έξοδο της καταγεγραμμένης τιμής. Οπως φαίνεται παρακάτω:

Το .NET/C# υλοποιεί τον προσαρμοσμένο συγκριτή IEqualityComparer
https://www.itsvse.com/thread-10643-1-1.html



καταγράφω

απαιτούμενο:required modifier υποδεικνύει ότι το πεδίο ή το χαρακτηριστικό που εφαρμόζει πρέπει να αρχικοποιηθεί από όλους τους κατασκευαστές ή χρησιμοποιώντας τον αρχικοποιητή αντικειμένων. Κάθε έκφραση που χρησιμοποιείται για την προετοιμασία μιας νέας παρουσίας αυτού του τύπου πρέπει να προετοιμάζει όλα τα απαιτούμενα μέλη.
Αναφορά:Η σύνδεση με υπερσύνδεσμο είναι ορατή.

init: Στη C# 9 και νεότερες εκδόσεις, η λέξη-κλειδί init ορίζει τη μέθοδο πρόσβασης σε μια ιδιότητα ή ένα ευρετήριο. Η βιβλιοθήκη init-only εκχωρεί τιμές μόνο σε χαρακτηριστικά ή στοιχεία ευρετηρίου κατά την κατασκευή αντικειμένων. Αυτό επιβάλλει την αμετάβλητη, οπότε μόλις αρχικοποιηθεί ένα αντικείμενο, δεν μπορεί πλέον να αλλάξει.
Αναφορά:Η σύνδεση με υπερσύνδεσμο είναι ορατή.

με: Εάν πρέπει να αναπαραγάγετε μια παρουσία με ορισμένες τροποποιήσεις, μπορείτε να χρησιμοποιήσετε την παράσταση with για να εφαρμόσετε μη καταστροφικές αλλαγές. με παράσταση για να δημιουργήσετε μια νέα παρουσία καρτέλας που είναι αντίγραφο μιας υπάρχουσας παρουσίας καρτέλας, τροποποιώντας τις καθορισμένες ιδιότητες και πεδία.
Αναφορά:Η σύνδεση με υπερσύνδεσμο είναι ορατή.

Έτσι, η εγγραφή μπορεί να οριστεί ως εξής:

απαιτείται, για να μην αναφέρω, με τη σύνταξη της ζάχαρης, θαΚαλέστε τη μέθοδο $ που δημιουργείται αυτόματα <Clone>και, στη συνέχεια, τροποποιήστε την τιμή του χαρακτηριστικού. Ως εξής:



Κώδικας:



Χαρακτηριστικό εγγραφής

Μερικές φορές χρειάζεται να προσθέσουμε ορισμένες δυνατότητες στα χαρακτηριστικά, όπως δυνατότητες σειριοποίησης JSON, πληροφορίες περιγραφής κ.λπ.



Πόροι:

Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή.





Προηγούμενος:Το ASP.NET Core (24) βασίζεται στην επικοινωνία υψηλής απόδοσης Refit, MemoryPack
Επόμενος:Το GitHub χρησιμοποιεί το REST API για την προβολή μεγεθών αποθετηρίου
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com