Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 20516|Antwort: 0

[Tipps] Siebenundvierzig Möglichkeiten, ein C#-Programm zu optimieren

[Link kopieren]
Veröffentlicht am 15.03.2018 10:41:59 | | |

1. Ersetze zugängliche Felder durch Attribute

1、. .NET-Datenbindung unterstützt nur Datenbindung, und man kann die Vorteile der Datenbindung durch die Nutzung von Attributen nutzen.
2. Im Zugriff auf die Eigenschaft können Sie Lock verwenden, um Multithreading-Unterstützung hinzuzufügen.

2. Lesenur (Laufzeitkonstante) und Const (Kompilierungszeitkonstante)

1. const kann nur für primitive Typen, Enums und Strings verwendet werden, während readonly beliebigen Typen sein kann;
2. const wird zur Kompilierungszeit durch eine bestimmte Konstante ersetzt, sodass, wenn sowohl const- als auch schreibgeschützte Werte in der Referenz verwendet werden, die Änderung auf schreibgeschützt die ursprüngliche Absicht des Designs verändert, nämlich die Notwendigkeit, die geänderte Baugruppe neu zu kompilieren, um den neuen konstanten Wert neu zu referenzieren.
3. Const ist effizienter als nur lesbar, verliert jedoch die Flexibilität der Anwendung.

3. IS und AS

1. Beide sind Typkonvertierungen zur Laufzeit, da Operatoren nur in Referenztypen verwendet werden können, während es Werte und Referenztypen verwenden kann;
2. Die übliche Praxis ist, IS zur Bestimmung des Typs zu verwenden und dann selektiv als oder einen starken Typumwandlungsoperator (von einem Operatoren definierte Umwandlung) zu verwenden.

4. ConditionalAttribute statt #if #endif条件编译

1. ConditionalAttribute wird nur auf Methodenebene verwendet, und andere Elemente wie Typen, Attribute usw. sind ungültig. Und #if #endif则不受此限制;
2. ConditionalAttribute kann mehrere OR-(ODER)-Operationen für Kompilierungsbedingungen hinzufügen, und #if #endif则可以添加与(AND) [hier kann vollständig als ein separates Symbol definiert werden];
3. Die Definition von ConditioanlAttribute kann in einer separaten Methode eingesetzt werden, um das Programm flexibler zu machen.

5. Stellen Sie die ToString()-Methode bereit

1. Es kann den Nutzern auf freundlichere Weise detaillierte Informationen bereitstellen;
2. Verwenden Sie die IFormatter.ToString()-Methode, um flexiblere Anpassungen zu ermöglichen, und wenn Sie die Schnittstellen IFormatProvider und ICustomFormatter hinzufügen, macht es mehr Sinn, die Nachrichtenausgabe anzupassen.

6. Der Unterschied zwischen Wert und Referenztyp

1. Wertetypen unterstützen keinen Polymorphismus, der sich für die Speicherung von von Anwendungen betriebenen Daten eignet, während Referenzen Polymorphismus unterstützen, der zur Definition des Anwendungsverhaltens geeignet ist.
2. Für Arrays, die als Werttypen definiert sind, kann die Programmleistung erheblich verbessert werden;
3. Der Werttyp weist weniger Heap-Speicherfragmentierung, Speichermüll und indirekte Zugriffszeit auf, und die Rückgabe in der Methode erfolgt in Form von Replikation, um zu vermeiden, dass die interne Struktur der Außenwelt ausgesetzt ist.
4. Werttypen werden in folgenden Szenarien verwendet: Die Verantwortlichkeiten der Typen werden hauptsächlich für die Datenspeicherung verwendet; Öffentliche Schnittstellen sind vollständig durch einige Zugriffsattribute für Datenmitglieder definiert; Es gibt niemals Unterklassen; Es gibt niemals polymorphes Verhalten.

7. Werttypen sollten so konstant und atomar wie möglich implementiert werden

1. Unseren Code leichter zu schreiben und zu pflegen;
2. Drei Strategien zur Initialisierung von Konstanten: in der Konstruktion; Pflanzenmethode; Konstruiere eine veränderliche Helferklasse (z. B. StringBuilder).

