14.07.2013 Views

Contents - Cultural View

Contents - Cultural View

Contents - Cultural View

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Comparison of Java and C Sharp 72<br />

configured to highlight them.<br />

Generics<br />

In the field of generics the two languages show a superficial syntactical similarity, but they have deep underlying<br />

differences.<br />

Type erasure versus reified generics<br />

Generics in Java are a language-only construction; they are implemented only in the compiler. The generated<br />

classfiles include generic signatures only in the form of metadata (allowing the compiler to compile new classes<br />

against them). The runtime has no knowledge of the generic type system; generics are not part of the JVM. Instead,<br />

generics classes and methods are transformed during compilation through a process known as type erasure. During<br />

this process the compiler replaces all generic types with their raw version and inserts casts/checks appropriately in<br />

client code where the type and its methods are used. The resulting byte code will contain no references to any<br />

generic types or parameters (See also Generics in Java).<br />

C# builds on support for generics from the virtual execution system itself, i.e. it is not just a language feature. The<br />

language is merely a front-end for cross-language generics support in the CLR. During compilation generics are<br />

verified for correctness, but code generation for actually implementing the generics are deferred to class-load time.<br />

Client code (code invoking generic methods/properties) are fully compiled and can safely assume generics to be<br />

type-safe. This is called reification. Unlike with the Java generics, there is no need to inject down-casts or<br />

type-checks in clients code. At runtime, when a unique set of type parameters for a generic class/method/delegate is<br />

encountered for the first time, the class loader/verifier will synthesize a concrete class descriptor and generate<br />

method implementations. During the generation of method implementations all reference types will be considered a<br />

single type, as reference types can safely share the same implementations. Note, this is merely for the purpose of the<br />

implementing code. Different sets of reference types will still have unique type descriptors; their method tables will<br />

merely point to the same code.<br />

The Java design imposes restrictions on the developer compared to the C# design. The following list is not<br />

exhaustive (see also Java Generics FAQs - Frequently Asked Questions [5] by Angelika Langer):<br />

Java C#<br />

checks and downcasts are injected into client code (the code referencing the<br />

cs). Compared to non-generic code with manual casts, these casts will be the<br />

6] . But compared to compile-time verified code which would not need runtime<br />

nd checks, these operations represent a performance overhead.<br />

ot use primitive types as type parameters; instead the developer must use the<br />

er type corresponding to the primitive type. This incurs extra performance overhead<br />

uiring boxing and unboxing conversions as well a memory and garbage collection<br />

re because the wrappers will be heap allocated as opposed to stack allocated.<br />

ic exceptions are not allowed [7] and the can not use a type parameter in a catch<br />

[8]<br />

members are shared across all generic realizations [9] (during type erasure all<br />

tions are folded into a single class)<br />

parameters cannot be used in declarations of static fields/methods or in definitions<br />

ic inner classes<br />

t "import" a particular realization of a generic class<br />

nt size="7.49"><br />

ort java.util.List // illegal<br />

ont><br />

C#/.NET generics guarantees type-safety and is verified at compile time and no extra checks/casts are necessary<br />

runtime. Hence, generic code will run faster than non-generic code (and type-erased code) which require casts w<br />

handling non-generic or type-erased objects.<br />

Primitive and value types are allowed as type parameters in generic realizations. At runtime code will be<br />

synthesized and compiled for each unique combination of type parameters upon first use. Generics which are<br />

realized with primitive/value type do not require boxing/unboxing conversions.<br />

Can both define generic exceptions and use those in catch clauses<br />

Static members are separate for each generic realization. A generic realization is a unique class.<br />

No restrictions on use of type parameters<br />

Can "import" (using directive) a specific realization with an alias<br />

<br />

using StringList = System.Collections.Generic.List

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!