Programming Languages

Java from a C# Developer’s mind

This post is intended mainly towards developers trying to switch between the two almost similar languages.

Let us start with the similarities, so that you are motivated enough to break the ice

  • Java and C# both are Object oriented languages
  • Both are compiled to an Intermediate language
    • Java (Byte Code)
    • C#(MSIL)
  • They both run on a Virtual machine
    • Java(Java Virtual Machine)
    • C#(Common Language Runtime)
  • Primitive types exist in both languages which basically are not Reference Types hence more performant as they don’t burden the Garbage Collector(stored on the stack) neither they are decorated with Headers for taking care of any locking mechanism, Inheritance, storing Hashcode etc.
  • Multiple class inheritance is not allowed.
  • Multiple Interface Inheritance is allowed.
  • Threading API is almost similar – Starting a thread and synchronization between threads.
  •  I/O operations can be done Asynchronously in both languages.
  • There is Garbage Collector at your rescue in both C# and Java. How the Algorithm works(There are different Garbage Collection algorithms in both JVM and CLR which you can configure ) is also similar. Like in C# you have GEN0, GEN1.. there are Young, Old and Perm area in Java


  • There is no LINQ in Java, So if you are a Lambda fan then you will not feel at home with Java
  • You cannot do functional programming in Java like we can do using C# using Lambda Expressions
  • Enumerations are full blown Objects in Java where as they are Value Types in C#
  • Generics are implemented very differently in both languages, C#’s Generics are real in the sense that the compiler generates a class with the Type information, whereas in Java the Type information is not available at ByteCode level.
  • There are no Value types in Java except for the primitive types. C# has value types which are called Structures
  • No operator overloading in Java

Final words

According to me, C# scores higher when it comes to features and being a cleaner language(I like use of ‘:‘ for Inheritance than saying ‘extends‘ :-P).

At the same time they are similar enough, hence the learning curve from one to another is not quite steep. There is no big deal knowing both languages and using the right one at the right place which is often driven by the OS you are using or a particular API available in one of the languages.