8. Sicherstellen, dass 0 einen gültigen Status verdient

1. Der Standardzustand des Werttyps sollte 0 sein;
2. Die 0 des Enum-Typs sollte nicht ungültig sein; Im FlagsAttribute soll sichergestellt werden, dass der Wert 0 gültig ist;
3. Wenn die Zeichenkette leer ist, kann eine Zeichenkette zurückgegeben werden. leere Zeichenkette für leere.

9. Mehrfache Repräsentationsverhältnisse gleichen Urteilsvermögens

1. ReferenceEquals() bestimmt, dass die Referenzen gleich sind, und es muss wahr sein, wenn beide auf dasselbe Objekt verweisen.
2. Die statische Equals()-Methode wird verwendet, um zunächst ein Referenzurteil zu treffen und dann den Werttyp zu beurteilen;
3. Für die Beurteilung des Referenztyps können Sie die Methode Equals() umschreiben, wenn Sie Wertsemantik verwenden.
4. Beim Umschreiben der Equals()-Methode sollte auch die GetHashCode()-Methode neu geschrieben werden, und gleichzeitig sollte die Operationen Operator==() bereitgestellt werden.

10. Verstehen Sie die Schwächen der GetHashCode()-Methode

1. GetHashCode() wird nur auf Hashwerte von hashbasierten ** definierten Schlüsseln angewendet, wie HashTable oder Wörterbuch;
2. GetHashCode() sollte den entsprechenden drei Regeln folgen: Zwei gleich große Objekte sollten denselben Hashcode zurückgeben; sollte eine Instanzinvariante sein; Die Hashfunktion sollte eine Zufallsverteilung über alle ganzen Zahlen erzeugen.

11. Geben Sie der Verwendung von foreach-Loop-Anweisungen Priorität

1. Foreach kann die Überprüfung der Array-Grenze der for-Schleife durch den Compiler eliminieren;
2. Die zirkuläre Variable von foreach ist nur lesbar, und es gibt eine explizite Transformation, die eine Ausnahme auslöst, wenn der Objekttyp des **-Objekts falsch ist;
3. Die **, die für die Verwendung von for each erforderlich ist, ist: die öffentliche GetEnumberator()-Methode; Die IEnumberable-Schnittstelle ist explizit implementiert. Die IEnumerator-Schnittstelle ist implementiert;
4. foreach kann die Vorteile des Ressourcenmanagements bringen, denn wenn der Compiler die IDisposable-Schnittstelle bestimmen kann, kann er das optimierte try... schließlich blockieren;

12. Die Initialisierung des Standardfeldes ist besser als die der Zuweisungsanweisung

1. Die Feldlebenszeit initialisiert standardmäßig den Werttyp auf 0 und den Referenztyp auf null.
2. Das mehrfache Initialisieren desselben Objekts verringert die Ausführungseffizienz des Codes.
3. Die Initialisierung des Feldes im Konstruktor ist förderlich für die Bearbeitung von Ausnahmen.

13. Verwenden Sie den statischen Konstruktor, um statische Mitglieder zu initialisieren

1. Der statische Konstruktør wird ausgeführt, bevor irgendeine Methode, Variable oder Attribut einer Klasse abgerufen wird;
2. Statische Felder laufen ebenfalls vor dem statischen Konstruktor, und der statische Konstruktor ist förderlich für die Bearbeitung von Ausnahmen.

14. Verwenden Sie die Konstrukteurkette (in. NET 4.0 löst dieses Problem bereits mit optionalen Parametern)

1. Verwenden Sie dies, um die Initialisierungsarbeit an einen anderen Konstruktor zu übergeben, und verwenden Sie Base, um den Konstruktor der Basisklasse aufzurufen;
2. Die Operationssequenz der Typinstanzen lautet: setze alle statischen Felder auf 0; Ausführung statischer Feldinitialisierer; ein statischer Konstruktor, der die Basisklasse ausführt; Statische Konstruktoren, die den aktuellen Typ ausführen;
Setze alle Instanzfelder auf 0; Ausführen von Instanzfeldinitialisierern; Führe den entsprechenden Basisklassen-Instanzkonstruktor aus; Führe den Instance-Konstruktor des aktuellen Typs aus.

