سؤال

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

هل كانت مفيدة؟

المحلول

الأنواع المجهولة لا علاقة لها بتصميم الأنظمة أو حتى على مستوى الفصل.إنها أداة يستخدمها المطورون عند البرمجة.

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

على سبيل المثال:

var query = from item in database.Items
            // ...
            select new { Id = item.Id, Name = item.Name };

return query.ToDictionary(item => item.Id, item => item.Name);

لا أحد يهتم بالنوع المجهول.إنه هناك لذا لا يتعين عليك الإعلان عن فصل آخر.

نصائح أخرى

من LINQ أثناء العمل (صفحة 76 القسم 2.6.3):

...الأنواع المجهولة [هي] أداة رائعة للحصول على نتائج مؤقتة سريعة وبسيطة.لا نحتاج إلى الإعلان عن الفئات للاحتفاظ بنتائج مؤقتة بفضل الأنواع المؤقتة.

إنها مفيدة بشكل أساسي للاحتفاظ بالمعلومات في النطاق المحلي مؤقتًا.أي شيء أكثر يتطلب استخدام التفكير ويمكن أن يصبح مشكلة كبيرة.المثال الذي قدموه في الكتاب المقتبس أعلاه هو كتابي لتعزية المعرف والاسم ومقدار الذاكرة التي تستهلكها كل عملية قيد التشغيل.يقومون بإنشاء نوع مجهول، وإضافته إلى القائمة (كل عبارة واحدة) ثم استخدام ObjectDumper لإخراجه.لذلك لم يعد الكود يحتاج إلى فئة معلنة بشكل منفصل للاحتفاظ بالمعرف والاسم والذاكرة المستخدمة ولكن تم الإعلان عنها جميعًا ضمنيًا مما أدى إلى خفض عدد الأسطر إلى 4:

var pl = new List<Object>();
foreach(var p in Process.GetProcesses())
  pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64});
ObjectDumper.Write(pl);

الاستخدام الأكثر شيوعًا للأنواع المجهولة هو تحديد الإسقاطات في استعلام LINQ إلى SQL.

هذا الاستعلام

from x in db.Table1 select new {x.Column1, Alias2=x.Column2}

سيتم تحويله إلى SQL هذا:

SELECT Column1, Column2 AS Alias2 FROM Table1

باستخدام الأنواع المجهولة، يمكنك إنشاء توقعات مخصصة دون تحديد النوع الخاص بها مسبقًا.سيحدد المترجم النوع لك.

عند إنشاء أنواع لأغراض "الاستخدام والرمي".يبدو أن هذا قد جاء بسبب LINQ.يبدو أنها طريقة لإنشاء بنيات تحتوي على حقول سريعة لاستعلام LINQ.إرجاع بنية/نوع مع الحقول المحددة فقط.إذا لم يكن الأمر كذلك، فسيتعين عليك الإعلان عن نوع .Net لكل مجموعة فريدة من الحقول التي ترغب في استردادها.

استخدامها مع Linq.

من المهم أن تعرف أن LINQ لا يجبرك على استخدام أنواع مجهولة.يمكنك أيضًا كتابة إنشاءات كائن عادية بعد التحديد.

var query = from item in database.Items
// ...
select new Person(item.id, item.Name)

هذا يمنعك من برمجة الانعكاس القبيح.

@ووتر :

var query = from item in database.Items
select new Person
{
ID =item.id,
NAME= item.Name
};

حيث يعد المعرف والاسم ملكية حقيقية لفئة الشخص الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top