أنواع مجهولة

يقدم Visual Basic 2008 الأنواع المجهولة والتي تتيح لك إنشاء كائنات دون كتابة تعريف فئة لنوع بيانات. بدلاً من ذلك، ينشئ المحول البرمجي فئة نيابة عنك. الفئة لَيْسَ لهُا اسمُ صالح للإستعمالُ، يرث مباشرةً من Object، ويحتوي على الخصائص التي تحددها في التصريح الكائن. لأنه لم يتم تحديد اسم نوع بيانات, تتم الإشارة إليه كـ نوع مجهول.

المثال التالي يُعلنُ ويَنشئ متغيّراًproduct كمثيل من نوع مجهول الذي يحتوي على خاصيتين اثنين , Name و Price.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

تعبير الاستعلام يستخدم أنواع المجهول لجمع بين أعمدة بيانات التي تم تحديدها بواسطة استعلام. لا يمكنك تعريف نوع النتيجة مقدمًا ، لأنه لا يمكن التنبؤ بالأعمدةِ إستفسار معيّن قَدْ يَختارُها. تمكنك أنواع المستخدمين المجهولين كتابة استعلام الذي يحديد أي رقم أعمدة في أي ترتيب. المحول البرمجي ينشئ نوع بيانات التي تطابق الخصائص المحددة و الترتيب المحدد.

في الأمثلة التالية products قائمة من كائنات منتج كل منها يحتوي على العديد من خصائص. متغيرnamePriceQuery يحتفظ بتعريف استعلام الذي، عندما يتم تنفيذها، يتم إرجاع مجموعة من مثيلات من نوع مجهول والذي له خاصيتين اثنين Name و Price.

Dim namePriceQuery = From prod In products
                     Select prod.Name, prod.Price

متغيرnameQuantityQuery يحتفظ بتعريف استعلام الذي، عندما يتم تنفيذها، يتم إرجاع مجموعة من مثيلات من نوع مجهول والذي له خاصيتين اثنين Name و OnHand.

Dim nameQuantityQuery = From prod In products
                        Select prod.Name, prod.OnHand

لمزيد من المعلومات حول تعليمات برمجية أنتج بواسطة المحول البرمجي لنوع مجهول ، راجع تعريف النوع المجهول.

ملاحظة تنبيهتنبيه

إنّ اسمَ النوعِ المجهولِ يتم إنشاؤها بواسطة برنامج التحويل البرمجي ويمكن أن تتباين من تحويل برمجي الى أخر. تعليماتك البرمجية يَجِبُ أَنْ لا يَستعملَ أَو يَعتمدَ على اسمِ نوعِ مجهولِ لأن الاسمَ قَدْ يَتغيّرُ عند القيام بتحويل برمجي مُعَاد لمشروع.

تصريح نوع مجهول

يستخدم تعريف مثيل من نوع مجهول قائمة مُهيئة لتعيين خصائص النوع. يمكنك تحديد الخصائص فقط عند التصريح نوع مجهول غير عناصرَ فئة أخرى مثل الأساليب أو الأحداث. في المثال التالي product1 مثيل نوع مجهول الذي يحتوي على خاصيتين اثنين : Name وPrice

' Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
' -or-
' product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}

إذا عينت خصائص كمفتاح خصائص, يمكنك استخدامهما للمقارنة بين مثيلين نوع مجهول للمساواةِ. ومع ذلك، قيم الخصائص الأساسية لا يُمْكن أنْ تُغيّرَ. راجع مقطع "خصائص المفاتيح" لاحقًا في هذا موضوع للمزيد من المعلومات.

لاحظ أن تصريح مثيل نوع مجهول يشبه تصريح مثيل من النوع المسمى باستخدام كائن مُهيئ :

' Variable product3 is an instance of a class named Product.
Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}

لمقارنة أكثر تفصيلاً لتعريفات من المسمى و نوع مجهول , راجع مقارنة أنواع مجهولة و مسماة.

للمزيد من المعلومات حول الطرقِ الأخرى لتَحديد خصائص نوع مجهول راجع كيفية القيام بما يلي: أسماء الخصائص الاستدلال و الأنواع في تعريفات نوع مجهول.

خصائص المفتاح

تختلف خصائص المفتاح من خصائص بلا مفتاح بعِدّة طرق أساسية:

  • تتم مقارنة قيم الخصائص الأساسية فقط لتحديد ما إذا كان مثيلين متساويبن.

  • قيم خاصية المفتاح للقراءة فقط ولا يمكن تغييره.

  • يتم تضمين فقط قيم خاصية الأساسية في خوارزميةِ شفرة التجزئة متولدة عن طريق المحول البرمجبي لنوع مجهول.

المساواة

