| 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;
varKompajler č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.