Monthly Archives: July 2009

Visual Studio 2010 i C# 4.0 II DIO – Co i Contra Variance


Polja u .NET-u označavana su kao kovarijantna. Isto tako pojavom Generics-a u .NET 2.0 svojstvo kovarijance i kontravarijane nije bilo podržano. U tom pogledu sljedeći kod u C# 3.0 ne može se kompajlirati:

Funkcija1<Student> studemt = () => new Student(“Šemso”, 1978, DateTime.Now);
Funkcija1<Osoba> osoba = studemt;
Akcija1<Osoba> osoba1 = (s) => { Print(s); };
Akcija1<Student> student1 = osoba1;
Funkcija1<Student> studemt = () => new Student("Šemso", 1978, DateTime.Now);
Funkcija1<Osoba> osoba = studemt;

Akcija1<Osoba> osoba1 = (s) => { Print(s); };
Akcija1<Student> student1 = osoba1;

Bez obzira što je klasa Student izvedena iz klasa Osoba, ovakva konstrukcija koda nije validna. Upravo Varijanca kao novo proširenje C# 4.0 omogućuje nam konstrukciju koda kao u prethodnom primjeru, i sigurna provjeravanje izvedenih tipova. Jednostavno rečeno Varijanca je svojstvo operatora da se ponašaju kao tipovi. Iz tog razloga definisane su osobine KoVarijanca (Co-Variance) i KontraVarijanca (Contra-Varijance). Da bi prethodni primjer bilo kompajliran bez greške potrebno je Funkciju i Akciju implementirati u smuslu Kovarijantnosti odnosno KontraVarijantnosti.

Tj.

delegate T Funkcija1<out T>();
delegate void Akcija1<in T>(T a);

Deklaracija delegata Funkcija i Akcija imaju sličnu deklaraciju osim ključnih riječi in i out. Ovo znači da prvi delegat Funkcija služi samo za čitanje (read-only) i kao takav je type safe. U slučaju da hoćemo da naš delegat bude write –only odnoso KontraVarijantan tada koristimo ključnu riječ in,  kao što je prikazano kod primjera delegata Akcija.

Čitav primjer korištenja Ko i Kontra Varijance dat je i narednom tekstu. Primjer je preuzet sa msdn i modificiran.

class Osoba
{
  public Osoba()
   { }
  public Osoba(string ime, int id)
   {
     Ime = ime;
     ID = id;
    }
  public string Ime;
  public int ID;
}

class Student : Osoba
{
  public Student()
   { }
  public Student(string ime, int id, DateTime upis)
   {
     Ime = ime;
     ID = id;
     datumUpisa = upis;
   }
  public DateTime datumUpisa;
}

class Program
{
  //Da bi razumijeli nova proširenja CoVarijanca i KontraVarijanca pokušajte
  //kompajlirati program kada obrisete ključne riječi out i in sa deklaracije ova dva delegata
  delegate T Funkcija1<out T>();
  delegate void Akcija1<in T>(T a);

  static void Main(string[] args)
   {
    Funkcija1<Student> student = () => new Student("Šemso", 1978, DateTime.Now);
    Funkcija1<Osoba> osoba = student;
    Funkcija1<Osoba> osoba2 = ()=> new Osoba("Mirso", 1555);
    Akcija1<Osoba> osoba1 = (s) => { Print(s); };
    Akcija1<Student> student1 = osoba1;

   //Ispis objekta biće student jer je objekat osoba formiran iz studenta
   Print(osoba());

   //Ispis objekta biće student
   student1(new Student("Emir", 1977, DateTime.Now.AddDays(-5)));

   //Ispis objekta Osoba
   Print(osoba2());
   Console.Read();
}

static void Print(Osoba p)
{
  Student st = p as Student;
  if (st != null)
    Console.WriteLine("Student");
  else
    Console.WriteLine("Osoba;");

  Console.WriteLine("Name: {0};", p.Ime);
  Console.WriteLine("ID:{0}", p.ID);

   if (st != null)
    Console.WriteLine("Datum:{0}", st.datumUpisa);

   Console.WriteLine("_______________________________");
 }

}

