|
ZaΦßteΦnφk |
PokroΦil² |
Profesionßl |
|||||
|
|
|
||||||
Prostor
pro experimentovßnφ Programßtorskß laborato° |
||||||||
|
|
Budete pot°ebovat
p°ibli₧n∞ 70 minut |
|
OperaΦnφ systΘm
pou₧it² v p°φsp∞vku: Windows 2000 V²vojovΘ nßstroje:
Visual Studio .NET |
||||
|
Ukßzka mφchßnφ programovacφch
jazyk∙ platformy .NET
(Visual Basic .NET a Visual
C# .NET)
Skalnφ p°φznivci naÜφ programovacφ rubriky si
jist∞ vzpomenou, ₧e problematice mφchanφ programovacφch jazyk∙ jsme se ji₧
v∞novali. Tehdy bylo naÜφm spoleΦn²m cφlem vytvo°enφ dynamicky linkovanΘ
knihovny (DLL) v jazyku Visual C++ a poslΘze jejφ vyu₧itφ v prost°edφ
Visual Basicu. V tomto tipu si na muÜku vezmeme dalÜφho zßstupce
programovacφch jazyk∙ platformy .NET, kter²m je zcela nov² a pln∞ objektov∞ orientovan²
Visual C# .NET.
C# p°edstavuje dalÜφ evoluΦnφ Φlßnek ve v²voji
programovacφch jazyk∙, zßkladem kter²ch byl populßrnφ, i kdy₧ pro mnoho
programßtor∙ znaΦn∞ obtφ₧n² jazyk C a poslΘze takΘ C++. Ti z vßs, kte°φ
n∞kdy pracovali s Visual C++ a jeho IDE, jist∞ uznajφ, ₧e nejv∞tÜφm
problΘmem, zejmΘna v zaΦßtcφch, byla absence pln∞ vizußlnφho prost°edφ pro
nßvrh aplikacφ ve stylu Windows. Dobrou zprßvou je, ₧e p°i programovßnφ ve
Visual C# .NET ji₧ nebudete odkßzßni jenom na psanφ programovacφch smyΦek, ale
m∙₧ete vyu₧φt stejnΘ IDE, na jakΘ jste zvyklφ z VB .NET. Ve vÜeobecnosti
by bylo mo₧nΘ prohlßsit, ₧e jazyk C# je velmi vhodn²m kandidßtem na to, abyste
se pokusili porozum∞t alespo≥ zßklad∙m prßce s nφm. Nejenom, ₧e vßm nabφzφ
vÜechno ädobrΘô ze sv∞ta C a C++, ale p°idßvß mnohΘ prvky a programovΘ
konstrukce, kterΘ jsou vßm, jako profesionßlnφm programßtor∙m ve VB .NET,
v mnoha ohledech znßmΘ.
V nßsledujφcφ p°φpadovΘ studii si
ukß₧eme, jak lze spojit sφlu Visual Basicu a C#. NaÜφm hlavnφm zßjmem bude vytvo°enφ
t°φdy v prost°edφ C#. Tato t°φda bude obsahovat jednu metodu, kterou
pozd∞ji zavolßme z VB .NET. Pus¥me se tedy do prßce.
Tvorba projektu typu Class Library ve Visual C#
Obr. 1 û V²b∞r typu projektu Class Library ve
Visual C# .NET
|
Pokud se podφvßte do okna Solution Explorer, uvidφte, ₧e k≤d
t°φdy Class1 je ulo₧en v souboru s nßzvem Class1.cs.á |
Bli₧Üφ pohled na automaticky vygenerovan² k≤d projektu
Podφvejme se v tΘto chvφli na vÜechen
automaticky sestaven² k≤d a pov∞zme si, co d∞lß:
using System;
namespace CS_Auto
{
ááááá /// <summary>
ááááá /// Summary description for Class1.
ááááá /// </summary>
ááááá public class Class1
ááááá {
ááááááááááá public
Class1()
ááááááááááá {
ááááááááááááááááá //
ááááááááááááááááá //
TODO: Add constructor logic here
ááááááááááááááááá //
ááááááááááá }
ááááá }
}
|
P°i studiu programovΘho k≤du jazyka Visual C# uvidφte, ₧e n∞kterΘ p°φkazy a klφΦovß slova jsou
psßna mal²mi pφsmeny a jinΘ partie k≤du kombinujφ malß i velkß pφsmena. Je
pot°ebnΘ, abyste m∞li na pam∞ti skuteΦnost, ₧e jazyk C# striktn∞ rozliÜuje
mezi mal²mi a velk²mi pφsmeny abecedy (jazyk C# je tedy äcase-sensitiveô,
podobn∞ jako t°eba C nebo C++).á |
Na ·vodnφm °ßdku je pou₧it p°φkaz using, kter² je prot∞jÜkem p°φkazu Imports z VB
.NET. Zavßdφ do programovΘho k≤du t°φdy odkaz na jmenn² prostor .NET Frameworku
s nßzvem System. Podobn∞ takΘ p°φkaz Imports se ve VB .NET pou₧φvß na to, aby bylo mo₧nΘ odkazovat se na dalÜφ
t°φdy, metody a vlastnosti danΘho jmennΘho prostoru bez nutnosti uvßd∞nφ pln∞
kvalifikovan²ch nßzv∙. Ve C# se p°φkaz using musφ nachßzet jeÜt∞ p°ed definicφ jak²chkoliv dalÜφch jmenn²ch
prostor∙.
|
Podobn∞ jako v jazycφch C a C++, tak i v C# je °ßdek programovΘho k≤du ukonΦen st°ednφkem,
tedy ne stiskem klßvesy Enter, jak je tomu ve Visual Basicu .NET.á |
V²pis k≤du pokraΦuje definicφ jmennΘho
prostoru pomocφ klφΦovΘho slova namespace. áJak si m∙₧ete vÜimnout, jmΘno projektu (CS_Auto), kterΘ jste zadali p°i vytvß°enφ projektu, je souΦasn∞ nßzvem
jmennΘho prostoru. K≤d samotnΘ t°φdy (zatφm standardn∞ pojmenovanΘ jako Class1) i konstruktoru se nachßzφ ve vyhrazenΘm bloku, jen₧ je ohraniΦen
klφΦov²m slovem namespace a p°φsluÜn²mi slo₧en²mi zßvorkami,
kterΘ definujφ hranice tohoto programovΘho bloku.
ZnaΦka <Summary> pat°φ mezi n∞kolik dokumentaΦnφch znaΦek, kterΘ podporujφ implementaci
XML dokumentace programovΘho k≤du jazyka C#.
KoneΦn∞ se dostßvßme k deklaraci samotnΘ
t°φdy Class1. T°φda je deklarovßna s p°φdomkem public, co znamenß, ₧e jde o ve°ejnou t°φdu, kterß bude dostupnß v celΘm
projektu. P°esn∞jÜφ by bylo vyjßd°enφ, ₧e instance tΘto ve°ejnΘ t°φdy, tedy
samotnΘ objekty, bude mo₧nΘ tvo°it z jakΘhokoliv mφsta v projektu. Standardnφ
nßzev t°φdy zm∞≥te na Automobil. ááááá
V bloku t°φdy je deklarovßn takΘ
konstruktor, kter² mß ve Visual C# stejn² nßzev jako samotnß t°φda. Konstruktorem
se rozumφ metoda, kterß je primßrn∞ aktivovßna v okam₧iku vytvß°enφ
instance t°φdy. Konstruktor je velmi u₧iteΦn², proto₧e prost°ednictvφm n∞ho lze
vhodn∞ inicializovat datovΘ Φleny t°φdy jeÜt∞ p°edtφm, ne₧ se tyto pou₧ijφ. Jak
v prost°edφ C#, tak i ve VB .NET lze vytvß°et n∞kolik variant konstruktor∙
se stejn²m nßzvem a odliÜnou signaturou. UvedenΘmu procesu se potΘ °φkß
p°etφ₧enφ konstruktoru.
Proto₧e t°φda a jejφ konstruktor musφ mφt
stejnΘ nßzvy, upravte i nßzev konstruktoru na Automobil.á
P°idßnφ metody do vytvo°enΘ t°φdy
Do t°φdy Automobil p°idßme pro zjednoduÜenφ jenom jednu ve°ejnou metodu s nßzvem VypoΦφstSpot°ebu, ·kolem kterΘ bude zjiÜt∞nφ v²Üe spot°eby automobilu. áUka₧me si ovÜem nejprve v²pis modifikovanΘho
programovΘho k≤du projektu a potΘ si vysv∞tlφme, jak ve skuteΦnosti pracuje:
using System;
namespace CS_Auto
{
ááááá /// <summary>
ááááá /// Summary description for Class1.
ááááá /// </summary>
ááááá public class Automobil
ááááá {
ááááááááááá public
Automobil()
ááááááááááá {
ááááááááááááááááá //
ááááááááááááááááá //
TODO: Add constructor logic here
ááááááááááááááááá //
ááááááááááá }
ááááááááááá public
int VypoΦφstSpot°ebu(int
PoΦetKilometr∙,
ááááááááááááááááá short
Spot°ebaNaKilometr)
ááááááááááá {
ááááááááááááááááá return
PoΦetKilometr∙*Spot°ebaNaKilometr;
ááááááááááá }
ááááá }
}
K≤d metody VypoΦφstSpot°ebu se nachßzφ pod k≤dem konstruktoru t°φdy. Metoda je definovßna jako
ve°ejnß a pracuje se dv∞ma parametry:
V t∞le metody je umφst∞n jenom jeden °ßdek k≤du, kter² vypoΦte celkovou spot°ebu automobilu a tuto vypoΦtenou hodnotu nßsledn∞ vrßtφ volajφcφ procedu°e (volajφcφ proceduru vytvo°φme za chvφli ve VB .NET).
Po napsßnφ programovΘho k≤du je naΦase
p°elo₧it projekt. Vyberte nabφdku Build a aktivujte
p°φkaz Build
Solution. á
Jestli₧e vÜe prob∞hlo ·sp∞Ün∞, m∙₧ete p°istoupit k dalÜφmu kroku, kter²m je p°idßnφ projektu VB .NET do stßvajφcφho °eÜenφ a nadvßzßnφ komunikace s prßv∞ vytvo°enou t°φdou.
P°idßnφ projektu VB .NET do stßvajφcφho °eÜenφ
Postupujte podle instrukcφ:
Obr. 2 û P°idßnφ projektu
Visual Basicu do °eÜenφ
á
Obr. 3 û Podoba okna Solution Explorer po p°idßnφ projektu
VB .NET
Obr. 4 û P°idßnφ reference na
knihovnu DLL s k≤dem t°φdy Automobil
Obr. 5 û Jmenn² prostor CS_Auto v projektu VB .NET
áááá Dim ObjektAuto As New CS_Auto.Automobil()
áááá MessageBox.Show("Pen∞₧nφ vyjßd°enφ
spot°eby PHM vaÜeho auta Φinφ " & _
áááá ObjektAuto.VypoΦφstSpot°ebu(100,
27)).ToString & " KΦ.", _
áááá "Ukßzka mφchßnφ
programovacφch jazyk∙")
Obr. 6 û Mφchßnφ
programovacφch jazyk∙ v praxi
Implementace vlastnosti, kterß je jenom pro Φtenφ
P°i objektov∞ orientovanΘm nßvrhu je n∞kdy zapot°ebφ vytvo°it vlastnost objektu, kterß bude pro vn∞jÜφ sv∞t jenom pro Φtenφ. Jestli₧e je vlastnost urΦena pouze pro Φtenφ, programov² k≤d klientskΘ aplikace m∙₧e pouze Φφst hodnotu danΘ vlastnosti, nenφ ovÜem schopen hodnotu vlastnosti jakkoliv m∞nit. Jak vytvo°it vlastnost jenom pro Φtenφ, si ukß₧eme v tomto tipu.
Postupujte takto:
P°edpoklßdejme, ₧e budete chtφt vytvo°it t°φdu s nßzvem PoΦφtaΦ, kterß bude obsahovat vlastnost TaktCPU. Tato vlastnost bude urΦena jenom pro Φtenφ. Programov² k≤d, jen₧ p°edvßdφ tuto modelovou situaci je uveden nφ₧e:
Public Class PoΦφtaΦ
ááá Private
ReadOnly m_TaktCPU As
Integer
ááá Public
ReadOnly Property
TaktCPU() As Integer
ááááááá Get
ááááááááááá Return
m_TaktCPU
ááááááá End
Get
ááá End
Property
ááá Public
Sub New()
ááááááá m_TaktCPU = 1700
ááá End
Sub
End Class
Ka₧dß vlastnost, kterß je urΦena jenom pro Φtenφ, musφ mφt ve svΘ deklaraci uvedeno klφΦovΘ slovo ReadOnly. P°esn∞ stejnß je situace i u vlastnosti TaktCPU. V t∞le vlastnosti TaktCPU je vytvo°en jenom blok Get-End Get, kter² vracφ hodnotu soukromΘho datovΘho Φlenu m_TaktCPU. Prßv∞ tento soukrom² datov² Φlen uchovßvß inicializaΦnφ hodnotu, kterß reprezentuje takt procesoru v MHz a podobn∞ jako samotnß vlastnost i on musφ mφt v deklaraΦnφm p°φkazu uvedeno klφΦovΘ slovo ReadOnly.
Dobrß, doposud jsme si °ekli, ₧e vlastnost TaktCPU je urΦena jenom pro Φtenφ a z tohoto d∙vod∙ nemß klientsk² k≤d oprßvn∞nφ k modifikaci tΘto vlastnosti. Jak ale potom nastavφme poΦßteΦnφ hodnotu tΘto vlastnosti? P°edem by bylo t°eba °φci, ₧e samotnß vlastnost neobsahuje hodnotu. Vlastnost je jenom programovacφ konstrukce, kterß umo₧≥uje p°istupovat k jistΘ hodnot∞. Tato hodnota je ovÜem ulo₧ena v soukromΘm datovΘm Φlenu, resp. v prom∞nnΘ datovΘho typu Integer s nßzvem m_TaktCPU.
Vhodn²m okam₧ikem pro poΦßteΦnφ inicializaci datovΘho Φlenu m_TaktCPU je konstruktor t°φdy PoΦφtaΦ. Konstruktor ve VB .NET mß v₧dy podobu ve°ejnΘ procedury Sub New, kterß je standardn∞ bez jak²chkoliv parametr∙ (pochopiteln∞, je mo₧nΘ vytvo°it takΘ konstruktor s parametry). V k≤du konstruktoru dochßzφ k inicializaci datovΘho Φlenu m_TaktCPU na hodnotu 1700. V₧dy, kdy₧ dojde k zrozenφ instance tΘto t°φdy, bude spuÜt∞n k≤d konstruktoru, kter² inicializuje hodnotu soukromΘho datovΘho Φlenu. Po vytvo°enφ instance t°φdy bude mo₧nΘ k hodnot∞ soukromΘho datovΘho Φlenu p°istupovat pomocφ vlastnosti TaktCPU. áá
P°edve∩me si praktickou ukßzku:
á
ááá Private
Sub Button1_Click(ByVal
sender As System.Object, _
ááá ByVal
e As System.EventArgs) Handles
Button1.Click
ááááááá Dim
MojePC As PoΦφtaΦ
ááááááá MojePC = New PoΦφtaΦ()
ááááááá Me.Text
= "Takt procesoru je " & _
ááááááá MojePC.TaktCPU & "
MHz."
ááá End Sub
Obr. 7 û ZjiÜt∞nφ hodnoty
vlastnosti, kterß je urΦena jenom pro Φtenφ
Zobrazenφ Φφsel °ßdk∙ v editoru pro zßpis k≤du
Z vlastnφ zkuÜenosti vφm, ₧e n∞kter²m programßtor∙m se s zdrojov²m k≤dem pracuje lΘpe v p°φpad∞, kdy jsou vÜechny °ßdky k≤du Φφseln∞ oznaΦenΘ. Visual Basic .NET samoz°ejm∞ podporuje mo₧nost zobrazovßnφ Φφsel °ßdk∙ programovΘho k≤du. Volba, kterß tuto schopnost IDE aktivuje je ovÜem pon∞kud dob°e ukryta. Jak se k nφ dopracovat, si ukß₧eme prßv∞ te∩:
Obr. 8 û Aktivace zobrazovßnφ
Φφsel °ßdk∙ v editoru pro zßpis zdrojovΘho k≤du
Od tΘto chvφle budou Φφsla °ßdk∙ vaÜφm nerozluΦn²m pomocnφkem p°i psanφ programovΘho k≤du (obr. 9).
Obr. 9 û ╚φsla °ßdk∙ v editoru pro zßpis
zdrojovΘho k≤du
Jßn Hanßk