Both Java and C-Sharp belongs to object oriented programming language. Both emphasize on object rather than function. Both of them support garbage collection so that developers don't need to free the memory occupied once the scope of program ends.
C-SHARP supports Deterministic disposal while Java doesn't support such functionality. More over Java doesn't support Object pinning (fixed to address throughout lifetime) whereas C-Sharp supports such functionality. Soft references are extensively supported by Java where C-SHARP doesn't support it.
C-SHARP allows pointer functionality which allows unsafe code to be included within the coding and on the different side Java doesn't support pointer or pointer arithmetic logic which makes it safer.
If we discuss about data types then, fixed-length strings are not there with Java but it is there in C-Sharp. Enumerations in Java are facilitating by objects, where C-Sharp provides conventional enumeration to the developers with expanded functionalities. Operator overloading is there with C-Sharp derived from C++ functionality where there is no such thing in Java.
Conditional compilation is there with C-Sharp while Java supports a uniform compilation procedure only.
-- Development article on difference between Java and C-Sharp for Java developers and .net developers. Source: http://www.articletrader.com