C SharpとJavaの比較
いずれの言語もネストされた型(入れ子にされた型:クラスや構造体のブロックの中で定義されたクラス・構造体・列挙型・インターフェイス)をサポートする。Javaではインターフェイス内部にクラスや列挙型を定義することもできる。C#ではインターフェイス内部にクラス・構造体・列挙型・インターフェイスを定義することはできない。
Javaでは、ネストされたクラス (nested class) は既定で内部クラス (inner class) となる。内部クラスは外側のクラスのインスタンスを暗黙的にキャプチャすることで、静的メンバ、非静的メンバいずれにもアクセスすることができる。ネストされたクラスがstatic修飾されていた場合は静的メンバのみにアクセスできる。メソッドの内部にクラスを定義することもでき、これはローカルクラス (local class) と呼ばれる。
JavaおよびC#はともに標準ライブラリでスレッドをサポートしている。OSのスレッドに対する薄い抽象化を提供するクラスとして、Javaにはjava.lang.Thread、C# (.NET) にはSystem.Threading.Threadが用意されている。そのほか、セマフォなどの同期オブジェクトやアトミック演算なども標準ライブラリでサポートされている。
言語組み込みの同期構文として、Javaにはsynchronizedブロックおよびsynchronizedメソッドが用意されている。C#にはlockステートメントが用意されている。
C# 5.0以降はasync/awaitコンテキストキーワードによる非同期メソッド構文がサポートされた。async/awaitはイテレータおよび.NET 4以降で追加されたタスク並列ライブラリ (Task Parallel Library; TPL) を実行基盤とする糖衣構文であり、非同期タスクの完了待機と実行結果の取得をあたかも同期メソッドのように記述することができる。