15. Verwenden Sie die Ansätze using und try/final, um Ressourcen zu bereinigen

In der Dispose()-Methode der IDisposable-Schnittstelle kann GC.SuppressFinalize() verwendet werden, um den Garbage Collector darüber zu informieren, dass die letzte Operation nicht mehr ausgeführt wird.

16. Speichermüll minimieren

1. Es erfordert zusätzliche Prozessorzeit, um Objekte auf einem Heap zuzuordnen und zu zerstören;
2. Techniken zur Reduzierung der Anzahl der zugewiesenen Objekte: Häufig verwendete lokale Variablen werden zu Feldern befördert; Stellt eine Klasse bereit, die gängige Instanzen von Singleton-Objekten speichert, die bestimmte Typen ausdrücken.
3. Verwenden Sie StringBuilder, um komplexe String-Operationen durchzuführen.

17. Minimieren Sie das Einpacken und Auspacken

1. Achten Sie auf die implizite Umwandlung eines Typs in System.Object, und der Werttyp sollte nicht durch den System.Object-Typ ersetzt werden;
2. Die Verwendung von Schnittstellen anstelle von Typen kann das Boxen vermeiden, das heißt, Werttypen aus Schnittstellen zu implementieren und dann Mitglieder über Schnittstellen aufzurufen.

18. Implementierung des standardisierten Entsorgungsmodus

1. Um Nicht-Speicherressourcen zu verwenden, muss er einen Finalizer haben; der Garbage Collector fügt die implementierten Finalizer-Objekte nach Abschluss der Speicherobjekte, die sie nicht beendet haben, in die Terminationswarteschlange ein, und dann startet der Garbage Collector einen neuen Thread, um die Finalizer auf diesen Objekten auszuführen. Dies kann das Problem von Speicherlecks vermeiden, das durch nicht verwaltete Speicherressourcen verursacht wird.
2. Die Verwendung der IDisposable.Dispose()-Methode erfordert vier Arbeitsaspekte: das Freigeben aller nicht verwalteten Ressourcen; Setzen Sie alle verwalteten Ressourcen frei; Setzen Sie einen Statusmarker, der anzeigt, ob Dispose() ausgeführt wurde; Rufen Sie GC.SuppressFinalize(this) auf, um die Beendigungsoperation des Objekts zu beenden;
3. Füge eine geschützte virtuelle Methode Dispose() dem Typ hinzu, der Polymorphismus benötigt, und die abgeleitete Klasse löst ihre Aufgabe frei, indem sie diese Methode umschreibt.
4. Bei dem Typ, der eine IDisoposable Schnittstelle benötigt, sollten wir einen Terminator implementieren, auch wenn wir keinen benötigen.

19. Definiere und implementiere Schnittstellen über Vererbungstypen

1. Nicht verwandte Typen können gemeinsam eine gemeinsame Schnittstelle implementieren, und es ist einfacher, eine Schnittstelle als Vererbung zu implementieren;
2. Die Schnittstelle ist relativ stabil, sie kapselt eine Menge von Funktionen in einer Schnittstelle wie andere Arten von Implementierungsverträgen, während die Basisklasse im Laufe der Zeit erweitert werden kann.

20. Unterscheide zwischen Schnittstellenimplementierung und virtueller Methodenumschreibung

1. Bei der Implementierung einer Schnittstelle in der Basisklasse muss die abgeleitete Klasse neu verwenden, um die Verwendung der Basisklassenmethode zu verbergen;
2. Die Methode der Basisklassenschnittstelle kann als virtuelle Methode deklariert und dann in der abgeleiteten Klasse implementiert werden.

21. Nutzen Sie Vertrauen, um Rückrufe auszudrücken

1. Der Delegat selbst stellt keine Ausnahmeerfassung bereit, sodass jeder Multicast-Delegiertenaufruf die gesamte Aufrufkette beendet.
2. Indem man jedes Delegationsziel in der Delegiertenkette anzeigt und aufruft, kann man vermeiden, dass Multicast-Delegierte nur die Ausgabe des letzten Delegierten zurückgibt.

