تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الأنواع المجهولة Anonymous Types، من جديد VB 2008
#1
كاتب الموضوع : 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}
حيث يستخدم تعبير الاستعلام التالي الأنواع المجهولة لدمج أعمدة البيانات المحددة بواسطة الاستعلام وبما أنه لايمكنك تحديد نوع النتيجة مقدما بسبب عدم إمكانية التنبؤ بالأعمدة التي يمكن أن يختارها استعلام معين فتمكنك الأنواع المجهولة من كتابة استعلام يختار عدد من الأعمدة بأي ترتيب نريده فيقوم المترجم بإنشاء نوع البيانات الممماثل لتلك الخصائص المحددة بذلك الترتيب المعين. وفي المثال التالي يكون 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 هي متغيرات لنفس النوع المجهول فالمتغير المجهول المشترك غير متوفر ولايمكن توقع ظهوره كنوع معروف في الكود فمثلا يمكن استخدام النوع المجهول لتحديد توقيع الطريقة للتصريح عن حقل متغير وبالنتيجة يكون النوع المجهول غير ملائم لتبادل البيانات عبر الطرائق




مترجم بتصرف للفائدة
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سؤال] اريد كود بالفيجوال بيسك 2008 يقراء سريال المازربورد nabil.1710 5 619 13-06-16, 12:16 AM
آخر رد: محمد سالم المحترف
  طلب اكواد فجوال بيسك دوت نت 2008 shgeen 2 641 24-02-13, 06:42 PM
آخر رد: السندباد المصري
  دمج قاعدة بيانات SQL Server 2008 مع المشروع بالـ VBNET snipercoder 3 2,010 12-02-13, 03:39 PM
آخر رد: wael
  Nullable Value Types في VB2008 oneyemenweb2 0 351 06-10-12, 11:37 PM
آخر رد: oneyemenweb2
  معلومة How Make Data Types To Be Nullable RaggiTech 0 295 06-10-12, 07:51 PM
آخر رد: RaggiTech
  كونترول جديد من مايكروسوفت MsChart Control RaggiTech 1 545 05-10-12, 03:04 PM
آخر رد: RaggiTech
  كود- حساب مواقيت الصلاة Prayer Times في الدوت نت 2008 و 2005 RaggiTech 0 1,465 05-10-12, 01:48 PM
آخر رد: RaggiTech
  نبذة عن Value Types RaggiTech 0 314 05-10-12, 04:39 AM
آخر رد: RaggiTech
  نوع بيانات جديد (تاريخ) RaggiTech 0 434 05-10-12, 03:34 AM
آخر رد: RaggiTech
  ملاحظات هامة عند ترقية مشاريع VB6 إلى VB .net 2008 RaggiTech 0 465 05-10-12, 01:32 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم