الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الأنواع المجهولة Anonymous Types

مغلق
بدأه محمد سامر أبو سلو في 30 نوفمبر 2007 · 1 رد · 2,510 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

يقدم فيجول ستوديو 2008 الأنواع المجهولة anonymous types والتي تمكنك من إنشاء الأغراض Objects بدون كتابة تعريف فئة Class definition من أجل نوع البيانات وعوضا عن ذلك يولد المترجم الفئة من أجلك ولن يكون للفئة اسما قابلا للاستخدام حيث تكون هذه الفئات موروثة مباشرة من Object وتمتلك الخصائص التي تحددها عند تعريف الغرض Object وبما أن نوع البيانات لم يتم تحديده يتم الإشارة إليه على أنه نوع مجهول anonymous type. حيث يصرح المثال التالي عن المتغير product كمتغير من النوع anonymous type ممتلكا الخاصيتين Name و Price

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

حيث يستخدم تعبير الاستعلام التالي الأنواع المجهولة لدمج أعمدة البيانات المحددة بواسطة الاستعلام وبما أنه لايمكنك تحديد نوع النتيجة مقدما بسبب عدم إمكانية التنبؤ بالأعمدة التي يمكن أن يختارها استعلام معين فتمكنك الأنواع المجهولة من كتابة استعلام يختار عدد من الأعمدة بأي ترتيب نريده فيقوم المترجم بإنشاء نوع البيانات الممماثل لتلك الخصائص المحددة بذلك الترتيب المعين. وفي المثال التالي يكون Products عبارة عن قائمة من أغراض Product وكل منها يمتلك خصائص عديدة بحيث يحمل المتغير 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

تعريف نوع مجهول Declaring an Anonymous Type

تعريف متغير من نوع مجهول يستخدم قائمة بناء لتحديد خصائص ذلك النوع بحيث يمكنك تحديد الخصائص فقط عند الإعلان عن النوع المجهول ولايمكن استخدام بقية عناصر الفئات مثل الطرائق والأحداث في الأنواع المجهولة ففي المثال التالي يكون 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}

فإن قمت بتحديد الخصائص كخصائص مفتاحية key properties أصبح بإمكانك استخدامها لمقارنة نوعين مجهولين هل هما متساويين أم لا ومع ذلك فقيم الخصائص المفتاحية لايمكن تغييرها فهي للقراءة فقط. مع ملاحظة أن التصريح عن نوع مجهول يماثل التصريح عن نوع مسمى باستخدام باني الغرض object initializer

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

الخصائص المفتاحية Key Properties

تختلف الخصائص المفتاحية عن العادية بعدة أمور

- تستخدم الخصائص المفتاحية فقط لمقارنة المساواة بين نوعين مجهولين

- لايمكن تغيير قيم الخصائص المفتاحية فهي دائما للقراءة فقط

- فقط الخصائص المفتاحية يتم تضمينها ضمن الـ Hash Code الذي يولده المترجم من أجل الأنواع المجهولة

المساواة Equality

تكون متغيرات الأنواع المجهولة متساوية عندما تكون متغيرات لنفس النوع المجهول ويقوم المعالج بمعاملة متغيرين كمتغيرين من نفس النوع إذا توفرت فيهما الشروط التالية

- تم التصريح عنهما في نفس المجمع

- تمتلك خصائصهما نفس الاسم والنوع وتم التصريح عنها بنفس الترتيب وتكون مقارنة الأسماء غير حساسة لحالة الأحرف

- نفس الخصائص فيها محددة كخصائص أساسية

- يمتلك كل نوع خاصية أساسية واحدة على الأقل

والتصريح عن نوع مجهول لايمتلك أي خاصية مفتاحية يكون مساويا لنفسه فقط

' 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))

القيم القابلة للقراءة فقط Read-Only Values

لايمكن تغيير قيم الخصائص المفتاحية فمثلا في prod8 في المثال السابق الحقول Name و Price قابلة للقراءة فقط في حين أن الحقل OnHamd يمكن تغيير قيمته

' 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

الأنواع المجهولة من تعابير الاستعلام Anonymous Types from Query Expressions

