1. หลีกเลี่ยงการดำเนินการเริ่มต้นตัวแปรที่ไม่มีความหมาย
CLR ช่วยให้แน่ใจว่าออบเจ็กต์ทั้งหมดได้รับการเตรียมใช้งานก่อนที่จะเข้าถึงโดยทำให้หน่วยความจำที่จัดสรรเป็นศูนย์ ดังนั้นจึงไม่จำเป็นต้องเตรียมใช้งานตัวแปรใหม่เป็น 0, false หรือ null
//โดยทั่วไปเชี่ยวชาญ 10 รายการหรือน้อยกว่า
HashTable ส่วนตัว _items = null;
NameValueCollection ส่วนตัว = _queryString = null;
สตริงส่วนตัว _siteUrl = null;
Uri ส่วนตัว _currentUri;
สตริง RoleCacheKey = null;
สตริง AuthenticationType = "แบบฟอร์ม";
บูล _isUrlRewrite = เท็จ;
สตริง _rawUrl = null;
HttpContext _httpContext = null
DateTime requestStarTime = DateTime.Now;
ควรสังเกตว่าตัวแปรท้องถิ่นในวิธีการไม่ได้จัดสรรจากฮีป แต่จากสแต็ก ดังนั้น C# จะไม่ล้างข้อมูลเหล่านั้น หากใช้ตัวแปรโลคัลที่ไม่ได้กำหนด จะมีการเตือนเกิดขึ้นระหว่างการคอมไพล์ อย่ากำหนดค่าให้กับตัวแปรสมาชิกของทุกคลาสเพียงเพราะความประทับใจนี้ กลไกของทั้งสองต่างกันโดยสิ้นเชิง!
2. ValueType และ ReferenceType
(1) ส่งผ่านพารามิเตอร์ประเภทค่าโดยการอ้างอิง
ประเภทค่าจะได้รับการจัดสรรจาก call stack และประเภทการอ้างอิงได้รับการจัดสรรจากฮีปที่มีการจัดการ เมื่อใช้ประเภทค่าเป็นพารามิเตอร์วิธีการ การคัดลอกค่าพารามิเตอร์จะดำเนินการตามค่าเริ่มต้น ซึ่งจะลบล้างข้อได้เปรียบด้านประสิทธิภาพของการจัดสรรประเภทค่า สำหรับเทคนิคพื้นฐานแล้ว การส่งพารามิเตอร์ประเภทค่าโดยการอ้างอิงสามารถปรับปรุงประสิทธิภาพได้
โมฆะส่วนตัว UseDateByRef (อ้างอิง DateTime dt){ }
โมฆะสาธารณะ foo()
-
DateTime ตอนนี้ = DateTime.Now;
UseDateByRef (อ้างอิงตอนนี้);
-
(2) ให้วิธีการเท่ากับสำหรับ ValueType
วิธีการ ValueType.Equals ที่ใช้งานโดย .net โดยค่าเริ่มต้นใช้เทคโนโลยีการสะท้อนกลับและอาศัยการสะท้อนกลับเพื่อรับค่าของตัวแปรสมาชิกทั้งหมดเพื่อการเปรียบเทียบ ซึ่งไม่มีประสิทธิภาพอย่างยิ่ง ถ้าจะใช้เมธอด Equals ของอ็อบเจกต์ค่าที่เราเขียน (เช่น การวางอ็อบเจกต์ค่าใน HashTable) ก็ควรใช้งานเมธอด Equals มากเกินไป
สี่เหลี่ยมผืนผ้าโครงสร้างสาธารณะ
-
ความยาวสองเท่าสาธารณะ;
ความกว้างสองเท่าสาธารณะ
บูลแทนที่สาธารณะเท่ากับ (วัตถุ ob)
-
ถ้า (ob คือสี่เหลี่ยมผืนผ้า)
กลับเท่ากับ ((สี่เหลี่ยมผืนผ้า) ob))
อื่น
กลับเท็จ;
-
บูลส่วนตัวเท่ากับ (สี่เหลี่ยมผืนผ้า)
-
กลับสิ่งนี้ .Length == rect.Length && นี้ .Breadth == rect.Breach;
-
-
(3) หลีกเลี่ยงการบรรจุและแกะกล่อง
C# สามารถแปลงระหว่างประเภทค่าและประเภทการอ้างอิงโดยอัตโนมัติผ่านการ Boxing และ Unboxing การชกมวยจำเป็นต้องมีการจัดสรรออบเจ็กต์จากฮีปและการคัดลอกค่าซึ่งมีต้นทุนด้านประสิทธิภาพที่แน่นอน หากกระบวนการนี้เกิดขึ้นในลูปหรือถูกเรียกบ่อยครั้งว่าเป็นวิธีการพื้นฐาน คุณควรระวังผลกระทบสะสม
สถานการณ์ทั่วไปเกิดขึ้นเมื่อทำงานกับประเภทคอลเลกชัน ตัวอย่างเช่น:
ArrayList al = ใหม่ ArrayList();
สำหรับ (int i = 0 ; i < 1,000 ; i ++ )
-
al.Add(i); // ใส่กล่องโดยปริยายเนื่องจาก Add() รับวัตถุ
-
int f = ( int )al[ 0 ]; // องค์ประกอบไม่มีกล่อง
วิธีแก้ไขปัญหานี้คือการใช้ประเภทคอลเลกชันทั่วไปที่รองรับโดย .net2.0