Namespaces in C# are used to logically group classes and prevent name clashes between identically named classes. Namespaces can be system-defined, user-defined, or a default namespace created by the compiler if none is declared. Namespaces are always public and access modifiers cannot be applied, while unqualified or qualified naming and nested namespaces can be used to reference classes within namespaces.