تعابير الاستعلام لاتتطلب دوما انشاء أنواع مجهولة فعند الامكان يمكنها استخدام نوع موجود ليحمل بيانات العمود وهذا يحدث عندما يعيد الاستعلام إما سجلات كاملة من مصدر البيانات أو حقل واحد من كل سجل ففي المثال التالي يكون Customers عبارة عن مجموعة فئات Customer والفئة تمتلك العديد من الخصائص بحيث يمكنك تضمين واحدة أو أكثر من هذه الخصائص في نتائج الاستعلام وبأي ترتيب تريده ففي المثالين الأوليين لايوجد حاجة لأي نوع مجهول لأن الاستعلام يجلب عناصر من انواع معروفة ف Custs1 يكون من النوع string لأن cust.Name من النوع String و Custs2 هو مجموعة من الأغراض Customers لأن كل عنصر في Customers هو غرض Customer وكامل العنصر تم جلبه بواسطة الاستعلام

Dim custs1 = From cust In customers _
			 Select cust.Name

Dim custs2 = From cust In customers _
			 Select cust

ومع ذلك فالأنواع المسماة لاتكون دائما متوفرة حيث يمكنك الاستعلام عن Names و Addresses من أجل هدف معين و ID و Numbers و Location من أجل هدف آخر فهنا تمكنك الأنواع المجهولة من اختيار أية تركيبة من الخصائص وبأي ترتيب بدون أن تضطر في البداية للتصريح عن نوع مسمى جديد ليحمل النتيجة وبدلا عن ذلك يقوم المترجم بإنشاء نوع مجهول لكل تركيبة من الخصائص فمثلا الاستعلام التالي يحدد فقط Name و ID من كل غرض Customer في customersومن أجل ذلك يقوم بإنشاء نوع مجهول من تلك الخصائص

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

وكل من الاسم والنوع العائدين لخصائص النوع المجهول يتم أخذها من بارامترات الاستعلام cust.Name و Cust.Id وتكون خصائص النوع المجهول التي ينشئها الاستعلام خصائص مفتاحية دوما وعند تنفيذ cust3 في حلقة For...Each التالية تكون النتيجة هي مجموعة أنواع مجهولةتمتلك خاصيتين مفتاحيتين Name و ID

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

تحديد متى نستخدم الأنواع المجهولة

قبل أن تقوم بالتصريح عن غرض بأنه من نوع مجهول يجب عليك التفكير فيما إذا كان هذا الخيار هو الأفضل فمثلا إن كنت تريد إنشاء غرض مؤقت ليحتوي بعض حقول المعلومات ولست بحاجة إلى بقية الحقول والطرائق التي تحتويها الفئة الكاملة يكون عندها النوع المجهول حلا جيدا وتكون الأنواع المجهولة ملائمة عندما تريد انتقاء مجموعة مختلفة من الخصائص عند كل تصريح أو إن كنت تريد تغيير ترتيب هذه الخصائص وإن كان مشروعك يحتوي على عدة أغراض تحمل نفس الخصائص بترتيب ثابت يمكنك عندها التصريح عنهم بسهولة باستخدام الأنواع المسماة باستخدام باني فئة فعندها باستخدام باني ملائم يمكن تعريف عدة متغيرات من الفئة 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 هي متغيرات لنفس النوع المجهول فالمتغير المجهول المشترك غير متوفر ولايمكن توقع ظهوره كنوع معروف في الكود فمثلا يمكن استخدام النوع المجهول لتحديد توقيع الطريقة للتصريح عن حقل متغير وبالنتيجة يكون النوع المجهول غير ملائم لتبادل البيانات عبر الطرائق

مترجم بتصرف للفائدة

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 30 نوفمبر 2007 في 02:06

1

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

مقدمة جميلة لبعض من امكانيات الفيجوال 2008 أخي سامر

و اسمح لي ان أحيل الاخوة الاعضاء ممن يهتمون بموضوع الفيجوال 2008 على مقالة كنت قد كتبتها حول جديد الفيجوال 9 (2008)

نظرة على جديد الفيجوال بيسك 9 - الجزء الأول

نظرة على جديد الفيجوال بيسك 9 - الجزء الثاني

هذا الموضوع مغلق.

مواضيع مشابهة