مشاركة عبر


تصميم البنية

بني القيمة أنواع. بقيت على مكدس أو مضمنة و يتم 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.

راجع أيضًا:

المبادئ

اختيار بين فئات وبنيات

موارد أخرى

نوع إرشادات التصميم

تصميم إرشادات لتطوير مكتبات فئة