22. Verwenden Sie Ereignisse, um externe Schnittstellen zu definieren

1. Sie sollte als gemeinsames Ereignis deklariert werden und dem Compiler erlauben, Add- und Remmove-Methoden für uns zu erstellen.
2. Verwenden Sie den Container System.ComponentModel.EventHandlerList, um jeden Ereignishandler zu speichern, und verwenden Sie ihn, um die Komplexität aller Ereignisse zu verbergen, wenn der Typ eine große Anzahl von Ereignissen enthält.

23. Vermeiden Sie es, Referenzen auf interne Klassenobjekte zurückzugeben

1. Da der Zugriff auf ein Werttypobjekt eine Kopie des Objekts erzeugt, verändern die Attribute der Definition eines Werttyps den Zustand innerhalb des Typobjekts überhaupt nicht;
2. Konstante Typen können verhindern, dass der Zustand des Objekts verändert wird;
3. Definieren Sie die Schnittstelle so, dass der Zugriff auf eine Teilmenge begrenzt wird, um den Schaden am internen Zustand des Objekts zu minimieren.
4. Ein Wrapper-Objekt definieren, um den Zugriff auf ein anderes Objekt zu beschränken;
5. Wenn der Kundencode die internen Datenelemente ändert, kann der Observer-Modus implementiert werden, sodass das Objekt die Änderungen verifizieren oder entsprechen kann.

24. Deklarative Programmierung ist besser als imperative Programmierung

Die Möglichkeit, Fehler in mehreren ähnlichen handschriftlichen Algorithmen zu machen, kann vermieden werden, und klarer und lesbarer Code wird bereitgestellt.

25. Implementiere Typen so serialisierbar wie möglich

1. Der Typ stellt keine UI-Steuerung, kein Fenster oder ein Formular dar und sollte Serialisierung unterstützen;
2. Beim Hinzufügen des deserialisierten Attributs NonSerializedAttribute kann der Standardwert mit der OnDeserialization()-Methode geladen werden, die IDeserializationCallback implementiert;
3. In der Versionskontrolle kann man die ISerializable-Schnittstelle für flexible Steuerung nutzen und einen Serialisierungskonstruktor bereitstellen, um Objekte entsprechend den Daten im Strom zu initialisieren und außerdem die Erlaubnis von SerializationFormatter-Ausnahmen bei der Implementierung benötigen.
4. Wenn du eine abgeleitete Klasse erstellen musst, musst du eine Hook-Methode für die abgeleitete Klasse bereitstellen.

26. Verwenden Sie IComparable- und IComparer-Schnittstellen zur Implementierung von Sortierbeziehungen

1. Die IComparable-Schnittstelle wird verwendet, um die natürlichste Sortierbeziehung für Typen zu implementieren, wodurch vier Vergleichsoperatoren überlastet werden und eine überladene Version der CompareTo()-Methode bereitgestellt werden, um bestimmte Typen als Parameter zu akzeptieren.
2. IComparer wird verwendet, um Sortierbeziehungen zu bieten, die sich von IComparable unterscheiden, oder um uns Sortierbeziehungen zu liefern, von denen der Typ selbst sagt, dass sie nicht implementiert sind.

27. ICloneable Schnittstellen vermeiden

1. Für Wertetypen ist keine ICloneable-Schnittstelle erforderlich, sondern verwenden Sie einfach die Standardzuweisungsfunktion;
2. Für Basisklassen, die ICloneable-Schnittstellen unterstützen müssen, sollte ein geschützter Replikationskonstruktor erstellt werden, und IConeable-Schnittstellen sollten vermieden werden.

28. Erzwungene Umwandlungsbediener vermeiden

Die Verwendung von Konstruktoren statt Konvertierungsoperatoren kann die Umwandlung klarer machen, was leicht zu einigen merkwürdigen Bugs führen kann, da nach der Konvertierung temporäre Objekte verwendet werden.

