One of the new features in C# 11 is File Scoped Types also known as File Local Types. Although it sounds kindof familiar to File Scoped Namespaces introduced in C# 10, it is completely unrelated.
As the name implies File Scoped types restrict the usage of a type to the current file.
The file
modifier
To use this feature a new modifier was introduced; file
. Applying this modifier to any type definition restrict its usage to the current file.
In the screenshot above you can see that I created a File
class in both the FileReader.cs
file and FileWriter.cs
file without any issues.
If I try to use this File
class outside these 2 files, I get an error:
Good to know:
- The
file
modifier can be applied toclass
, interface, record,struct
,enum
,delegate
. - It cannot be combined with another modifier like
internal
orpublic
.
When should I use this feature?
There are a few use cases I can think about where I see this feature useful:
- Code generation: Code generation is one of the places where naming collisions can easily occur. We typically solve this by using different namespaces With the file keyword it can make code generation a lot easier.
- Nested classes: One way I use to avoid naming collisions is through private nested classes. Here the file keyword can be a cleaner alternative.
What is happening behind the scenes?
To have a look at what is happening behind the scenes, I opened the compiled code in dotPeek:
As you can see above, the C# compiler renames the types to avoid naming collisions.
Nice!