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) |
C#
, F#
, VB
, …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.
String linija = Console.ReadLine();
extends
/implements
vs. :
// Java
class Klasa extends Roditelj implements Interfejs1, Interfejs2 { }
// C#
class Klasa : Roditelj, Interfejs1, Interfejs2 { }
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)
{
// ...
}
}
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
}
for
vs. foreach
// Java
for (float broj : brojevi) {
// ...
}
// C#
foreach (float broj in brojevi) {
// ...
}
...
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);
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
String s = @"Prva linija
Druga linija
Treca linija
"
Rezultat u s
(postoji newline nakon trece linije):
Prva linija
Druga linija
Treca linija
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; }
}
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čivoid 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:
void Funkcija(int x, int y) { }
// Poziv
Funkcija(1, 2);
Funkcija(x: 1, y: 2);
Funkcija(y: 2, x: 1);
internal
vidljivostVidljivost unutar Assembly-ja (EXE/DLL)
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;
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
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.