29. Den neuen Modifikator nur in Betracht ziehen, wenn die Ansammlung neuer Versionen Probleme verursacht

30. CLS-kompatible Assemblies so weit wie möglich implementieren
1. Um eine kompatible Assembly zu erstellen, müssen zwei Regeln eingehalten werden: Die Parameter und Rückgabe-Werttypen, die von allen öffentlichen und geschützten Mitgliedern der Assembly verwendet werden, müssen mit CLS kompatibel sein; Jedes öffentliche und geschützte Mitglied, das nicht mit der CLS kompatibel ist, muss eine CLS-kompatible Alternative haben;
2. Man kann die CLS-Kompatibilitäts-Typprüfung umgehen, indem man die Schnittstelle explizit implementiert, und das CLSCompliantAttribute prüft nicht die CLS-Kompatibilität privater Mitglieder.

31. Implementieren Sie so viel wie möglich eine kurze und prägnante Methode

1. Der JIT-Compiler kompiliert in Einheiten von Methoden, und Methoden, die nicht aufgerufen werden, werden von JIT nicht kompiliert;
2. Wenn der Code der Case-Anweisung im längeren Switch durch eine Methode ersetzt wird, wird die vom JIT-Compiler eingesparte Zeit multipliziert;
3. Kurze und prägnante Methoden sowie die Auswahl weniger lokaler Variablen können eine optimierte Registernutzung erreichen;
4. Je weniger Kontrollzweige in der Methode, desto einfacher ist es für den JIT-Compiler, Variablen in Register einzufügen.

32. Kleine Größe und hohe kohäsive Zusammensetzungen so weit wie möglich realisieren

1. Alle öffentlichen Klassen und Common Base-Klassen in einige Assemblies einfügen, die Werkzeugklassen, die Funktionen für öffentliche Klassen bereitstellen, in dieselbe Assembly legen, die entsprechenden öffentlichen Schnittstellen in eigene Assemblies verpacken und schließlich die Klassen verarbeiten, die sich in der gesamten horizontalen Position der Anwendung befinden;
2. Grundsätzlich sollten zwei Arten von Komponenten erstellt werden: Eine ist eine kleine und aggregierte Einheit mit einer bestimmten Funktion, die andere eine große und breite Einheit mit gemeinsamen Funktionen.

33. Begrenze die Sichtbarkeit der Typen

1. Die Verwendung von Schnittstellen zur Bereitstellung der Funktionen von Typen kann es uns erleichtern, interne Klassen zu erstellen, ohne ihre Verfügbarkeit außerhalb der Assembly zu begrenzen;
2. Je weniger öffentliche Typen der Außenwelt ausgesetzt sind, desto mehr Möglichkeiten haben Sie für zukünftige Erweiterungen und Änderungsimplementierungen.

34. Erstellen Sie eine großgranulare Web-API

Dies minimiert die Häufigkeit und Last von Transaktionen zwischen den Maschinen und erfordert große Operationen und feingranulare Ausführungen auf den Server.

35. Umschreiben ist besser als Ereignisprozessoren

1. Wenn ein Ereignisprozessor eine Ausnahme wirft, werden andere Prozessoren auf der Ereigniskette nicht aufgerufen, aber dies geschieht nicht bei der umgeschriebenen virtuellen Methode.
2. Das Umschreiben ist deutlich effizienter als assoziative Ereignisprozessoren, die über die gesamte Anforderungsliste iterieren müssen, was mehr CPU-Zeit beansprucht.
3. Ereignisse können zur Laufzeit beantwortet werden, mit mehr Flexibilität, und mehrere Antworten können mit demselben Ereignis verknüpft werden.
4. Die gängige Regel ist, mit einem abgeleiteten Ereignis umzugehen, und die Umschreibmethode ist besser.

36. Fair Use. .NET-Laufzeitdiagnostik

1. System.Diagnostics.Debug\Trace\EventLog stellt alle Werkzeuge bereit, damit das Programm Diagnoseinformationen zur Laufzeit hinzufügen kann, und die Anwendung kann in das Systemereignisprotokoll schreiben, wenn das EventLog die Zutat bereitstellt;
2. Schließlich: Schreibe nicht deine eigene Diagnosebibliothek, .NET FCL hat bereits die Kernbibliothek, die wir brauchen.

