KEMBAR78
C# / Java Language Comparison | PDF
.
.

C# / Java Language Comparison
Robert Bachmann

April 4, 2011

1 / 22
Outline

My favorite pitfalls
Common conventions
Type system
Generics
Keywords
Exceptions
Speci c features of Java
Speci c features of C#

2 / 22
My favorite pitfalls

str == "hello"
Checks equality in C#. Checks identity in Java.
Virtual methods
Opt-out in Java (final keyword) vs. opt-in in C# (virtual keyword)
Dates
new GregorianCalendar(2011, 3, 4)1 vs.
new DateTime(2011,4,4)

1

Hint: use YodaTime, Date4J, …
3 / 22
Common conventions

Package names / Namespaces: org.acme.foo vs. Acme.Foo
Interfaces: Supplier vs. ISupplier
Methods: doSomething vs. DoSomething
Opening braces: Same line in Java vs. next line in C#

4 / 22
Type system
Basic types

Java
String
Object
boolean
char
short
int
long
double
oat
byte
—
—
—
—

C#
string
object
bool
char
short
int
long
double
oat
sbyte
byte
ushort
uint
ulong

CLR Type
String
Object
Boolean
Char
Int16
Int32
Int64
Double
Single
SByte
Byte
UInt16
UInt32
UInt64
5 / 22
Type system
Java has reference and primitive types.
C# has reference and value types.
Uses an uni ed type system, for example you can do 42.ToString()
It’s possible to create custom value types:
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
public override string ToString ()
{
return String . Format ("({0} ,{1})", X, Y);
}
}

6 / 22
Generics

Java uses type erasure. Generics are (mostly) a compiler feature.
new ArrayList <Integer >(). getClass ();
// -> ArrayList
new ArrayList <String >(). getClass ();
// -> ArrayList

C# uses rei ed generics. Generics are a runtime feature.
new List <int >(). GetType ();
// -> List `1[ Int32 ]
new List <string >(). GetType ();
// -> List `1[ String ]

7 / 22
Generics in Java
Code:
ArrayList <String > list1 = new ArrayList <String >();
list1 .add(" hello ");
String s = list1 .get (0);
ArrayList <Integer > list2 = new ArrayList <Integer >();
list2 .add (42);
int i = list2 .get (0);

Decompiled:
ArrayList list1 = new ArrayList ();
list1 .add(" hello ");
String s = ( String ) list1 .get (0);
ArrayList list2 = new ArrayList ();
list2 .add( Integer . valueOf (42));
int i = (( Integer ) list2 .get (0)). intValue ();
8 / 22
Generics in C#
Code:
List <string > list1 = new List <string >();
list1 .Add(" hello ");
string s = list1 [0];
List <int > list2 = new List <int >();
list2 .Add (42);
int i = list2 [0];

Decompiled:
List <string > list = new List <string >();
list.Add(" hello ");
string text = list [0];
List <int > list2 = new List <int >();
list2 .Add (42);
int num = list2 [0];
9 / 22
Generics
List factory method example

public class ListFactory {
public static <T> List <T> newList () {
// ^^^
return new ArrayList <T >();
}
}
// use with
List <String > list = ListFactory . newList ();

10 / 22
Generics
List factory method example

public class ListFactory
{
public static IList <T> newList <T >()
// ^^^
{
return new List <T >();
}
}
// use with
IList <int > list = ListFactory .newList <int >();
// Does not work:
IList <int > list = ListFactory . newList ();
// The type arguments for method
// ListFactory .newList <T >() ' cannot be inferred
// from the usage .
// Try specifying the type arguments explicitly .
11 / 22
Generics
Constraints

<T extends Comparable <T>> T max(T a, T b) {
if (a. compareTo (b) > 0)
return a;
else
return b;
}
T max <T >(T a, T b)
where T : IComparable <T>
{
if (a. CompareTo (b) > 0)
return a;
else
return b;
}
12 / 22
Generics
Constraints

where T : ClassOrInterface,
same as T extends ClassOrInterface
where T : new(), T has a parameterless constructor.
where T : class, T is a reference type.
where T : struct, T is a value type.

13 / 22
Keywords