Značajno je reći da Varijanca podržavana  samo nad delegatima  i interfejsima.

Advertisements

Visual Studio 2010 i C# 4.0 I DIO


Uvod

VS2010B1

Još se nisu stišali utisci izlaska Visual Studia 2008 i C# 3.0, a Microsoft je još krajem prošle godine najavio svoju novu verziju 2010, kao i novine koje trebaju doći. O nekim novinama već sam pisao. Dio vijesti o VS 2010:

· ParallelFx biblioteka za paralelno programiranje pod .NET jezicima. Ovo proširenje .NET-a je ugledalo svjetlo dana još u decembru 2007 godine lansiranjemm prvog CTP-a ove biblioteke.

· Druga vijest koja je obznanjena da će novi .NET programski jezik F# biti uključen u novi Visual Studio 2010.

· Naravno, pored dobrih vijesti Microsoft je obznanio da napušta razvijanje LINQ to SQL tehnologije, te preporučuje developerima da koriste i prelaze na Entity Framework koji bi u novoj verziji bio “poboljšan“.

U decembru prošle godine na PDC-u, kojeg sam naknadno pregledao najupečatljiviju prezentaciju imao je Andreas Hejlsberg kreator C#. Kao jednu od najboljih prezentacija PDC-a 2008, pored navedene imao je Luca Bolognese sa prezentacijom novog funkcionalnog .NET programskog jezika F#. Preporučujem da je pogledate. Na istoj konferenciji lansirana je i CTP verzija Visual Studia 2010, a instalacija je bila „zalijepljena“ kao virtualna mašina. Naravno zbog samog statusa verzije.

Sredinom maja 2009 izašla je i prva beta verzija Visual Studia 2010, gdje se može skinuti i koristiti u testne i edukacijske svrhe sa ovog linka. Sa prvom betom stekli su se uvjeti da se u punom kapacitetu okušaju sve novine proizvoda.

Pored ParallelFX nove biblioteke odnosno proširenja .NET frameworka, vrlo interesantne stvari dogodile su se u samom C# programskom jeziku koji postaje i ostaje jedan od najpopularnijih programskih jezika. C# 4.0 proširen je u nekoliko smjerova:

1. Imenski i opcioni parametri (Named and Optional parameters)

2. Dinamička podrška

3. Varijance

4. COM interoperabilnost

Opcioni ili podrazumijevani parametri metoda

Developeri koji su prešli sa C++ na C#, ponekad su bili frustrirani nemogućnošću korištenja podrazumijevanih argumenta u funkcijama. Npr:

clip_image002

Ovo je dovodilo do dodatnih implementacija metoda koje su trebale preklapati isti naziv, a samim tim i do težeg održavanja koda. Konačno, ovo proširenje dolazi sa C# 4.0. Npr. posmatrajmo sljedeći kod koji deklariše jednu metodu koja se može pozvati na tri potpuno različita načina. Zadnji 4-ti poziv metode nije dozvoljen jer se nije ispoštovao princip poretka parametara u metodi.

clip_image004

Imenski parametri

U prethodnom primjeru vidjeli smo da opcioni parametri ne mogu izgubiti poredak tj. ne smijemo tako lako ispuštati opcioni parametar bez obzira da li on ima podrazumijevanu vrijednost. Puno je slučajeva kada u kojem bi došli u zabludu ako bi zadnji poziv prethodnog primjera bio moguć. Npr. Kada bi metoda Metoda imala podrazumijevane parametre istog tipa ili tipa object vrlo bi teško bilo za samog developera snalaziti se u takvoj zbrci, a da se ne priča o kompajleru.

Da bi se ipak mogao ispustiti podrazumijevani parametar odnosno pozivati metoda na način da se nekoliko podrazumijevanih parametara ispusti, a poslije toga neki drugi poslije njih parametar definiše (kako je prikazano u zanjem pozivu gornjeg primjera) potrebno je koristiti proširenje Imenskih parametara. Naime, ako želimo neke parametre ispustiti, da bi onda ostale dodali potrebno je koristiti sam naziv tog parametra u samoj deklaraciji metode. To znači da prethodni primjer možemo pisati na sljedeći način:

clip_image006