حالات الأنواعِ المجهولةِ يُمكنُ أَنْ تَكُونَ مساويةَ فقط إذا هم حالاتَ نفس النوعِ المجهولِ. يعامل المحول البرمجي مثيلين كمثيلات من نفس النوع إذا كانت تفي بالشروط التالية:

  • هم مُعلَنون في نفس التجميع.

  • خصائصهم لَها نفس الأسماءِ، نفس الأنواعِ المُسْتَنْتجةِ، ومُعلَنة في نفس الترتيب. مقارنات الاسم ليست حساسة لحالة الأحرف.

  • نفس خصائص في كل منها معلمه كمفتاح خصائص.

  • خاصية واحدة على الأقل في كل تعريف خاصية المفتاح.

مثيل أنواع المجهول لا يملك المفتاح خصائص يساوي فقط نفسه.

' prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}

' The following line displays False, because prod1 and prod2 have no
' key properties.
Console.WriteLine(prod1.Equals(prod2))

' The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))

تتساوى مثيلين من نفس نوع مجهول إذا القيم مفتاح خصائص الخاصة بهم متساوية. توضح الأمثلة التالية كيف يتم اختبار المساواة.

Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
' The following line displays True, because prod3 and prod4 are
' instances of the same anonymous type, and the values of their
' key properties are equal.
Console.WriteLine(prod3.Equals(prod4))

Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 423}
' The following line displays False, because prod5 and prod6 do not 
' have the same properties.
Console.WriteLine(prod5.Equals(prod6))

Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 423}
' The following line displays True, because prod7 and prod8 are
' instances of the same anonymous type, and the values of their
' key properties are equal. The equality check does not compare the
' values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))

قيم للقراءة فقط

قيم الخصائص الأساسية لا يُمْكن أنْ تُغيّرَ.. على سبيل المثال، في prod8 في المثال السابق Name و Price وتكون الحقول read-only، ولكن OnHand يمكن أن تتغير.

        ' The following statement will not compile, because Name is a key
        ' property and its value cannot be changed.
        ' prod8.Name = "clamps"

        ' OnHand is not a Key property. Its value can be changed.
        prod8.OnHand = 22

أنواع مجهولة من التعبيرات استعلام

تعبيرات الاستعلام ل تتطلب دوماً إنشاء الأنواع المجهولة. عند الإمكان، يَستعملونَ نوعاً حالياً لتقييد بياناتِ العمودَ. يحدث هذا عندما يرجع الاستعلام سجلات بالكامل من المصدر البيانات أو حقل واحد فقط من كل سجل. في أمثلةِ تعليمات برمجية التاليةِ, customers عبارة عن مجموعة من الكائنات من Customer فئة. الـفئة تحتوي العديد من الخصائص ويمكن أن يتضمن واحد أو أكثر منها في نتيجة الاستعلام في أي ترتيب. في المثالين الأوليين, الأنواع المجهولة غير مطلوبة لأن الاستعلامات تحدد عناصر الأنواع المسماة :

  • custs1 يحتوي على مجموعة من سلاسل ، لأن cust.Name هو سلسلة.

    Dim custs1 = From cust In customers
                 Select cust.Name
    
  • custs2 يحتوي على مجموعة من Customer الكائنات لأن كل عنصر customers يتم Customer الكائن, يتم تحديد عنصر بواسطة بشكل استعلام.

    Dim custs2 = From cust In customers
                 Select cust
    

ومع ذلك، الأنواع المسماة المناسبة غير متوفرة دوماً . قد ترغب في تحديد أسماء العملاء والعناوين لغرض واحد, أرقام تعريف العملاء و مواقع لـ آخر، و أسماء العملاء و العناوين و محفوظات ترتيب لـ ثالث. الأنواع المجهولة تُمكّنُك من تحديد أية تركيبة من الخصائص, بأي ترتيب, دون تصريح نوع مسمى أول جديد للاحتفاظ بالنتيجة. بدلاً من ذلك، ينشئ المحول البرمجي نوع مجهول لكُلّ تحويل برمجي للخصائص. يحدد الاستعلام التالي فقط اسم العميل ورقم التعرّيف من كل Customer الكائن في customers. ولذلك، يقوم المحول البرمجي بإنشاء نوع مجهول الذي يحتوي على تلك الخاصيتين الاثنتين فقط .

Dim custs3 = From cust In customers
             Select cust.Name, cust.ID

كلتا الأسماء وأنواع بياناتَ للخصائص في النوع المجهول مأخوذة من الوسيطات إلى Select, cust.Name و cust.ID. الـخصائص في النوع المجهول الذي تم إنشاؤه بواسطة الاستعلام دائماً مفتاح خصائص. عندما custs3 يتم تنفيذه فيما يلي For Each التكرار الحلقي, النتيجة عبارة عن مجموعة من مثيلات من نوع مجهول بخاصيتين مفتاح, Name و ID.

For Each selectedCust In custs3
    Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next