Visibility
Common: public, protected, and private
Java: Package visibility.
C#: internal and protected internal
final vs. sealed (for methods and classes)
final vs. readonly (for members)
for (T item : items) vs. foreach (T item in items)
instanceof vs. is
Foo.class vs. typeof(Foo)

14 / 22
Exceptions

Java
Must throw a Throwable
Has checked and unchecked exceptions
Re-throw with throw e;

C#
Must throw an Exception
Has no checked exceptions
Re-throw with throw;
throw e; has a different semantic

15 / 22
Speci c features of Java

Anonymous inner classes
static import

16 / 22
Speci c features of C#

First class properties
using blocks
Preprocessor
Delegates and lambda expressions
LINQ

17 / 22
Speci c features of C#
using blocks

// using ( IDisposable )
static String ReadFirstLineFromFile ( String path) {
using ( StreamReader reader = File. OpenText (path )) {
return reader . ReadLine ();
}
}
// http :// download .java.net/jdk7/docs/ technotes /
// guides / language /try -with - resources .html
// try ( AutoClosable )
static String readFirstLineFromFile ( String path)
throws IOException {
try ( BufferedReader br =
new BufferedReader (new FileReader (path )) {
return br. readLine ();
}
}
18 / 22
Speci c features of C#
Preprocessor

public static void Main( string [] args)
{
#if DEBUG
Console . WriteLine (" Debug ␣...");
# endif
Console . WriteLine (" Hello ");
}

19 / 22
Speci c features of C#
Delegates and lambda expressions

public delegate bool Predicate <T>(T obj );
public static void Main( string [] args)
{
List <string > list = new List <string >{
" Hello ", " World ", "what 's", "up"
};
Predicate <String > shortWord ;
shortWord = delegate ( string s) { return s. Length < 4;};
shortWord = s => s. Length < 4;
list.Find( shortWord );
// or just
list.Find(s => s. Length < 4);
}

20 / 22
Speci c features of C#
LINQ

public static void Main( string [] args)
{
var list = new List <string > {
" Hello ", " World ", "what 's", "up"
};
var result = from item in list select item. Length ;
foreach (int i in result ) {
Console . WriteLine (i);
// -> 5, 5, 6, 2
}
}

21 / 22
Speci c features of C#
More features

Operator overloading
dynamic pseudo-type
yield keyword, similar to Python
Extension methods
Expression trees
Explicit interfaces
Partial classes
…
See http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java

22 / 22

C# / Java Language Comparison

  • 1.
    . . C# / JavaLanguage Comparison Robert Bachmann April 4, 2011 1 / 22
  • 2.
    Outline My favorite pitfalls Commonconventions Type system Generics Keywords Exceptions Speci c features of Java Speci c features of C# 2 / 22
  • 3.
    My favorite pitfalls str== "hello" Checks equality in C#. Checks identity in Java. Virtual methods Opt-out in Java (final keyword) vs. opt-in in C# (virtual keyword) Dates new GregorianCalendar(2011, 3, 4)1 vs. new DateTime(2011,4,4) 1 Hint: use YodaTime, Date4J, … 3 / 22
  • 4.
    Common conventions Package names/ Namespaces: org.acme.foo vs. Acme.Foo Interfaces: Supplier vs. ISupplier Methods: doSomething vs. DoSomething Opening braces: Same line in Java vs. next line in C# 4 / 22
  • 5.
  • 6.
    Type system Java hasreference and primitive types. C# has reference and value types. Uses an uni ed type system, for example you can do 42.ToString() It’s possible to create custom value types: public struct Point { public int X { get; set; } public int Y { get; set; } public override string ToString () { return String . Format ("({0} ,{1})", X, Y); } } 6 / 22
  • 7.
    Generics Java uses typeerasure. Generics are (mostly) a compiler feature. new ArrayList <Integer >(). getClass (); // -> ArrayList new ArrayList <String >(). getClass (); // -> ArrayList C# uses rei ed generics. Generics are a runtime feature. new List <int >(). GetType (); // -> List `1[ Int32 ] new List <string >(). GetType (); // -> List `1[ String ] 7 / 22
  • 8.
    Generics in Java Code: ArrayList<String > list1 = new ArrayList <String >(); list1 .add(" hello "); String s = list1 .get (0); ArrayList <Integer > list2 = new ArrayList <Integer >(); list2 .add (42); int i = list2 .get (0); Decompiled: ArrayList list1 = new ArrayList (); list1 .add(" hello "); String s = ( String ) list1 .get (0); ArrayList list2 = new ArrayList (); list2 .add( Integer . valueOf (42)); int i = (( Integer ) list2 .get (0)). intValue (); 8 / 22
  • 9.
    Generics in C# Code: List<string > list1 = new List <string >(); list1 .Add(" hello "); string s = list1 [0]; List <int > list2 = new List <int >(); list2 .Add (42); int i = list2 [0]; Decompiled: List <string > list = new List <string >(); list.Add(" hello "); string text = list [0]; List <int > list2 = new List <int >(); list2 .Add (42); int num = list2 [0]; 9 / 22
  • 10.
    Generics List factory methodexample public class ListFactory { public static <T> List <T> newList () { // ^^^ return new ArrayList <T >(); } } // use with List <String > list = ListFactory . newList (); 10 / 22
  • 11.
    Generics List factory methodexample public class ListFactory { public static IList <T> newList <T >() // ^^^ { return new List <T >(); } } // use with IList <int > list = ListFactory .newList <int >(); // Does not work: IList <int > list = ListFactory . newList (); // The type arguments for method // ListFactory .newList <T >() ' cannot be inferred // from the usage . // Try specifying the type arguments explicitly . 11 / 22
  • 12.
    Generics Constraints <T extends Comparable<T>> T max(T a, T b) { if (a. compareTo (b) > 0) return a; else return b; } T max <T >(T a, T b) where T : IComparable <T> { if (a. CompareTo (b) > 0) return a; else return b; } 12 / 22
  • 13.
    Generics Constraints where T :ClassOrInterface, same as T extends ClassOrInterface where T : new(), T has a parameterless constructor. where T : class, T is a reference type. where T : struct, T is a value type. 13 / 22
  • 14.
    Keywords Visibility Common: public, protected,and private Java: Package visibility. C#: internal and protected internal final vs. sealed (for methods and classes) final vs. readonly (for members) for (T item : items) vs. foreach (T item in items) instanceof vs. is Foo.class vs. typeof(Foo) 14 / 22
  • 15.
    Exceptions Java Must throw aThrowable Has checked and unchecked exceptions Re-throw with throw e; C# Must throw an Exception Has no checked exceptions Re-throw with throw; throw e; has a different semantic 15 / 22
  • 16.
    Speci c featuresof Java Anonymous inner classes static import 16 / 22
  • 17.
    Speci c featuresof C# First class properties using blocks Preprocessor Delegates and lambda expressions LINQ 17 / 22
  • 18.
    Speci c featuresof C# using blocks // using ( IDisposable ) static String ReadFirstLineFromFile ( String path) { using ( StreamReader reader = File. OpenText (path )) { return reader . ReadLine (); } } // http :// download .java.net/jdk7/docs/ technotes / // guides / language /try -with - resources .html // try ( AutoClosable ) static String readFirstLineFromFile ( String path) throws IOException { try ( BufferedReader br = new BufferedReader (new FileReader (path )) { return br. readLine (); } } 18 / 22
  • 19.
    Speci c featuresof C# Preprocessor public static void Main( string [] args) { #if DEBUG Console . WriteLine (" Debug ␣..."); # endif Console . WriteLine (" Hello "); } 19 / 22
  • 20.
    Speci c featuresof C# Delegates and lambda expressions public delegate bool Predicate <T>(T obj ); public static void Main( string [] args) { List <string > list = new List <string >{ " Hello ", " World ", "what 's", "up" }; Predicate <String > shortWord ; shortWord = delegate ( string s) { return s. Length < 4;}; shortWord = s => s. Length < 4; list.Find( shortWord ); // or just list.Find(s => s. Length < 4); } 20 / 22
  • 21.
    Speci c featuresof C# LINQ public static void Main( string [] args) { var list = new List <string > { " Hello ", " World ", "what 's", "up" }; var result = from item in list select item. Length ; foreach (int i in result ) { Console . WriteLine (i); // -> 5, 5, 6, 2 } } 21 / 22
  • 22.
    Speci c featuresof C# More features Operator overloading dynamic pseudo-type yield keyword, similar to Python Extension methods Expression trees Explicit interfaces Partial classes … See http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java 22 / 22