ملخص: نظرة عامة حول كيفية قيام وظيفتي بالكشف عن وظائف .NET Framework، بما في ذلك الفئات المتوفرة والفئات التي تم إنشاؤها ديناميكيًا والترابط.
ملاحظة: تستند هذه المقالة ونموذج التعليمات البرمجية إلى الإصدار التجريبي من Microsoft Visual Studio 2005 (الذي كان يحمل الاسم الرمزي سابقًا "Whidbey"). جميع المعلومات الواردة هنا عرضة للتغيير. يتطلب نموذج المشروع Visual Studio2005Beta1 أو أعلى.
مقدمة
My هي ميزة جديدة في Visual Basic 2005 تضع الوظائف المستخدمة بشكل متكرر في متناول يدك وتقلل من عدد أسطر التعليمات البرمجية التي يتعين عليك كتابتها. يقوم بذلك بطريقة فعالة وموثوقة وآمنة للخيط. في بيئة تكون فيها إنتاجية المبرمجين ذات أهمية خاصة، يمكن أن يساعدك My في إكمال عملك بشكل أسرع. وهذا هو جوهر Visual Basic.
الغرض من هذه المقالة هو استكشاف كيفية استخدام My للوصول إلى وظائف .NET Framework وعناصره الموجودة في مشروعك.
تتوفر فئات .NETFramework من My
نظرًا لوجود الكثير من العناصر في .NET Framework، قد يكون من الصعب العثور على الوظيفة التي تحتاجها. لحل هذه المشكلة، يوفر My نقاط دخول إلى فئات ووظائف .NET Framework شائعة الاستخدام. يعرض My أيضًا فئات .NET Framework جديدة عالية المستوى تعمل على تجميع الوظائف ذات الصلة في واجهات برمجة التطبيقات القائمة على المهام.
وظائف الكشف الخاصة بي عن طريق إرجاع فئة .NETFramework التي تم إنشاء مثيل لها وجاهزة للاستخدام، وتأجيل الاستدعاءات إلى أساليب .NETFramework، وإرجاع الفئات التي تم إنشاؤها ديناميكيًا والتي يمكن استخدامها للوصول إلى العناصر الموجودة في مشروعك.
العامة مباشرة
كلما كان ذلك ممكنًا، يعمل My كآلية اكتشاف للفئات الموجودة في .NET Framework ويكشف عن هذه الأنواع مباشرة. راجع مثال My.application.Deployment التالي:
PublicReadOnlyPRpertyDeployment()As_
System.Deployment.ApplicationDeployment
يحصل
يعود_
System.Deployment.ApplicationDeployment.CurrentDeployment
EndGet
EndProperty
تشمل الأمثلة الأخرى للتعرض المباشر My.Computer.FileSystem.OpenTextFileReader() (الذي يُرجع System.IO.StreamReader)، My.Application.OpenForms() (الذي يُرجع System.Windows.Forms.FormsCollection)، My.User (الذي يُرجع System.Security.Principal.IPrincipal)، وما إلى ذلك.
مظهر
يمكن لـ My أيضًا إرجاع فئات جديدة توفر واجهة برمجة تطبيقات قائمة على المهام لتنفيذ العمليات التي كان من الصعب تنفيذها في السابق لأن العثور على الوظيفة كان صعبًا و/أو يتطلب كائنات متعددة للعمل معًا.
تم تبسيط المهام الشائعة التي تتطلب استخدام واجهة برمجة التطبيقات .NET Framework API ذات المستوى المنخفض أو التي تتطلب عدة أسطر من التعليمات البرمجية إلى حد كبير. راجع مثال المهمة التالي لتحديد ما إذا كان اتصال الشبكة متاحًا:
ImportsSystem.Net.NetworkInformation
PublicReadOnlyPropertyIsAvailable()AsBoolean
يحصل
ForEachNetInterfaceAsNetworkInterfaceIn_
NetworkInterface.GetAllNetworkInterfaces()
IfNetInterface.Type<>InterfaceType.Loopback_
AndAlsoNetInterface.Type<>InterfaceType.Tunnel_
AndAlsoNetInterface.OperationalStatus=_
OperationalStatus.UpThen
عودة صحيح
EndIf
التالي
إرجاعخطأ
EndGet
EndProperty
يتطلب الكود أعلاه معرفة تفصيلية بعدة أنواع في مساحة الاسم System.Net.NetworkInformation. باستخدام نمط المظهر، يقوم My.Computer.Network بتقليل هذه الأنواع وعلاقاتها إلى سطر واحد من التعليمات البرمجية: My.Computer.Network.IsAvailable().
يمكن للمظاهر أيضًا أن تجمع ببساطة الوظائف ذات الصلة التي قد يكون من الصعب العثور عليها. على سبيل المثال، يجمع My.Computer خصائص من فئات مختلفة لتوفير اسم الكمبيوتر والوصول إلى الشاشة:
PublicReadOnlyPropertyName()AsString
يحصل
ReturnSystem.Environment.MachineName
EndGet
EndProperty
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
يحصل
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
EndGet
EndProperty
تتضمن الأمثلة الأخرى للفئات الموجودة في My والتي تجمع الوظائف ذات الصلة من أنواع .NET Framework المتعددة، My.Application، وMy.Computer، وMy.Computer.FileSystem، وMy.Computer.Info، وMy.Application.Info.
فئة الوكيل
فئة الوكيل هي فئة "رفيعة" للغاية تقوم بإعادة توجيه كافة الاستدعاءات إليها إلى الكائن الأساسي. على سبيل المثال، إذا قمت باستدعاء My.Computer.Clipboard.GetText()، فإنك في الواقع تتصل بأسلوب فئة الوكيل ClipboardProxy.GetText()، المحدد على النحو التالي:
PublicFunctionGetText()AsString
ReturnClipboard.GetText()
وظيفة النهاية
وفقًا للاتفاقية، تحتوي فئات الوكيل دائمًا على اللاحقة Proxy. يستخدم My الوكلاء عند الوصول إلى الحافظة ونظام الملفات والتسجيل لأن الفئات الأساسية التي يعرضها الوكلاء تتكون من طرق مشتركة غير مرئية في IntelliSense. لا يمكن للمستخدم إنشاء مثيل لفئة الوكيل. أظهر اختبار الأداء أن إعادة توجيه المكالمات عبر الوكيل ليس له أي معنى.
الطبقات التي تم إنشاؤها ديناميكيا
تماشيًا مع غرض "وضع الوظائف في متناول يدك"، يوفر My إمكانية الوصول إلى النماذج وخدمات الويب والموارد والإعدادات المحددة في مشروعك. على سبيل المثال، إذا كان مشروعك يحتوي على مرجع لخدمة الويب MapDirections، فيمكنك استخدام خدمة الويب على الفور دون الحاجة إلى معرفة كيفية بدء مثيل وكيل خدمة الويب. ما عليك سوى كتابة ما يلي: My.WebServices.MapDirections.GetDirections(...)
كيف يعمل هذا؟ يتم إنشاء فئات المصنع بواسطة مترجم يقوم بإرجاع المثيلات التي تم إنشاؤها بتكاسل عند الطلب للنماذج وخدمات الويب والإعدادات والموارد في مشروعك. يتم تكييف فئة المصنع لإرجاع المثيلات بطريقة مناسبة لنوع المشروع (exe/dll/web) الذي يتم تشغيل التعليمات البرمجية الخاصة بك فيه. راجع قسم "الخيوط" لمزيد من التفاصيل.
My.Forms
كمثال للفئة التي تم إنشاؤها ديناميكيًا، فكر في My.Forms. يتم توفير هذه الفئة لك وتحدد طرق المصنع لكل نموذج في مشروعك. عند الوصول إلى النموذج من خلال My.Forms.Form1، تتحقق طريقة المصنع لمعرفة ما إذا كان مثيل Form1 مفتوحًا بالفعل. إذا كان المثيل مفتوحًا بالفعل، فسيتم إرجاع هذا المثيل. وإلا، يتم إنشاء مثيل Form1 وإرجاعه. يبدو الكود الذي تم إنشاؤه للمشروع الذي يحتوي على Form1 كما يلي:
ClassMyForms
'الكود بالخط العريض تم إنشاؤه بواسطة المترجم
Publicm_Form1AsForm1
PublicPropertyForm1()AsForm1
يحصل
m_Form1=إنشاء__مثيل__(OfForm1)(m_Form1)
Returnm_Form1
EndGet
تعيين (ByValValueAsForm1)
IfValueIsm_Form1
يعود
EndIf
إذا لم تكن القيمة لا شيء إذن
ThrowNewArgumentException(_
الخاصية يمكن فقط تعيينها على لا شيء.)
EndIf
التخلص__المثيل__(OfForm1)(m_Form1)
EndSet
EndProperty
فئة النهاية
تعتبر وظيفة Create__Instance__() مسؤولة عن إنشاء مثيلات النموذج عند الطلب. فهو يتحقق مما إذا كان قد تم إنشاء النموذج (المخزن في m_Form1). إذا تم بالفعل إنشاء مثيل للنموذج، فسيتم إرجاع النموذج. وبخلاف ذلك، سيتم إنشاء مثيل وإرجاعه. يلتقط Create__Instance__() أيضًا محاولات إنشاء النماذج المتكررة. Dispose__Instance__() هو المسؤول عن إغلاق النموذج.
يوفر My.Forms أيضًا أسلوبًا لإعادة تقديم مثيل افتراضي للنموذج، والذي قد تكون على دراية به من الإصدارات السابقة من Visual Basic. تتيح المثيلات الافتراضية إمكانية الإشارة إلى مثيل نموذج دون إنشاء مثيل للنموذج بشكل صريح أولاً.
على سبيل المثال، في Visual Basic 6.0، ربما تكون قد كتبت Form1.Show() بدلاً من ذلك:
DimForm1InstanceasForm1
Form1Instance=newForm1
Form1Instance.Show()
لأن المحول البرمجي في Visual Basic 2005 يستخدم My.Forms لإنشاء المثيلات الافتراضية، يمكنك فقط كتابة Form1.Show().
خدمات الويب الخاصة بي
إحدى الصعوبات التي يواجهها الأشخاص عند برمجة خدمات الويب هي تحديد الفئة التي سيتم الترميز وفقًا لها. تتخلص My.WebServices من عملية التحديد هذه وتوفر مثيلات لوكلاء خدمة الويب عند الطلب.
My.WebServices هو الأنسب للمكالمات المتزامنة لخدمات الويب. نمط التعليمات البرمجية الذي تم إنشاؤه لتوفير مثيل لوكيل خدمة الويب هو نفس نمط التعليمات البرمجية الموضح لإرجاع مثيل النموذج.
إعداداتي
الجديد في Visual Basic 2005 هو مصمم الإعدادات، الذي يسمح لك بتحديد إعدادات التطبيق على أساس التطبيق أو المستخدم. يقوم المصمم بإنشاء فئة يمكنك استخدامها للوصول إلى إعداداتك بطريقة مكتوبة بقوة. يمكنك مشاهدة مثال لفئة MySettings من خلال إظهار كافة الملفات في Solution Explorer والبحث عن ملف MySettings.vb ضمن عقدة MySettings.Settings.
ما يلي هو مثال للخاصية التي تم إنشاؤها لإدارة إعداد تطبيق يسمى SampleUserSetting:
PartialNotInheritableClassMySettings
InheritsSystem.Configuration.ApplicationSettingsBase
<System.Diagnostics.DebuggerNonUserCode(),_
System.Configuration.UserScopedSettingAttribute(),_
System.Configuration.DefaultSettingValueAttribute(TryMe)>_
PublicPropertySampleUserSetting()AsString
يحصل
ReturnCType(Me(SampleUserSetting)،سلسلة)
EndGet
تعيين
Me(SampleUserSetting)=value
EndSet
EndProperty
فئة النهاية
تقوم الفئات التي تم إنشاؤها بكل العمل الثقيل نيابةً عنك. للوصول إلى هذا الإعداد، فقط اكتب:
My.Settings.SampleUserSetting
الموارد الخاصة بي
هناك ميزة جديدة أخرى في Visual Basic 2005 وهي "مصمم الموارد"، والتي تمكنك من إضافة موارد إلى التطبيق الخاص بك. يقوم مصمم الموارد أيضًا بإنشاء وحدة نمطية يمكنك استخدامها للوصول إلى الموارد في التطبيق الخاص بك بطريقة مكتوبة بقوة. على سبيل المثال، إذا قمت بإضافة صورة نقطية باسم Smiley إلى مشروعك، فيمكنك الوصول إلى الصورة النقطية باستخدام My.Resources.Smiley. يمكنك مشاهدة مثال لوحدة الموارد التي تم إنشاؤها عن طريق عرض كافة الملفات في Solution Explorer الخاص بالمشروع النموذجي والبحث عن ملف MyResources.vb ضمن عقدة MyResources.resx.
ما يلي هو مثال لمشروع نموذجي تم إنشاؤه لإرجاع خاصية مصنع لمورد Smiley:
PublicReadOnlyPropertySmiley()AsSystem.Drawing.Bitmap
يحصل
ReturnCType(ResourceManager.GetObject(Smiley,_resCulture),_
النظام. الرسم. الصورة النقطية)
EndGet
EndProperty
تتعامل وحدة الموارد المكتوبة بقوة مع معرفات الموارد الحساسة لحالة الأحرف، وتستخدم فئة System.Resources.ResourceManager لاسترداد مواردك، وتدير التفاصيل المتعلقة بإنشاء ResourceManager بشكل صحيح لتطبيقك.
للوصول إلى نفس الصورة النقطية لـ Smiley في VisualBasic2002 أو VisualBasic2003، عليك أولاً وضع الصورة النقطية في ملف .resx، وهو أمر صعب. هناك طريقة أخرى وهي وضعها في المشروع كمورد مضمن وعليك أن تتذكر تغيير إجراء الإنشاء في شبكة خصائص المورد الذي سيكون المورد المضمن. بهذه الطريقة، يجب أن يبدو الكود الذي تكتبه كما يلي:
DimCurrentAssemblyAsReflection.Assembly=_
Reflection.Assembly.GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream(_
WindowsApplication2.Smiley.bmp)
DimSmileyBitmapasDrawing.Bitmap=NewBitmap(BitMapStream)
هناك بعض التفاصيل المهمة في هذا الرمز التي تحتاج إلى معرفتها. عليك أن تعرف كيفية الحصول على التجميع الذي يتم تنفيذه حاليًا واستدعاء GetManifestResourceStream() عليه. يجب أن تتذكر تأهيل أسماء الموارد باسم مساحة الاسم الجذر. يجب أن تحصل على إذن الحالة لأن الاسم الذي تم تمريره إلى GetManifestResourceStream() حساس لحالة الأحرف. يجب أن تعرف مكان تحديد فئة الدفق حتى تتمكن من التقاط القيمة المرجعة لـ GetManifestResource في كائن الدفق. يجب أن تعرف كيفية إنشاء صورة نقطية من الدفق. قد تواجه إحباطًا عند محاولة تحديد سبب إرجاع BitMapStream دائمًا لأي شيء بسبب إحدى المشكلات المذكورة أعلاه.
يعمل Visual Basic 2005 على حل المشكلة الأولى من خلال توفير ResourceEditor، الذي يسهل وضع الموارد الجديدة أو الموجودة في ملفات .resx. يمكن بعد ذلك الوصول بسهولة إلى هذه الموارد باستخدام My. كل ما عليك فعله هو كتابة ما يلي:
DimSmileyBitmapasDrawing.Bitmap=My.Resources.Smiley
خيوط
يتم عرض مثيلات الفئة المتوفرة في My بطريقة تخفف من مشكلات الترابط، لأنه يتم توفير مثيلات الكائنات الخاصة بي على أساس كل مؤشر ترابط. أي أن مثيل My.Computer الذي تم إرجاعه في مؤشر الترابط 1 يختلف عن مثيل My.Computer الذي تم إرجاعه في مؤشر الترابط 2. هذا يعني أنك لست مضطرًا إلى كتابة رمز المزامنة عند استخدام الكائن الخاص بي.
في تطبيق الويب، يتم تخزين المثيل الذي تم إرجاعه من My عند الطلب.
ملخص
لقد نظرنا في كيفية كشف My لفئات .NET Framework وكيف يمكن إنشاء الفئات التي تم إنشاؤها ديناميكيًا لتكملة My.
وأخيرًا، يقلل My من عدد أسطر التعليمات البرمجية التي يتعين عليك كتابتها ويوفر الوصول إلى الوظائف شائعة الاستخدام. يقوم بذلك بطريقة فعالة وموثوقة وآمنة للخيط. في بيئة تكون فيها كفاءة عمل المبرمجين ذات أهمية خاصة، يمكن أن يساعدك برنامج My على إكمال عملك بسرعة وفعالية أكبر.
->