Dizajniranje Softvera

Vežbe | 1. termin

Java vs. C# - Osnovne razlike

feature Java C#
Compile target file .class .exe, .dll
Compile target lang. Bytecode Common Intermediate Language (CIL)
Runtime Java Virtual Machine (JVM) Common Language Runtime (CLR)
Grouping package, import namespace, using
Naming camelCase (first letter: lower) PascalCase (first letter: upper)

.NET sumirano

Kod napisan u jeziku kao što je C# se kompajlira u CIL, koji se nalazi u EXE ili DLL fajlu, i izvršava ga CLR tako što deo po deo prevodi u mašinski kod, koji se izvršava na procesoru sistema.

Jezičke konstrukcije

Čitanje sa konzole

String linija = Console.ReadLine();

Nasleđivanje: extends/implements vs. :

// Java
class Klasa extends Roditelj implements Interfejs1, Interfejs2 { }
// C#
class Klasa : Roditelj, Interfejs1, Interfejs2 { }

Pozivanje konstruktora nadklase: super vs. base

// Java
class Klasa extends Roditelj 
{
    Klasa(String p1, String p2) 
    {
        super(p1);
        // ...
    }
}
// C#
class Klasa : Roditelj 
{
    Klasa(String p1, String p2) : base(p1) 
    {
        // ...
    }
}

Overriding

class Roditelj {
    void Metoda() { }
}

class Klasa extends Roditelj {
    void Metoda() { } // Automatski "gazi" roditeljski implementaciju metode "Metoda"
}
class Roditelj {
    virtual void Metoda() { } // virtual = moze da se pregazi u child klasi
}

class Klasa : Roditelj {
    override void Metoda() { } // override = gazi roditeljski implementaciju
}

Foreach petlja: for vs. foreach

// Java
for (float broj : brojevi) { 
    // ... 
}
// C#
foreach (float broj in brojevi) { 
    // ... 
}

Promenljivi broj argumenata metode: ... vs. params

// Java
int Suma(int ... brojevi) {
    // "brojevi" se koristi kao niz
}
// C#
int Suma(params int[] brojevi) {
    // "brojevi" se koristi kao niz
}
// Poziv metode u oba jezika
Suma(1,2,3,4,5);

Boksovanje

Svi primitivni tipovi u C# su takodje objekti. Na primer, tip int je samo alias za klasu System.Int32. Ali primitivni tipovi se razlikuju od običnih klasa po tome što se njihove instance prenose po vrednosti. Što znači da će se int objekat kopirati u drugu promenljivu prilikom dodele vrednosti, npr:

int x = 10;
int y = x;

ovde, x i y sadrže dva različita objekta.

Boxing je proces gde od objekta koji se prenosi po vrednosti kreiramo objekat istog tipa ali koji se prenosi po referenci. Na primer:

int x = 10;
object y = x; // <- Boxing

Unboxing je suprotan proces:

int x = 10;
object y = x;
int z = (int)y; // <- Unboxing

Višelinijski stringovi

String s = @"Prva linija
Druga linija
    Treca linija
"

Rezultat u s (postoji newline nakon trece linije):

Prva linija
Druga linija
    Treca linija

Svojstva (property)

Koriste se kao obični atributi i predstavljaju podatke:

objekat.Svojstvo = "vrednost";
Console.Write(objekat.Svojstvo);

Definišu se na dva načina. Prvi je jednostavan, bez uvođenja dodatnog atributa koji čuva podatke:

int Broj { get; set; }

Uz ograničene dozvole:

public int Broj { get; private set; }

Drugi način, dodatni atribut i robusnija kontrola:

int broj;
int Broj { 
    get { return broj; } 
    set { broj = value; } 
}

Parcijalne klase

fajl 1

partial class Point2D {
    public float X { get; set; }
    public float Y { get; set; }
}

fajl 2

partial class Point2D {
    public void Move() { /* ... */ }
}

Kompajler će pronaći sve delove parcijalne klase i spojiti ih u jednu celinu.

ref i out ključne reči

void Funkcija(ref int x, out int y) {
    // x - možemo menjati i čitati
    // z - možemo samo menjati
}
// Poziv
int a = 10;
int b;
Funkcija(ref a, out b);

Napomene:

Imenovani argumenti funkcija

void Funkcija(int x, int y) { }
// Poziv
Funkcija(1, 2);
Funkcija(x: 1, y: 2);
Funkcija(y: 2, x: 1);

internal vidljivost

Vidljivost unutar Assembly-ja (EXE/DLL)

Enumeracije

int konstante koje pocinju od 0

enum Dan { Pon, Uto, Sre, Cet, Pet, Sub, Ned };

mogu biti drugog celobrojnog tipa i poceti od nekog drugog broja

enum Dan: ushort { Pon = 1, Uto, Sre, Cet, Pet, Sub, Ned };

Korišćenje:

Dan x = Dan.Sub;

Automatsko utvrđivanje tipa: var

Kompajler često može sam zaključiti tip promenljive

var x = 15.6F;     // x je float
var y = 15;        // y je int
var s = "hello!";  // s je string
var c = new Car(); // c je tipa klase Car

Anonimni tipovi

var point3d = new { X = 3.0, Y = 7.0, Z = 1.0 };
Console.Write(point3d.X);

Napomena: Članovi objekta anonimne klase mogu biti samo property, i to public read-only (imaju public getter). Dakle, X, Y i Z su property.


2. Termin »>