// In MyClass.cs öffentliche Teilklasse MyClass // In MyClass.cs public partial class MyClass {…} //In MyClass.Designer.cs public partial class MyClass {…}
| MyClass.Designer.cs öffentliche Teilklasse MyClass ” in einer neuen Zeile Codierungspraktiken:
1. Vermeiden Sie die Platzierung mehrerer Klassen in derselben Datei 2 . Eine Datei sollte nur Typen innerhalb eines Namespace definieren. Vermeiden Sie die Verwendung mehrerer Namespaces in einer Datei 3. Vermeiden Sie es, mehr als 500 Codezeilen in eine Datei zu schreiben (außer automatisch generiertem Code) 4. Vermeiden Sie es, mehr als 25 Codezeilen zu schreiben 5. Vermeiden Sie das Schreiben von Methoden mit mehr als 5 Parametern. Wenn Sie mehrere Parameter übergeben möchten, verwenden Sie eine Struktur. 6. Eine Zeile sollte 80 Zeichen nicht überschreiten 7 Ändern Sie keinen maschinell generierten Code. a) Wenn Sie den maschinell generierten Code ändern, ändern Sie Ihre Kodierungsmethode, um sie an diesen Kodierungsstandard anzupassen b) Verwenden Sie so oft wie möglich Teilklassenfunktionen, um die Wartbarkeit zu verbessern. (Neue Funktionen in C# 2.0) 8. Vermeiden Sie das Kommentieren von Inhalten, die sehr intuitiv sind. Der Code selbst sollte in der Lage sein, seine eigene Bedeutung zu erklären. Guter Code, der aus lesbaren Variablen- und Methodennamen besteht, sollte keine Kommentare erfordern. 9. Kommentare sollten nur einige Grundannahmen der Operation, interne Informationen des Algorithmus usw. beschreiben. 10. Vermeiden Sie das Kommentieren von Methoden a) Verwenden Sie ausreichend externe Dokumentation, um die API zu beschreiben
b) In Kommentaren auf Methodenebene dürfen nur Informationen platziert werden, die für andere Entwickler nützlich sind 11. Kodieren Sie niemals andere Werte als 0 und 1, indem Sie eine Konstante anstelle des Werts 12 deklarieren. Verwenden Sie den Schlüssel const nur für Werte, die das Zeichen niemals ändern die Anzahl der Tage in einer Woche. 13. Vermeiden Sie die Verwendung des Schlüsselworts const für schreibgeschützte Variablen. Verwenden Sie in diesem Fall direkt das readonly-Schlüsselwort
public class MyClass { public const int DaysInWeek=7; pubic readonly int Number; public MyClass(int someValue) { Number=someValue; } }
|
public class MyClass ; public readonly int Number; int someValue) } }
| tbody>
using System.Diagnostics; object GetObject() {…} object someObject=GetObject(); Debug.assert(someObject!=null);
| 14. Machen Sie eine Behauptung für jede Hypothese. Im Durchschnitt sollte alle 5 Zeilen eine Behauptung vorhanden sein. using System.Diagnostics; Debug.assert(someObject!=null); |
15. Jede Codezeile sollte durch White-Box-Tests überprüft werden. 16. Fangen Sie nur Ausnahmen ab, die Sie explizit selbst behandeln können. 17. Wenn Sie eine Ausnahme im Catch-Anweisungsblock auslösen müssen, werfen Sie nur die vom Catch erfasste Ausnahme (oder andere auf der Ausnahme basierende Ausnahmen) aus, damit der ursprüngliche Fehler behoben werden kann beibehalten Der Stapelspeicherort, an dem es sich befindet.
catch(Ausnahme Ausnahme) catch(Exception exception) { MessageBox.Show(exception.Message); throw;//或throw exception; }
| /oder Ausnahme auslösen; > |
18. Vermeiden Sie die Verwendung des Rückgabewerts als Fehlercode der Funktion. 19. Vermeiden Sie benutzerdefinierte Ausnahmeklassen. 20. Beim Anpassen von Ausnahmeklassen: a) Lassen Sie Ihre benutzerdefinierte Ausnahmeklasse von der Ausnahmeklasse erben b) Stellen Sie einen benutzerdefinierten Serialisierungsmechanismus bereit 21 >Main()-Methoden in einer Assembly. 22. Definieren Sie nur die Methoden, die unbedingt erforderlich sind, als öffentlich und definieren Sie andere Methoden als intern. 23. Vermeiden Sie Friend-Assemblys, da dies die Kopplung zwischen Assemblys erhöht. 24. Vermeiden Sie es, Ihren Code von einer Assembly abhängig zu machen, die an einem bestimmten Ort ausgeführt wird. 25. Minimieren Sie die Codemenge in der Anwendungsassembly (EXE-Client-Assemblys). Verwenden Sie Klassenbibliotheken, um Geschäftslogik zu enthalten. 26. Vermeiden Sie die explizite Angabe von Aufzählungswerten
//Richtig public enum Color 🎜> Rot, Grün, Blau //正确 public enum Color { Red,Green,Blue }
//避免 public enum Color { Red=1,Green=2,Blue=3 }
| Rot=1,Grün=2,Blau=3 }
| 27 eine Aufzählung//避免 public enum Color:long { Red,Green,Blue }
|
//Vermeiden Sie public enum Color:long { 🎜 >28 Verwenden Sie immer ein {}-Paar, um den folgenden Anweisungsblock einzuschließen, auch wenn nur eine Anweisung vorhanden ist. 29. Vermeiden Sie die Verwendung des ternären bedingten -Operators . Bool IsEverythingOK() {…}
//避免 if(IsEverythingOk()) {…}
//正确 bool ok=IsEverythingOK(); if (ok) {…}
| 30. Vermeiden Sie die Verwendung von booleschen Werten, die von Funktionen als bedingte Anweisungen zurückgegeben werden. Weisen Sie den Rückgabewert einer lokalen Variablen zu und testen Sie ihn anschließend.
Bool IsEverythingOK() ) {…}
|
31. Verwenden Sie immer nullbasierte Arrays. 32. Verwenden Sie immer eine for-Schleife, um ein Array von public class MyClass {} const int ArraySize=100; MyClass[] array=new MyClass[ArraySize]; For (int index=0;index { array[index]=new MyClass(); }
| Referenzen auf <🎜>-Mitglieder explizit zu initialisieren: <🎜><🎜>public class MyClass<🎜> =0;index33. Verwenden Sie Eigenschaften, um öffentliche oder geschützte Mitgliedsvariablen zu ersetzen. 34. Verwenden Sie nicht den geerbten neuen Operator, sondern verwenden Sie das Schlüsselwort override, um die Implementierung von new zu überschreiben. 35. Definieren Sie in einer nicht versiegelten Klasse immer öffentliche und geschützte Methoden als virtuell. 36. Verwenden Sie niemals unsicheren Code, außer zur Interaktion mit anderen Sprachen. 37. Vermeiden Sie die Anzeige der Typkonvertierung. Verwenden Sie das as-Schlüsselwort für eine sichere Konvertierung in einen anderen Typ.
Dog dog=new GermanShepherd(); Dog dog=new GermanShepherd(); GermanShepherd shepherd=dog as GermanShepherd; if (shepherd!=null) {…}
| GermanShepherd shepherd=dog as GermanShepherd; if (shepherd!=null ) . 39. Stellen Sie keine öffentlichen Ereignis -Mitgliedsvariablen bereit. Verwenden Sie stattdessen Event Accessor. Public class MyPublisher { MyDelegate m_SomeEvent; Public event MyDelegate SomeEvent { add { m_SomeEvent+=value; } remove { m_SomeEvent-=value; } } }
|
Öffentliche Klasse MyPublisher { MyDelegate m_SomeEvent; Öffentliche Veranstaltung MyDelegate SomeEvent > m_SomeEvent- =Wert; > |
40. Vermeiden Sie die Definition von Ereignisbehandlung . Verwenden Sie EventHandler 41. Vermeiden Sie die Anzeige von Triggerereignissen. Verwenden Sie EventsHelper, um Ereignisse sicher zu veröffentlichen. 42. Verwenden Sie immer Schnittstellen. 43. Das Verhältnis von Methoden und Eigenschaften in Schnittstellen und Klassen sollte etwa 2:1 betragen. 44. Vermeiden Sie Schnittstellen mit nur einem Mitglied. 45. Stellen Sie sicher, dass eine Schnittstelle 3 bis 5 Mitglieder hat. 46. Lassen Sie nicht zu, dass die Anzahl der Mitglieder in einer Schnittstelle 20 überschreitet, während 12 eine praktischere Grenze darstellt. 47. Vermeiden Sie die Einbeziehung von Ereignissen in Schnittstellen. 48. Stellen Sie bei Verwendung der abstrakten Klasse eine Schnittstelle bereit. 49. Stellen Sie Schnittstellen in Klassenvererbungsstrukturen bereit. 50. Es wird empfohlen, eine explizite Schnittstellenimplementierung zu verwenden. SomeType obj1; ImyInterface obj2; /*Some code to initialize obj1,then:*/ obj2=obj1 as ImyInterface; if(obj2!=null) { obj2.Method1(); } else { //Handle erro in expected interface }
| 51. Gehen Sie niemals davon aus, dass ein Typ eine Schnittstelle unterstützt. Fragen Sie immer nach, bevor Sie es verwenden.
SomeType obj1; ImyInterface obj2; /*Einiger Code zum Initialisieren von obj1,then:*/ obj2=obj1 as ImyInterface; if(obj2!=null) //避免 string name=””; //正确 string name=String.Empty;
| { > else { //Fehler in der erwarteten Schnittstelle behandeln } | 52. Codieren Sie die dem Benutzer angezeigten Zeichenfolgen nicht fest. Ressourcen nutzen. 53. Codieren Sie keine Zeichenfolgen fest, die sich mit der Release-Umgebung ändern können, wie z. B. Datenbankverbindungszeichenfolgen. 54. Verwenden Sie String.Empty, um "" //Avoid zu ersetzen. // Stringname korrigieren =String.Empty; |
55. Wenn Sie eine lange Zeichenfolge verwenden, verwenden Sie StringBuilder anstelle von string. 56. Vermeiden Sie die Bereitstellung von Methoden in Strukturen a) Es wird empfohlen, parametrisierte Konstruktoren zu verwenden b) Sie können Operatoren überladen 57. Bei der Deklaration Ausdrucksstarke Mitglieder stellen immer einen Ausdruckskonstruktor bereit. 58. Versuchen Sie, keine späte Bindung zu verwenden, wenn eine frühe Bindung möglich ist. 59. Sorgen Sie dafür, dass Ihre Anwendung die Ablaufverfolgung und Protokollierung unterstützt. 60. Verwenden Sie das Schlüsselwort goto nicht, außer um Codesprünge im Block switch-Anweisung zu implementieren. 61. Geben Sie im Standardfall einer switch-Anweisung immer eine Zusicherung an.
int number=SomeMethod(); Trace.Writeline ("case 1:") int number=SomeMethod(); swith(number) { case 1: trace.WriteLine(“Case 1:”) break; case 2: trace.Writeline(“Case 2:”); break; default: debug.Assert(false); break; }
| Break; : Trace.writeline ("Fall 2:"); Defaut: Debug(false); //Example of proper use of ‘this’ public class MyClass { public MyClass(string message) { } public MyClass():this(“Hello”) { } }
| break;
//Beispiel für die ordnungsgemäße Verwendung von 'this' public class MyClass //Example of proper use of ‘base’ public class Dog { public Dog(string name) { } virtual public void Bark(int howlong) { } } public class GermanShepherd:Dog { public GermanShepherd(string name):base(name) { } override public void Bark(int howLong) { base.Bark(howLong) } }
| { public MyClass(string Nachricht) > 63 Verwenden Sie nicht das Basisschlüsselwort, um auf Mitglieder einer Basisklasse zuzugreifen, es sei denn, Sie müssen einen Unterklassennamenskonflikt lösen, wenn Sie einen Basisklassenkonstruktor aufrufen
//Beispiel für die ordnungsgemäße Verwendung von 'base' public class Dog Int CalcPower(int number,int power) { int result=1; for (int count=1;count<=power;count++) { checked { result*=number; } } return result; }
| { <🎜> public Dog(string name) <🎜> virtual public void Bark (int howlong) string name):base(name) <🎜> int howLong) <🎜>. >64 Verwenden Sie nicht GC.AddMemoryPressure() <🎜>65 Verlassen Sie sich nicht auf HandleCollector <🎜>66 Disponse()- und Finalize()-Methoden basierend auf dem Inhalt von Kapitel 4 in „Programmierung von .NET-Komponenten“ 2/e. <🎜>67. Führen Sie Code immer im ungeprüften Zustand aus (aus Leistungsgründen), aber um Überlauf- oder Unterlaufvorgänge zu verhindern, verwenden Sie unbedingt den geprüften Modus. <🎜><🎜>Int CalcPower(int number,int power) <🎜> count=1;count<=power;count++) } <🎜> 🎜> |
68. Verwenden Sie bedingte Methoden, um den expliziten Methodenaufruf-Ausschlusscode (#if...#endif) zu ersetzen.
öffentliche Klasse MyClass public class MyClass { [Conditional(“MySpecialCondition”)] public void MyMethod() {} }
| } | table>69 Definieren Sie keine Einschränkungen in generischen Schnittstellen. Einschränkungen auf Schnittstellenebene können häufig durch starke Typisierung ersetzt werden. Public class Customer {} //避免: public interface Ilist where T:Customer {}
//正确: public interface IcustomerList:Ilist
|
Kunde der öffentlichen Klasse {}
//Richtig: öffentliche Schnittstelle IcustomerList:Ilist
| 70 Definieren Sie keine methodenbezogenen Einschränkungen für die Schnittstelle.
|
|
|
|
|