العناصر في المجموعةِ الممثّله مِن قِبل custs3 يَطْبعُ بشدة, و يُمْكِنُ أَنْ تَستعملَ التحسس الذكي للتنقل خلال الخصائص المتوفرةِ و التحقق من الأنواع الخاصة بها.

لمزيد من المعلومات، راجع مقدمة حول LINQ في Visual Basic.

تحديد سواء أَنْ تَستعملَ أنواعَ مجهولةَ

قبل إنشاء كائن كمثيل لفئة المجهول خذ بعين الاعتبار ما إذا كانت هذه هي أفضل خيار. على سبيل المثال، إذا كنت تريد إنشاء كائن مؤقت لاحتواء بيانات ذات الصلة و لَيْسَ لَكَ حاجةُ الى حقول وأساليب أخرى الذي فئة كاملة قَدْ يَحتوي, نوع مجهول حل جيد. أنواع مجهولة أيضاً ملائمة إذا أردت إختيار مختلف من الخصائص لكل تعريف أو إذا أردت تغيير ترتيب الخصائص. ومع ذلك، إذا كان يتضمن مشروعَكَ العديد من الكائنات التي لها نفس الخصائص بترتيب ثابت, يُمْكِنُك تعريفهم أكثر بسهولة باستخدام النوع المسمى بواسطة الدالة الإنشائية الفئة. على سبيل المثال، مع مُنشئ مناسب من السهل تعريف العديد من المثيلات Product الفئة من الإعلان عن مثيلات متعددة من نوع مجهول.

' Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)

' Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}

وهناك فائدة أخرى للأنواع المسماة وهي أن المحول البرمجي يمكن التقاط الخطأ في الطِباعة لاسم خاصية. في الأمثلة السابقة firstProd2, secondProd2، و thirdProd2 مقصودة لِكي تَكُونَ مثيلات من نفس نوع مجهول. ومع ذلك، إذا كنت تريد بطريق الخطأ التصريح thirdProd2 بإحدى الطرق التالية نوعه سَيَكُونُ مختلف عن الذي firstProd2 و secondProd2.

' Dim thirdProd2 = New With {Key .Nmae = "stapler", Key .Price = 5.09}
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}

أكثر أهميه, توجد قيود على إستعمالِ الأنواعِ المجهولةِ التي لا تقم بتطبيق إلى مثيلات الأنواع المسماة. firstProd2, secondProd2، و thirdProd2 مثيلات من نفس نوع مجهول. على الرغم من ذلك، لا يتوفر اسم النوع المجهول المشترك كما لا يمكن أن يظهر في المكان المتوقع لاسم النوع في تعليماتك برمجية. على سبيل المثال، لا يمكن استخدام نوع مجهول لتعريف توقيع أسلوب, لتعريف متغير أو حقل أخر أو في أي تعريف نوع. ونتيجة لذلك، الأنواع المجهول غير مناسبة عندما تقوم بالمشاركة في المعلومات عبر الأساليب.

تعريف النوع المجهول

استجابة إلى تعريف مثيل لنوع مجهول المترجم البرمجي يقوم بإنشاء تعريف فئة جديد الذي يحتوي على الخصائص المحددة.

إذا احتوى النوع المجهول على الأقل على خاصية مفتاح واحدة , يتجاوز تعريف النوع ثلاثة أعضاء موروثة من Object: Equals ، GetHashCode و ToString تعليمات برمجية المنتجة لإختبار المساواةِ و تحديد قيمة شفرة التجزئة يَعتبرُ فقط الخصائص الأساسية . إذا كان النوع المجهول لا يحتوي على خصائص المفاتيح، ToString يتم إبطال. خصائص المسمية بوضوح للنوع المجهول لا تتعارض مع هذه الأساليب التي تم إنشاؤها. ولذلك لا يمكنك استخدام .Equals, .GetHashCode، أو .ToString لتَسْمِية خاصية.

ملفات تعريف النوع المجهول التي تتضمن على خاصية مفتاح واحدة على الأقل و أيضاً تنفذ System.IEquatable<T> الواجهة حيث T هو نوع من النوع المجهول.

لمزيد من المعلومات حول الرمز الذي تم إنشاؤه بواسطة المحول البرمجي و وظائف أساليب التجاوز راجع تعريف النوع المجهول.

راجع أيضًا:

المهام

كيفية القيام بما يلي: تعريف مثيل من النوع المجهول

كيفية القيام بما يلي: أسماء الخصائص الاستدلال و الأنواع في تعريفات نوع مجهول

المرجع

المفتاح (Visual Basic)

المبادئ

مهيئات الكائن أنواع مسماة و مجهولة

استدلال الـنوع المحلي

مقدمة حول LINQ في Visual Basic

مقارنة أنواع مجهولة و مسماة

تعريف النوع المجهول