تصميم البنية
بني القيمة أنواع. بقيت على مكدس أو مضمنة و يتم deallocated عندما تقفز خارج نطاق. بشكل عام، أنواع القيم cheaper ليخصص وإلغاء يخصص؛ ومع ذلك، في حالة استخدامها في الحالات التي تتطلب قدرا كبيرا من تحويل إلى كائن و تحويل إلى نوع القيمة، لأنها تقوم شكل ضعيف مقارنة ب مرجع أنواع. لمزيد من المعلومات، راجع boxing و Unboxing (برمجة دليل C#).
لمزيد من المعلومات حول القيمة أنواع وأنواع المرجع, راجع نظام نوع شائع.
لا توفر الدالة الإنشائية افتراضي لبنية.
إذا كان يعرف بنية الدالة الإنشائية افتراضي، عند تاريخ الإنشاء صفائف البنية، وقت تشغيل اللغة العامة تلقائياً بتنفيذ المنشئ الافتراضي على كل عنصر من الصفيف.
لا تسمح بعض compilers، مثل C# المترجم، بنية أن المنشئات الافتراضي.
قم بتطبيق النظام.IEquatable`1 تشغيل أنواع القيم.
IEquatable<T>هو المفضل عبرEqualsلتحديد ما إذا كان اثنين بالقيمة أنواع المساواة. باستخدام الواجهة، المتصل بتجنب تأثير أداء سالبة تحويل إلى كائن و إدارة الانعكاس.
تحقق الولاية الموقع كل مثيل البيانات هو معينة إلى صفر، خاطئا، أو null (كما هو مناسب) هو صالح.
باتباع هذه الإرشادات العامة، لا يتم ترك مثيلات نوع القيمة constructed حديثا الخاص بك في الولاية غير قابل للاستخدام. على سبيل المثال، البنية التالية هو مصمم بشكل غير صحيح. الدالة الإنشائية معلمات هو للتأكد من الولاية صحيحة، ولكن المنشئ هو لا يتم تنفيذها عند صفيفة البنية هو التي تم إنشاؤها. Th هو يعني مثيل الحقل labelيحصل على تهيئة إلى null(Nothingفي Vهوual أساسى)، الذي هو غير صالح لترتيب هو تطبيق لبنية ToStrفيg.
Public Structure BadStructure
Private label As String
Private width As Integer
Private length As Integer
Public Sub New(ByVal labelValue As String, ByVal widthValue As Integer, ByVal lengthValue As Integer)
If ((labelValue = Nothing) _
OrElse (labelValue.Length = 0)) Then
Throw New ArgumentNullException("label")
End If
label = labelValue
width = widthValue
length = lengthValue
End Sub
Public Overrides Function ToString() As String
' Accessing label.Length throws a NullReferenceException
' when label is null.
Return String.Format("Label length: {0} Label: {1} Width: {2} Length: {3}", label.Length, label, width, length)
End Function
End Structure
public struct BadStructure
{
string label;
int width;
int length;
public BadStructure (string labelValue, int widthValue, int lengthValue)
{
if (labelValue == null || labelValue.Length ==0)
{
throw new ArgumentNullException("label");
}
label = labelValue;
width = widthValue;
length = lengthValue;
}
public override string ToString()
{
// Accessing label.Length throws a NullReferenceException
// when label is null.
return String.Format("Label length: {0} Label: {1} Width: {2} Length: {3}",
label.Length, label, width,length);
}
}
في ما يلي تعليمات برمجية سبيل المثال، التصميم GoodStructureيجعل لا يوجد افتراضات حول الحالة labelالحقل. الطريقة ToString هو مصممة لمعالجة nullالتسمية.
Public Structure GoodStructure
Private label As String
Private width As Integer
Private length As Integer
Public Sub New(ByVal labelValue As String, ByVal widthValue As Integer, ByVal lengthValue As Integer)
label = labelValue
width = widthValue
length = lengthValue
End Sub
Public Overrides Function ToString() As String
' Handle the case where label might be
' initialized to null;
Dim formattedLabel As String = label
Dim formattedLableLength As Integer
If (formattedLabel = Nothing) Then
formattedLabel = "<no label value specified>"
formattedLableLength = 0
Else
formattedLableLength = label.Length
End If
Return String.Format("Label Length: {0} Label: {1} Width: {2} Length: {3}", formattedLableLength, formattedLabel, width, length)
End Function
End Structure
public struct GoodStructure
{
string label;
int width;
int length;
public GoodStructure (string labelValue, int widthValue, int lengthValue)
{
label = labelValue;
width = widthValue;
length = lengthValue;
}
public override string ToString()
{
// Handle the case where label might be
// initialized to null;
string formattedLabel = label;
int formattedLableLength;
if (formattedLabel == null)
{
formattedLabel = "<no label value specified>";
formattedLableLength = 0;
} else
{
formattedLableLength = label.Length;
}
return String.Format("Label Length: {0} Label: {1} Width: {2} Length: {3}",
formattedLableLength, formattedLabel, width, length);
}
}
عدم وضوح توسيع النظام.ValueType.
لا تسمح بعض compilers لك إلى توسيع ValueType.
أجزاء حقوق النشر 2005 Microsoft Office 2010 Suite Corporation. كافة الحقوق محفوظة.
أجزاء حقوق النشر شركة Addison-Wesley. كافة الحقوق محفوظة.
ل المزيد المعلومات تشغيل إرشادات التصميم، راجع "إطار عمل إرشادات التصميم: كتاب اصطلاحات، Idioms، و نقش لمكتبات.NET القابل لإعادة الاستخدام"ب Krzysztof Cwalina و رفيق Abrams، ينشره Addison-Wesley، 2005.