37. Verwendung von Standardkonfigurationsmechanismen

1、. Die System.Windows.Application-Klasse des .NET-Frameworks definiert die Eigenschaften, um einen gemeinsamen Konfigurationspfad zu etablieren;
2. Application.LocalAppDataPath und Application.userDataPath generieren die Pfadnamen des lokalen Datenverzeichnisses und der Benutzerdaten;
3. Schreiben Sie keine Daten in ProgramFiles- und Windows-Systemverzeichnissen, diese Orte erfordern höhere Sicherheitsberechtigungen, erwarten Sie keine Schreibberechtigungen.

38. Datenbindung anpassen und unterstützen

1. Die beiden Objekte von BindingMananger und CurrencyManager realisieren den Datentransfer zwischen der Steuerung und der Datenquelle;
2. Vorteile der Datenbindung: Die Nutzung von Datenbindung ist viel einfacher als das Schreiben eigener Codes; Er sollte für andere Bereiche als Textdatenelemente verwendet werden – andere Anzeigeeigenschaften können ebenfalls gebunden werden; Für Windowos Forms-Datenbindungen die Möglichkeit, mehrere Steuerungen zu synchronisieren, prüfbezogene Datenquellen;
3. Wenn das Objekt die erforderlichen Attribute nicht unterstützt, kann man Datenbindung unterstützen, indem man das aktuelle Objekt blockiert und dann das gewünschte Objekt hinzufügt.

39. Nutzen. .NET-Validierung

1. Es gibt fünf Kontrollen im ASP.NET zur Überprüfung der Gültigkeit, und Sie können CustomValidator verwenden, um eine neue Klasse abzuleiten, um Ihren eigenen Authenticator hinzuzufügen.
2. Die Windows-Validierung erfordert ein Sub-System.Windows.Forms.Control.Validating zum Schreiben eines Ereignishandlers.

40. Wähle die passende ** entsprechend den Bedürfnissen aus

1. Das Array weist zwei offensichtliche Mängel auf: Es kann nicht dynamisch verkleinert werden; Das Anpassen der Größe ist zeitaufwendig;
2. ArrayList kombiniert die Eigenschaften eindimensionaler Arrays und verketteter Listen, Queue und Stack sind spezielle Arrays, die auf Array basieren;
3. Wenn das Programm flexibler ist, um Elemente hinzuzufügen und zu löschen, kann es robustere Typen erstellen, und beim Erstellen einer Klasse, die ** simuliert, sollte es Indexer und IEnumberable Interfaces dafür implementieren.

41. Das Datensatz ist besser als eine benutzerdefinierte Struktur

1. DataSets haben zwei Nachteile: Die Interaktion zwischen DataSets mittels XML-Serialisierungsmechanismus und non-.NET Code ist nicht sehr gut; DataSet ist ein sehr vielseitiger Container;
2. Starke Arten von Datensätzen brechen mehr Designregeln, und ihre Entwicklungseffizienz ist deutlich höher als bei den eleganteren Designs, die sie selbst verfasst haben.

42. Verwenden Sie Merkmale, um die Reflexion zu vereinfachen

Indem Sie Feature-Klassen entwerfen und implementieren, die Entwickler zwingen, dynamisch nutzbare Typen, Methoden und Attribute zu deklarieren, können Anwendungslaufzeitfehler reduziert und die Nutzerzufriedenheit der Software verbessert werden.

43. Vermeiden Sie Überbeanspruchung von Reflexen

1. Die von Invoke-Mitgliedern verwendeten Parameter und Rückgabewerte sind System.Object, das Typen zur Laufzeit konvertiert, aber die Möglichkeit von Problemen ist wahrscheinlicher geworden.
2. Die Schnittstelle ermöglicht uns ein klareres und besser wartbares System, und Reflexion ist ein sehr mächtiger Mechanismus für späte Bindung. Das .NET-Framework verwendet es, um Datenbindungen für Windows- und Web-Steuerungen zu implementieren.

44. Erstellen Sie spezifische Ausnahmeklassen für die Anwendung

1. Der einzige Grund, warum verschiedene Ausnahmeklassen benötigt werden, ist, dass Nutzer beim Schreiben von Catch-Prozessoren einfach unterschiedliche Ansätze für unterschiedliche Fehler verfolgen können;
2. Wenn es unterschiedliche Reparaturverhaltensweisen geben kann, sollten wir eine Vielzahl unterschiedlicher Ausnahmeklassen erstellen; indem wir alle von der Ausnahme-Basisklasse unterstützten Konstruktoren bereitstellen, können wir eine voll funktionsfähige Ausnahmeklasse für die Anwendung erstellen und das Attribut InnerException verwenden, um alle durch niedrigstufigen Fehlerbedingungen generierten Fehlerinformationen zu speichern.

45. Abnorme Sicherheitsgarantien priorisieren

1. Die starke Ausnahmegarantie bietet das beste Gleichgewicht zwischen der Wiederherstellung von der Ausnahme und vereinfachter Ausnahmebehandlung, und der Zustand des Programms bleibt unverändert, wenn die Operation aufgrund der Ausnahme unterbrochen wird.
2. Führen Sie ein defensives Kopieren der zu ändernden Daten durch, ändern Sie die defensive Kopie dieser Daten, die Operation in der Mitte kann eine Ausnahme verursachen, und die temporäre Kopie sowie das Originalobjekt werden ausgetauscht;
3. Terminatoren, Dispose()-Methoden und Zielmethoden, die an Delegierte gebunden sind, sollten sicherstellen, dass sie unter keinen Umständen Ausnahmen werfen.

46. Interoperabilität minimieren

1. Es gibt drei Kosten der Interoperabilität: die Kosten für die Datenaufzählung zwischen verwalteten und unverwalteten Heaps, die Kosten für den Wechsel zwischen verwaltetem und unverwaltetem Code sowie die Entwicklungsarbeit von Entwicklern, die mit hybriden Umgebungen arbeiten;
2. Die Verwendung des blittablen Typs in Interop kann effektiv zwischen verwalteten und unverwalteten Umgebungen repliziert werden, ohne von der internen Struktur des Objekts beeinflusst zu werden.
3. Nutzen Sie die In/Out-Funktion, um die passendsten unnötigen Mehrfachreplikationen sicherzustellen, und verbessern Sie die Leistung, indem Sie angeben, wie die Daten aufgezählt werden.
4. COM Interop verwenden, um Interoperabilität mit COM-Komponenten auf die einfachste Weise zu implementieren, P/Invoke verwenden, um die Win32-API aufzurufen, oder den /CLR-Switch des C++-Compilers verwenden, um verwalteten und unverwalteten Code zu mischen;

47. Sicherheitsvorschriften priorisieren

1. Vermeiden Sie so weit wie möglich den Zugriff auf unverwalteten Speicher, und isolierter Speicher kann den Zugriff von verwaltetem Code und vertrauenswürdigen Benutzern nicht verhindern.
2. Wenn Assemblies im Web laufen, sollten Sie die Verwendung von isoliertem Speicher in Betracht ziehen, und wenn bestimmte Algorithmen höhere Sicherheitsberechtigungen benötigen, sollten diese Codes in einer separaten Assembly isoliert werden.

48. Beherrsche relevante Werkzeuge und Ressourcen

1. NUnit verwenden, um automatische Unit-Tests zu etablieren (integriert in VS2010);
2. Das FXCop-Tool ermittelt den IL-Code in der Assembly, analysiert ihn anhand der heterogenen Codierungsregeln und Best Practices und meldet schließlich den Verstoß.
3. ILDasm ist ein IL-Demontage-Werkzeug, das uns helfen kann, Einblicke in Details zu gewinnen;
4. Shared Source CLI ist ein Implementierungscode, der den .NET-Framework-Kernel und den C#-Compiler enthält.




Vorhergehend:Service Fabric – Konzept des Zustandsvollen Dienstes
Nächster:.net/c# SynchronizationContext für Details
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com