สรุป: ภาพรวมของวิธีที่ฟังก์ชันของฉันเปิดเผยฟังก์ชันการทำงานของ .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 ที่ใช้กันทั่วไป ฉันยังเปิดเผยคลาส .NET Framework ระดับสูงใหม่ที่รวมฟังก์ชันการทำงานที่เกี่ยวข้องไว้ใน API ตามงาน
ฉันเปิดเผยฟังก์ชันการทำงานโดยการส่งคืนคลาส .NETFramework ที่สร้างอินสแตนซ์และพร้อมใช้งาน เลื่อนการเรียกไปยังวิธี .NETFramework และส่งคืนคลาสที่สร้างขึ้นแบบไดนามิกที่สามารถใช้เพื่อเข้าถึงรายการในโปรเจ็กต์ของคุณ
สาธารณะโดยตรง
เมื่อใดก็ตามที่เป็นไปได้ My จะทำหน้าที่เป็นกลไกการค้นหาสำหรับคลาสที่มีอยู่ใน .NET Framework และเปิดเผยประเภทเหล่านี้โดยตรง ดูตัวอย่าง My.application.Deployment ต่อไปนี้:
PublicReadOnlyPRpertyDeployment () As_
System.Deployment.ApplicationDeployment
รับ
กลับ_
System.Deployment.ApplicationDeployment.CurrentDeployment
สิ้นสุดรับ
สิ้นสุดคุณสมบัติ
ตัวอย่างอื่นๆ ของการสัมผัสโดยตรง ได้แก่ My.Computer.FileSystem.OpenTextFileReader() (ซึ่งส่งคืน System.IO.StreamReader), My.Application.OpenForms() (ซึ่งส่งคืน System.Windows.Forms.FormsCollection), My.User (ซึ่งส่งคืน System.Security.Principal.IPrincipal) ฯลฯ
รูปร่าง
ฉันยังสามารถส่งคืนคลาสใหม่ที่มี API ตามงานสำหรับการดำเนินการที่ก่อนหน้านี้ทำได้ยากเนื่องจากการค้นหาฟังก์ชันการทำงานนั้นยากและ/หรือต้องใช้หลายอ็อบเจ็กต์เพื่อทำงานร่วมกัน
งานทั่วไปที่ต้องใช้ .NET Framework API ระดับต่ำหรือต้องใช้โค้ดหลายบรรทัดจะง่ายขึ้นอย่างมาก ดูตัวอย่างงานต่อไปนี้เพื่อตรวจสอบว่าการเชื่อมต่อเครือข่ายพร้อมใช้งานหรือไม่:
ImportsSystem.Net.NetworkInformation
PublicReadOnlyPropertyIsAvailable()AsBoolean
รับ
สำหรับEachNetInterfaceAsNetworkInterfaceIn_
NetworkInterface.GetAllNetworkInterfaces()
IfNetInterface.Type<>InterfaceType.Loopback_
AndAlsoNetInterface.Type<>InterfaceType.Tunnel_
และยังมีNetInterface.OperationalStatus=_
OperationalStatus.UpThen
กลับจริง
สิ้นสุดถ้า
ต่อไป
ReturnFalse
สิ้นสุดรับ
สิ้นสุดคุณสมบัติ
โค้ดด้านบนต้องใช้ความรู้โดยละเอียดหลายประเภทในเนมสเปซ System.Net.NetworkInformation เมื่อใช้รูปแบบลักษณะที่ปรากฏ My.Computer.Network จะลดประเภทเหล่านี้และความสัมพันธ์ของประเภทเหล่านี้ให้เป็นโค้ดบรรทัดเดียว: My.Computer.Network.IsAvailable()
การปรากฏตัวยังสามารถรวบรวมฟังก์ชันที่เกี่ยวข้องซึ่งหาได้ยาก ตัวอย่างเช่น My.Computer รวบรวมคุณสมบัติจากคลาสที่แตกต่างกันเพื่อจัดเตรียมชื่อคอมพิวเตอร์และการเข้าถึงหน้าจอ:
PublicReadOnlyPropertyName()AsString
รับ
ReturnSystem.Environment.MachineName
สิ้นสุดรับ
สิ้นสุดคุณสมบัติ
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
รับ
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
สิ้นสุดรับ
สิ้นสุดคุณสมบัติ
ตัวอย่างอื่นๆ ของคลาสใน 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()
EndFunction
ตามแบบแผน คลาสพร็อกซีจะมีพร็อกซีต่อท้ายเสมอ ฉันใช้พรอกซีเมื่อเข้าถึงคลิปบอร์ด ระบบไฟล์ และรีจิสตรี เนื่องจากคลาสพื้นฐานที่พร็อกซีเปิดเผยนั้นประกอบด้วยวิธีการที่ใช้ร่วมกันซึ่งไม่สามารถมองเห็นได้ใน IntelliSense ผู้ใช้ไม่สามารถสร้างอินสแตนซ์คลาสพร็อกซีได้ การทดสอบประสิทธิภาพแสดงให้เห็นว่าการโอนสายผ่านพร็อกซีนั้นไม่สมเหตุสมผล
คลาสที่สร้างแบบไดนามิก
เพื่อให้สอดคล้องกับวัตถุประสงค์ของ "การวางฟังก์ชันการทำงานไว้ที่ปลายนิ้วของคุณ" My ให้การเข้าถึงแบบฟอร์ม บริการบนเว็บ ทรัพยากร และการตั้งค่าที่กำหนดไว้ในโครงการของคุณ ตัวอย่างเช่น หากโปรเจ็กต์ของคุณมีการอ้างอิงถึงบริการเว็บ MapDirections คุณสามารถใช้บริการเว็บได้ทันทีโดยไม่ต้องรู้วิธีเริ่มอินสแตนซ์ของพร็อกซีบริการเว็บ คุณเพียงพิมพ์ข้อความต่อไปนี้: My.WebServices.MapDirections.GetDirections(...)
มันทำงานอย่างไร? คลาสโรงงานถูกสร้างขึ้นโดยคอมไพลเลอร์ที่ส่งคืนอินสแตนซ์ที่สร้างขึ้นอย่างขี้เกียจตามความต้องการสำหรับแบบฟอร์ม บริการเว็บ การตั้งค่า และทรัพยากรในโปรเจ็กต์ของคุณ คลาสโรงงานได้รับการปรับให้ส่งคืนอินสแตนซ์ในลักษณะที่เหมาะสมกับประเภทของโปรเจ็กต์ (exe/dll/web) ที่โค้ดของคุณกำลังทำงานอยู่ ดูส่วน "การร้อยด้าย" สำหรับรายละเอียดเพิ่มเติม
แบบฟอร์มของฉัน
เป็นตัวอย่างของคลาสที่สร้างขึ้นแบบไดนามิก ให้พิจารณา My.Forms คลาสนี้จัดเตรียมไว้ให้คุณและกำหนดวิธีการจากโรงงานสำหรับแต่ละแบบฟอร์มในโครงการของคุณ เมื่อคุณเข้าถึงแบบฟอร์มผ่าน My.Forms.Form1 วิธีการจากโรงงานจะตรวจสอบเพื่อดูว่าอินสแตนซ์ของ Form1 เปิดอยู่แล้วหรือไม่ หากอินสแตนซ์เปิดอยู่แล้ว อินสแตนซ์นั้นจะถูกส่งคืน มิฉะนั้น อินสแตนซ์ของ Form1 จะถูกสร้างขึ้นและส่งคืน รหัสที่สร้างขึ้นสำหรับโครงการที่มี Form1 มีลักษณะดังนี้:
ClassMyForms
'Codeinboldisgenerated โดยคอมไพเลอร์'
Publicm_Form1AsForm1
PublicPropertyForm1()AsForm1
รับ
m_Form1=สร้าง__อินสแตนซ์__(OfForm1)(m_Form1)
Returnm_Form1
สิ้นสุดรับ
ชุด (ByValValueAsForm1)
IfValueIsm_Form1
กลับ
สิ้นสุดถ้า
ถ้าไม่มีคุณค่าก็ไม่มีอะไรแล้ว
ThrowNewArgumentException (_
คุณสมบัติ canonlybesettoNothing.)
สิ้นสุดถ้า
กำจัด__อินสแตนซ์__(OfForm1)(m_Form1)
สิ้นสุดการตั้งค่า
สิ้นสุดคุณสมบัติ
จบคลาส
ฟังก์ชัน Create__Instance__() มีหน้าที่สร้างอินสแตนซ์ของแบบฟอร์มตามความต้องการ จะตรวจสอบว่าแบบฟอร์ม (เก็บไว้ใน m_Form1) ได้รับการอินสแตนซ์หรือไม่ หากแบบฟอร์มได้รับการสร้างอินสแตนซ์แล้ว แบบฟอร์มจะถูกส่งกลับ มิฉะนั้น อินสแตนซ์จะถูกสร้างขึ้นและส่งคืน Create__Instance__() ยังรวบรวมความพยายามในการสร้างแบบฟอร์มแบบเรียกซ้ำ Dispose__Instance__() มีหน้าที่ปิดแบบฟอร์ม
My.Forms ยังมีวิธีการในการแนะนำอินสแตนซ์เริ่มต้นของฟอร์มอีกครั้ง ซึ่งคุณอาจคุ้นเคยจาก Visual Basic เวอร์ชันก่อนหน้า อินสแตนซ์เริ่มต้นทำให้สามารถอ้างอิงอินสแตนซ์ของแบบฟอร์มได้โดยไม่ต้องสร้างอินสแตนซ์ของแบบฟอร์มอย่างชัดเจนก่อน
ตัวอย่างเช่น ใน Visual Basic 6.0 คุณอาจเขียน Form1.Show() แทน:
DimForm1InstanceasForm1
Form1Instance=ฟอร์มใหม่1
Form1Instance.Show()
เนื่องจากคอมไพเลอร์ใน Visual Basic 2005 ใช้ My.Forms เพื่อสร้างอินสแตนซ์เริ่มต้น คุณจึงสามารถเขียน Form1.Show() ได้
My.WebServices
ปัญหาอย่างหนึ่งที่ผู้คนพบเมื่อเขียนโค้ดบริการเว็บคือการพิจารณาว่าคลาสใดที่จะเขียนโค้ด My.WebServices ขจัดกระบวนการกำหนดนี้ และจัดเตรียมอินสแตนซ์ของพร็อกซีบริการเว็บตามความต้องการ
My.WebServices เหมาะที่สุดสำหรับการโทรไปยังบริการเว็บแบบซิงโครนัส รูปแบบรหัสที่สร้างขึ้นเพื่อจัดเตรียมอินสแตนซ์ของพร็อกซีบริการเว็บจะเหมือนกับรูปแบบรหัสที่แสดงเพื่อส่งคืนอินสแตนซ์ของแบบฟอร์ม
การตั้งค่าของฉัน
สิ่งใหม่ใน Visual Basic 2005 คือเครื่องมือออกแบบการตั้งค่า ซึ่งช่วยให้คุณระบุการตั้งค่าแอปพลิเคชันตามแอปพลิเคชันหรือผู้ใช้ได้ ผู้ออกแบบจะสร้างคลาสที่คุณสามารถใช้เพื่อเข้าถึงการตั้งค่าของคุณด้วยวิธีการพิมพ์ที่เข้มงวด คุณสามารถดูตัวอย่างของคลาส MySettings ได้ด้วยการแสดงไฟล์ทั้งหมดใน Solution Explorer และค้นหาไฟล์ MySettings.vb ภายใต้โหนด MySettings.Settings
ต่อไปนี้เป็นตัวอย่างของคุณสมบัติที่สร้างขึ้นเพื่อจัดการการตั้งค่าแอปพลิเคชันชื่อ SampleUserSetting:
การตั้งค่าบางส่วนไม่สามารถสืบทอดได้ClassMySettings
InheritsSystem.Configuration.ApplicationSettingsBase
<System.Diagnostics.DebuggerNonUserCode(),_
System.Configuration.UserScopedSettingAttribute(),_
System.Configuration.DefaultSettingValueAttribute (TryMe)>_
PublicPropertySampleUserSetting()AsString
รับ
ReturnCType (ฉัน (SampleUserSetting), สตริง)
สิ้นสุดรับ
ชุด
ฉัน(SampleUserSetting)=value
สิ้นสุดการตั้งค่า
สิ้นสุดคุณสมบัติ
จบคลาส
คลาสที่สร้างขึ้นจะช่วยยกของหนักให้กับคุณ หากต้องการเข้าถึงการตั้งค่านี้ เพียงพิมพ์:
My.Settings.SampleUserSetting
ทรัพยากรของฉัน
คุณลักษณะใหม่อีกอย่างหนึ่งใน Visual Basic 2005 คือ Resource Designer ซึ่งช่วยให้คุณสามารถเพิ่มทรัพยากรลงในแอปพลิเคชันของคุณได้ ตัวออกแบบทรัพยากรยังสร้างโมดูลที่คุณสามารถใช้เพื่อเข้าถึงทรัพยากรในแอปพลิเคชันของคุณด้วยวิธีการพิมพ์ที่เข้มงวด ตัวอย่างเช่น หากคุณเพิ่มบิตแมปชื่อ Smiley ให้กับโปรเจ็กต์ของคุณ คุณสามารถเข้าถึงบิตแมปได้โดยใช้ My.Resources.Smiley คุณสามารถดูตัวอย่างของโมดูลทรัพยากรที่สร้างขึ้นโดยการแสดงไฟล์ทั้งหมดใน Solution Explorer ของโปรเจ็กต์ตัวอย่าง และค้นหาไฟล์ MyResources.vb ภายใต้โหนด MyResources.resx
ต่อไปนี้เป็นตัวอย่างของโครงการตัวอย่างที่สร้างขึ้นเพื่อส่งคืนคุณสมบัติโรงงานสำหรับทรัพยากร Smiley:
PublicReadOnlyPropertySmiley()AsSystem. Drawing.Bitmap
รับ
ReturnCType(ResourceManager.GetObject(ยิ้ม,_resCulture),_
ระบบ.การวาดภาพ.บิตแมป)
สิ้นสุดรับ
สิ้นสุดคุณสมบัติ
โมดูลทรัพยากรที่พิมพ์อย่างเข้มงวดที่สร้างขึ้นจะจัดการ ID ทรัพยากรที่คำนึงถึงขนาดตัวพิมพ์ ใช้คลาส System.Resources.ResourceManager เพื่อดึงทรัพยากรของคุณ และจัดการรายละเอียดที่เกี่ยวข้องกับการรับ ResourceManager ที่สร้างขึ้นอย่างถูกต้องสำหรับแอปพลิเคชันของคุณ
ในการเข้าถึงบิตแมป Smiley เดียวกันใน VisualBasic2002 หรือ VisualBasic2003 คุณต้องใส่บิตแมปลงในไฟล์ .resx ก่อน ซึ่งเป็นเรื่องยาก อีกวิธีหนึ่งคือการใส่ไว้ในโปรเจ็กต์เป็นทรัพยากรแบบฝัง และคุณต้องจำไว้ว่าต้องเปลี่ยนการดำเนินการสร้างในตารางคุณสมบัติของทรัพยากรที่จะเป็นทรัพยากรแบบฝัง ด้วยวิธีนี้โค้ดที่คุณเขียนควรมีลักษณะดังนี้:
DimCurrentAssemblyAsReflection.Assembly=_
การสะท้อน การประกอบ GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream (_
WindowsApplication2.Smiley.bmp)
DimSmileyBitmapas Drawing.Bitmap=NewBitmap(BitMapStream)
มีรายละเอียดที่สำคัญบางประการในโค้ดนี้ที่คุณต้องรู้ คุณต้องรู้เพื่อรับแอสเซมบลีที่ดำเนินการอยู่ในปัจจุบันและเรียกใช้ GetManifestResourceStream() คุณต้องจำไว้ว่าต้องระบุชื่อทรัพยากรด้วยชื่อเนมสเปซรูท คุณต้องได้รับอนุญาตจากตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เนื่องจากชื่อที่ส่งไปยัง GetManifestResourceStream() จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คุณต้องรู้ว่าจะกำหนดคลาสสตรีมได้ที่ไหนเพื่อให้คุณสามารถจับค่าที่ส่งคืนของ GetManifestResource ในวัตถุสตรีมได้ คุณต้องรู้วิธีสร้างบิตแมปจากกระแสข้อมูล คุณอาจรู้สึกหงุดหงิดเมื่อพยายามพิจารณาว่าเหตุใด BitMapStream จึงส่งคืนสิ่งใดเสมอเนื่องจากปัญหาข้อใดข้อหนึ่งข้างต้น
Visual Basic 2005 แก้ไขปัญหาแรกด้วยการจัดหา ResourceEditor ซึ่งทำให้ง่ายต่อการวางทรัพยากรใหม่หรือทรัพยากรที่มีอยู่ในไฟล์ .resx ทรัพยากรเหล่านี้สามารถเข้าถึงได้ง่ายโดยใช้ My สิ่งที่คุณต้องทำคือเขียนสิ่งต่อไปนี้:
DimSmileyBitmapas Drawing.Bitmap=My.Resources.Smiley
การทำเกลียว
อินสแตนซ์ของคลาสที่มีอยู่ใน My ได้รับการเปิดเผยในลักษณะที่ช่วยบรรเทาปัญหาเธรด เนื่องจากอินสแตนซ์ของอ็อบเจ็กต์ของฉันถูกจัดเตรียมไว้แบบต่อเธรด นั่นคือ อินสแตนซ์ของ My.Computer ที่ส่งคืนบนเธรด 1 แตกต่างจากอินสแตนซ์ของ My.Computer ที่ส่งคืนบนเธรด 2 ซึ่งหมายความว่าคุณไม่จำเป็นต้องเขียนโค้ดการซิงโครไนซ์เมื่อใช้อ็อบเจ็กต์ของฉัน
ในเว็บแอปพลิเคชัน อินสแตนซ์ที่ส่งคืนจาก My จะถูกจัดเก็บตามคำขอ
สรุป
เราได้ดูว่า My เปิดเผยคลาส .NET Framework อย่างไร และวิธีสร้างคลาสที่สร้างขึ้นแบบไดนามิกเพื่อเสริม My
สุดท้ายนี้ My จะลดจำนวนบรรทัดโค้ดที่คุณต้องเขียนและให้สิทธิ์ในการเข้าถึงฟังก์ชันที่ใช้บ่อย โดยทำสิ่งนี้ด้วยวิธีที่มีประสิทธิภาพ เชื่อถือได้ และปลอดภัยต่อเธรด ในสภาพแวดล้อมที่ประสิทธิภาพการทำงานของโปรแกรมเมอร์มีความสำคัญเป็นพิเศษ My สามารถช่วยให้คุณทำงานเสร็จได้อย่างรวดเร็วและมีประสิทธิภาพยิ่งขึ้น
-