02-10-12, 08:57 AM
كاتب الموضوع : samerselo
يقدم فيجول ستوديو 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}
كود :
Dim namePriceQuery = From prod In products _
Select prod.Name, prod.Price
كود :
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}
تختلف الخصائص المفتاحية عن العادية بعدة أمور
- تستخدم الخصائص المفتاحية فقط لمقارنة المساواة بين نوعين مجهولين
- لايمكن تغيير قيم الخصائص المفتاحية فهي دائما للقراءة فقط
- فقط الخصائص المفتاحية يتم تضمينها ضمن الـ 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))
لايمكن تغيير قيم الخصائص المفتاحية فمثلا في 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
تعابير الاستعلام لاتتطلب دوما انشاء أنواع مجهولة فعند الامكان يمكنها استخدام نوع موجود ليحمل بيانات العمود وهذا يحدث عندما يعيد الاستعلام إما سجلات كاملة من مصدر البيانات أو حقل واحد من كل سجل ففي المثال التالي يكون 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
كود :
Dim custs3 = From cust In customers _
Select cust.Name, cust.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}
كود :
' 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}
مترجم بتصرف للفائدة