They can help provide "hidden" classes:
public class MyClass
{
private class MyNestedClass
{
public MyNestedClass()
{
}
}
public void AMethod()
{
MyNestedClass mnc = new MyNestedClass();
}
}
Only MyClass can create instances of MyNestedClass - or indeed see it - classes outside don't even know it's there.
They can also help to "group" classes which might have common names together into the "umbrella" of the containing class. That way, you have to use the fully qualified class name to use it and it doesn't conflict with any other class name:
public void MyMethod()
{
MyClass.MyNestedClass mnc = new MyClass.MyNestedClass();
}
}
public class MyClass
{
public class MyNestedClass
{
public MyNestedClass()
{
}
}
}