C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik...

27
C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) [email protected]

Transcript of C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik...

Page 1: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

C# versus Java

Hanspeter Mössenböck

Universität LinzInstitut für Praktische Informatik (Systemsoftware)[email protected]

Page 2: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

2

Der KontextEntstehungsjahr

Betriebssysteme

Leitidee

VM

Zwischencode

JIT-Compilation

Komponenten

Versionierung

Applets

Datenbanken

Web-Programmierung

2002

Windows (Linux, MacOS X)

Viele Sprachenauf einer Plattform(VB, C++, J#, Eiffel, Fortran, ...)

Common Language Runtime

Common Intermediate Language

gesamt

Assemblies

ja

-

ADO.NET

ASP.NET

1995

Unix/Linux,Windows, MacOS, ...

Eine Spracheauf vielen Plattformen

Java-VM

Java-Bytecodes

per Methode

Beans, EJB

-

ja

JDBC

Servlets, JSP

Java-Technologie .NET-Technologie

Page 3: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

3

Merkmale von C#

Wie in Java• Objektorientierung (einf. Vererbung)• Interfaces• Exceptions• Threads• Namespaces (wie Packages)• Strenge Typprüfung• Garbage Collection• Reflection• Dynamisches Laden von Code• ...

Wie in C++• (Operator) Overloading• Zeigerarithmetik in Unsafe Code• Einige syntaktische Details

Sehr ähnlich zu Java70% Java, 10% C++, 10% Visual Basic, 10% neu

Page 4: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

4

Neue Features in C#

Wirklich neu (vs. Java)• Referenzparameter• Objekte am Stack (Structs)• Blockmatrizen• Enumerationen• Uniformes Typsystem• goto• Systemnahes Programmieren• Versionierung• Attribute• Kompatibel mit anderen .NET-

Sprachen

"Syntactic Sugar"• Komponentenunterstützung

- Properties- Events

• Delegates• Indexers• Operator Overloading• foreach-Iterator• Boxing/Unboxing• ...

Page 5: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

5

Typsystem von C#

Typen

Werttypen Referenztypen

Einfache Typen Enums Structs Klassen Interfaces Arrays Delegates

boolchar

sbyteshortintlong

byteushortuintulong

floatdoubledecimal

Alle Typen sind kompatibel mit object- können object-Variablen zugewiesen werden- verstehen object-Operationen

Benutzerdefinierbare Typen

Page 6: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

6

Boxing und UnboxingAuch Werttypen (int, struct, enum) sind zu object kompatibel!

BoxingBei der Zuweisungobject obj = 3;

wird der Wert 3 in einHeap-Objekt eingepackt

UnboxingBei der Zuweisungint x = (int) obj;

wird der eingepackte int-Wertwieder ausgepackt

3

obj

Object obj = new Integer(3);

int x = ((Integer)obj).intValue();

Java 1.4

Page 7: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

7

Klassen und Vererbung

class A {private int x;public void Foo() {...}public A(int x) { this.x = x; }

}

class A {private int x;public void Foo() {...}public A(int x) { this.x = x; }

}

JavaC#

class B : A, I1, I2 {private int y;

public int Bar() { ...}

public B(int x, int y) : base(x) {this.y = y;

}}

class B extends A implements I1, I2 {private int y;

public int Bar() { ...}

public B(int x, int y) {super(x);this.y = y;}

}

Page 8: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

8

Überschreiben von Methoden

class A {...public void Foo() { ...}

}

class A {...public virtual void Foo() { ...}

}

JavaC#

class B : A {...public override void Foo() {

base.Foo();...

}}

class B extends A {...public void Foo() {

super.Foo();...

}}

Page 9: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

9

PropertiesSyntaktische Kurzform für get/set-Methoden

class Data {FileStream s;

public string FileName {set {

s = new FileStream(value, FileMode.Create);}get {

return s.Name;}

}}

Wird wie ein Feld benutzt ("smart fields")

Data d = new Data();

d.FileName = "myFile.txt"; // ruft d.set("myFile.txt") aufstring s = d.FileName; // ruft d.get() auf

Typ des PropertiesName des Properties

"Eingangsparameter"von set

Page 10: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

10

Properties (Fortsetzung)get oder set kann fehlen

class Account {long balance;

public long Balance {get { return balance; }

}}

x = account.Balance; // okaccount.Balance = ...; // verboten

Nutzen von Properties

• read-only und write-only-Daten möglich.• Validierung beim Zugriff möglich.• Benutzersicht und Implementierung der Daten können verschieden sein.

Page 11: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

11

Programmierbarer Operator zum Indizieren einer Folge (Collection)

class File {FileStream s;

public int this [int index] {get { s.Seek(index, SeekOrigin.Begin);

return s.ReadByte();}

set { s.Seek(index, SeekOrigin.Begin);s.WriteByte((byte)value);

}}

}

BenutzungFile f = ...;int x = f[10]; // ruft f.get(10)f[10] = 'A'; // ruft f.set(10, 'A')

Typ und Namedes Indexwerts

Name(immer this)

Indexer

Typ des indi-zierten Ausdrucks

Page 12: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

12

C# ist oft griffiger als Java

String s = ..;...for (int i = 0; i < s.length(); i++)

process(s.charAt(i));

String s = ...;...for (int i = 0; i < s.Length; i++)

process(s[i]);

Hashtable tab = new Hashtable();...tab.put("John", new Integer(123));...int x = ((Integer) tab.get("John")).intValue();

Hashtable tab = new Hashtable();...tab["John"] = 123;...int x = (int) tab["John"];

JavaC#

foreach (char ch in s)process(ch);

Page 13: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

13

Ausnahmebehandlung (Exceptions)

try {...... throw myException;...

} catch (E1 e) {...

} catch (E2 e) {...

} catch (Throwable e) {...

} finally {...

}

try {...... throw myException;...

} catch (E1 e) {...

} catch (E2) {...

} catch {...

} finally {...

}

JavaC#

Page 14: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

14

Keine Checked Exceptions in C#

void Foo() throws E2 {try {

if (...)throw new E1();

elsethrow new E2();

...} catch (E1 e) {

...}

}

void Foo() {try {

if (...)throw new E1();

elsethrow new E2();

...} catch (E1 e) {

...}

}

JavaC#

Checked ExceptionsAusnahmen müssen abgefangenoder mit throws im Methodenkopfspezifiziert werden.

Keine Checked ExceptionsWenn keiner der Rufer E2abfängt, bricht das Programm mit einem Laufzeitfehler ab.

Page 15: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

15

Checked Exceptions

void P() {try {... Q(); ...} catch (E e) {...}

}

void Q() throws E {... R(); ...

}

void R() throws E {... S(); ...

}

void S() throws E {...throw new E();

}

Kontra- Mühsam, wenn Ausnahme weitergereicht wird

Pro+ Dokumentation für den Programmierer+ Zwingt dazu, jeden Fehlerfall zu bedenken

try {...

} catch (E e) {} Fehler wird verschluckt!

- Verführt zu folgendem "Hack"

Page 16: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

16

Delegate = MethodentypDeklaration eines Delegate-Typs

delegate void Notifier (string sender); // normale Methodensignatur// mit Schlüsselwort delegate

Deklaration einer Delegate-VariablenNotifier notify;

Zuweisung einer Methode an eine Delegate-Variablevoid SayHello(string sender) {

Console.WriteLine("Hello " + sender);}

notify = new Notifier(SayHello);

Aufruf der Delegate-Variablennotify("Max"); // Aufruf von SayHello("Max") => "Hello Max"

void SayGoodBye(string sender) {Console.WriteLine("Good bye " + sender);

}

notify = new Notifier(SayGoodBye);

Page 17: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

17

Multicast-DelegatesDelegate-Variable kann mehrere Werte gleichzeitig aufnehmen

Notifier notify;notify = new Notifier(SayHello);notify += new Notifier(SayGoodBye);

notify("Max"); // "Hello Max"// "Good bye Max"

notify -= new Notifier(SayHello);

notify("Max"); // "Good bye Max"

Page 18: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

18

Threads

void P() {... thread actions ...

}

Thread t = new Thread(new ThreadStart(P));t.Start();

class MyThread extends Thread {public void run() {

... thread actions ...}

}

Thread t = new MyThread();t.start();

C# Java

• Beliebige Methode kann als Threadgestartet werden

• Keine Unterklasse von Thread nötig

• Thread-Aktionen müssen in einerrun-Methode stecken

• Unterklasse von Thread nötig, bzw.Implementierung von Runnable

Page 19: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

19

Thread-Synchronisation

class Buffer {int[] data;

public void Put(int x) {lock(this) {

...}

}

[MethodImpl(MethodImplOptions.Synchronized)]public int Get() {

...}

}

class Buffer {int[] data;

public void put(int x) {synchronized(this) {

...}

}

public synchronized int get() {...

}}

C# Java

Monitor.Wait(this);Monitor.Pulse(this);Monitor.PulseAll(this);

wait();notify();notifyAll();

Page 20: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

20

AttributeBenutzerdefinierte Informationen über Programmelemente• Können an Typen, Felder, Methoden, etc. angehängt werden.• Werden als Metadaten gespeichert.• Können zur Laufzeit abgefragt werden.• Sind Unterklassen von System.Attribute.

Beispiel

[Serializable]class C {...}// macht C serialisierbar

Mehrfache Attribute zuweisbar

[Serializable] [Obsolete]class C {...}

[Serializable, Obsolete]class C {...}

Page 21: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

21

Beispiel: [Conditional]-AttributFür bedingte Aufrufe von Methoden

#define debug // Präprozessor-Anweisung

class C {

[Conditional("debug")]static void Assert (bool ok, string errorMsg) {

if (!ok) {Console.WriteString(errorMsg);System.Environment.Exit(0);

}}

static void Main (string[] arg) {Assert(arg.Length > 0, "no arguments specified");Assert(arg[0] == "...", "invalid argument");...

}}

Assert wird nur aufgerufen, wenn debug definiert wurde.

Page 22: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

22

J# - Java unter .NET• Vollständige Java-Syntax (JDK 1.1.4), ähnlich J++

• Delegates wie in C#

• Unterstützt die meisten Java-Bibliotheken (nicht RMI, JNI)

• Unterstützt die meisten .NET-Bibliotheken (ASP.NET, ADO.NET, Windows Forms)

• Kann unter Visual Studio.NET verwendet werden

• Erzeugt keine Java-Bytecodes sondern .NET-Assemblies=> nicht portabel, keine Applets

Page 23: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

23

Was bringt die Zukunft?Generische Typen

C# 2.0

class Stack<T> {void Push(T x) {...}T Pop() {...}...

}

Stack<int> s = new Stack<int>();...int x = s.Pop();

Java 1.5

class Stack<T> {void Push(T x) {...}T pop() {...}...

}

Stack<String> s = new Stack<String>();...String x = s.pop();

• Erzeugt neue Klasse Stack_int• Keine Casts zur Laufzeit

• Erzeugt keine neue Klasse• Stack-Elemente als Objects gespeichert• Versteckte Casts zur Laufzeit• Keine primitiven Typen (int, char, ...)

als Typparameter erlaubt!

Page 24: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

24

Java 1.5 holt auf ...Boxing / UnboxingObject obj = 3;int x = obj; // kein Cast nötig!

Object obj = 3;int x = (int) obj;

Enumerationenenum Color {red, blue, green}...if (color == Color.red) ...

enum Color {red, blue, green}...if (color == Color.red) ...

Spezielle for-Schleife ( foreach)for (Object s : collection)

System.out.println((String)s);foreach (string s in collection)

Console.WriteLine(s);

Metadaten ( Attribute)public @interface Author {

String name();}...@Author(name = "HM")public void foo() {...}

public class Author : Attribute {string _name;public string Name { set {_name = value; } }

}...[Author(Name = "HM")]public void Foo() {...}

in C#

Page 25: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

25

C# 2.0 führt neue Features ein ...Anonyme Methoden

delegate void Notifier (string s);...Notifier var = delegate (string s) {

Print("I got an " + s);}

Partielle Typenpublic partial class A { // in Datei X.cs

public void Foo() {...}...

}

public partial class A { // in Datei Y.cspublic void Bar() {...}...

}

Iteratorenpublic class Stack {

private int[] data;private int top;public void Push(int x) {...}public int Pop() {...}...public IEnumerator GetEnumerator() {

for (int i = 0; i < top; i++) yield return data[i];

}}

Stack stack = new Stack();...foreach (int x in stack)

Console.WriteLine(x);

Page 26: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

26

Zusammenfassung

kleiner und einfacher

größere Verbreitung

strikterChecked Exceptions,kein Unsafe Code

portabler

mächtigerStructs, Referenzparameter,Attribute, ...

bequemer und griffigerIndexer, Delegates, ...

flexiblererlaubt Systemprogrammierung

besser unter Windows

JavaC#

Page 27: C# versus Java Hanspeter Mössenböck Universität Linz Institut für Praktische Informatik (Systemsoftware) moessenboeck@ssw.uni-linz.ac.at.

Danke für Ihre Aufmerksamkeit

Folien unterhttp://dotnet.jku.at

Beer, Bringruber,Mössenböck, Wöß:

Die .NET-Technologie

dpunkt.verlag, 2002

Mössenböck:

Softwareentwicklungmit C#

dpunkt.verlag, 2003