SzoftTechPZH20130510
1.: a) UML (6p)
b) Nagy projektekben c# nyelvű környezetben a feladatunk egy Document-View architektúrájú alkalmazás alapjainak elkészeítése. Az architektúra egyik alapgondolata, hogy a dokumentum(Document) objektum egy listában tartja nyilván a nézeteit(View) különböző típusúak lehetnek (pl DrawingView, Editorview). A nézeteknek vannak tulajdonságaik (pl Size) és műveleteikl (pl SetSize). Vannak, amik elérnek. (eddig emlékszem)
2.: A person osztály egy Age nevű, integer típusú publikus tulajdonsággal (property) és egy szintén nyilvános, AgeChanged eseménnyel rendelkezik. Ha Age-t megváltoztatjuk, az esüti az AgeChanged Eseményt, melynek argumentumaiban megadja az Age tulajdonság korábbi és új értékét is.
Adjuk meg a Person osztály teljes kódját C# nyelven, és írjunk hozzá példakódot a használathoz.
public delegate void ChangedDelegate(int x, int y); public class Person { public event ChangedDelegate AgeChanged; private int age; public Person(int age) { this.age = age; } public int Age { get { return age; } set { AgeChanged(age, value); age = value; } } } class Program { static void Main(string[] args) { Person jakab = new Person(25); jakab.AgeChanged += eventHandler; jakab.Age = 30; } static void eventHandler(int regi, int uj) { Console.WriteLine("Age régi értéke: {0}", regi); Console.WriteLine("Age új értéke: {0}", uj); } }
3.: a) Milyen célt szolgál a Partial class?
b) Component és Control osztályok közti különség?
c) (10,10)-be zöld színű, 1 px vastag vonallal rajzolt, kitöltetlen, 30px oldalhosszú négyzetet rajzoljunk. A vonal színe 10 mp alatt menjen át fehérbe. 'Interruptolj' az x gombbal. Csak időzítő (Timer) alapú megoldás elfogadható.
public partial class Form1 : Form { bool stopped = false; int cntr = 0; public Form1() { Timer timer = new Timer(); timer.Interval = 1000; timer.Tick += new EventHandler(timer_Tick); timer.Start(); this.KeyDown += new KeyEventHandler(Form1_Keydown); InitializeComponent(); } void Form1_Keydown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.X && !stopped) stopped = true; } void timer_Tick(object sender, EventArgs e) { if (!stopped) Invalidate(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Pen pen = new Pen(Color.FromArgb(5 + cntr * 25, 255, 5 + cntr * 25), 1); e.Graphics.DrawRectangle(pen, 10, 10, 30, 30); if (cntr == 10) stopped = true; if (!stopped) ++cntr; } }
4.:a) C# példa Dispose kapcsán using blokk használatára + magyarázat a kódhoz (6p)
b) Felügyelt .NET környezetben miért ne férjünk egy obj desktruktorában a felügyelt tagváltozókhoz? (3p)
A destruktor csak a külső hivatkozásait engedhesse el(pl. nem felügyelt erőforrások) , mert a felügyelteket lehet, hogy felszabadította már a GC.
c) natív C++ template-ek 3 negatív tulajdonsága, mely C#-ból eltűnt (3p)
a c# generikus típusai nem olyan rugalmasak mint a c++ templatek. pl nem lehet benne aritmetikai utasításokat használni, de lehet benne user-defined operátor.
- c# se explicit se partial specializációt nem támogat.
- c# nem engedi a típusos paramétereknek a default típust.
- c# nem engedi a nem típusos template paramétereket (pl.: template C<int i> {})
5.: Szálkezelés:
a) Többszálú alk. előnyei (4p)
- jobb processzor kihasználtság
- nem növekvő átlagos válaszidő (interaktivitás – pl. nem akad le a GUI, szerveralkalmazások)
- időzítés érzékeny feladatok magasabb prioritású szálon futtathatóak
b) Itt el kellett indítgatni két szálat meg megállítani őket..
c) Mely esetbe használunk ill nem használunk statikus blokkot (3p)
6.: Csővezeték architektúra
a) Adatnyelő által vezértelt csővezeték architektúra ismeretése szekvenciadiagrammal (8p)
b) (írj) Pszeudo-kódot szűrő (filter) komponens megvalósításához adatnyelő által vezértelt csővezeték architektúrában(6p)
7.: ADO.NET
Írjunk robosztus, hatékony, kapcsolat alapú modellre épülő ADO.NET példakódot, amely kitöröl minden olyan rekordot, melyben létezik a DepartmentID.
Staff(StaffID(kulcs), Name, EMail, DepartmentID). (13p)
SqlConnection conn = null; try { conn = new SqlConnection("..."); SqlCommand command = new SqlCommand("DELETE FROM Staff WHERE DepartmentID IS NOT NULL", conn); conn.Open(); command.ExecuteNonQuery(); } catch(EXception ex) { Console.WriteLine(ex.Message); } finally { if (conn != null) conn.Close(); }
- A szálkezelős feladat ha jól emlékszem hasonló volt a rendes ZH A csoportjának a feladatához: megírt kód elindít két szálat: egyik szál egy long (64bites!!!) változóbe beír egy számot, majd a másik szál kiolvassa és kiírja a konzolra. az egyes szál a beírás után, a kettes szál a kiolvasás után befejezheti a futását. Az nem tételezhető fel hogy az egyes szál előbb indul el mint a kettes!