C#11 file关键字
2023-02-18 16:34:13 时间
C#11 添加了文件作用域类型功能:一个新的 file 修饰符,可以应用于任何类型定义以限制其只能在当前文件中使用。这样,我们可以在一个项目中拥有多个同名的类。
通过下面的项目显示,该项目包含两个名为Answer的类。
文件File1.cs中
namespace ConsoleApp11
{
file static class Answer
{
internal static string GetFileScopeScret() => "File1.cs";
}
static class InternalClassFromFile1
{
internal static string GetString() => Answer.GetFileScopeScret();
}
}
文件File2.cs中
namespace ConsoleApp11
{
file static class Answer
{
internal static string GetFileScopeScret() => "File2.cs";
}
static class InternalClassFromFile2
{
internal static string GetString() => Answer.GetFileScopeScret();
}
}
调用这两个方法,可以正常输出
static void Main(string[] args)
{
Console.WriteLine(InternalClassFromFile1.GetString());
Console.WriteLine(InternalClassFromFile2.GetString());
}
这里有几点说明:
- 可以在其源文件之外间接访问带有file修饰符的类型。在上面的程序中,我们依赖这些类,并从 InternalClassFromFile1 与 InternalClassFromFile2中访问。
- file类也可以接口在其源文件之外间接使用,演示如下
修改File.cs中代码
namespace ConsoleApp11
{
file class Answer : IAnswer
{
public string GetFileScopeSecret() => "File1.cs";
}
internal interface IAnswer
{
string GetFileScopeSecret();
}
static class InternalClassFromFile1
{
internal static IAnswer GetAnswer() => new Answer();
}
}
调用方法,即可正常输出
static void Main(string[] args)
{
Console.WriteLine(InternalClassFromFile1.GetAnswer().GetFileScopeSecret());
}
- 任何类型的类型都可以用file修饰符标记:class, interface , record , struct, enum, delegate.
- file不能与其他修饰符(如internal or public)一起使用。
- 只要所有类型定义属于同一个文件,就可以使用分部类:
namespace ConsoleApp1 {
file static partial class Answer {
internal static string GetFileScopeSecret()
=> "Answer from File1.cs";
}
file static partial class Answer {
internal static string AnotherGetFileScopeSecret()
=> "Another Answer from File1.cs";
}
}
- file修饰符不适用于嵌套在父类型中的类型。它也不适用于方法属性、事件和字段,但语言设计说明解释说:“为非类型文件范围的成员留出设计空间,以便以后出现。”
- 在一个项目中,可以有一个internal级别类,同时可以拥有一个或多个file级别的同名类。 唯一的缺点是文件类不能在公共类中使用。
让我们强调一下,namespace仍然是避免类型名称冲突的首选方法。
相关文章
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- 【Golang】反射的三大laws
- Good-code-books 前端经典常用好书分享
- git实用复习篇之一步到位!
- Python分布式任务队列Celery,Django中如何实现异步任务和定时任务
- Django应用上线前有哪些注意事项?如何使用同步或异步容器启动Django应用?
- 跟着官方文档学Python——Django Rest framework
- Go语言基础速刷手册
- 深入Git —— 从底层对象到常用命令速刷手册
- Java基础系列(25)- break、continue、goto
- 云图说|将源端MongoDB业务搬迁至华为云DDS的几种方式
- 【Google Cloud技术咨询】「Contact Center AI」引领我们走向高度智能客服的时代
- 【Git技术专题】如何使用git中的tag进行版本开发控制?
- Golang做一个IM即时通信系统
- 为什么Go的协程调度很快?
- 读猿码系列——1. gRPC+Etcd3的服务发现&负载均衡
- 读猿码系列——3. 从filebeat和go-stash深入日志收集及处理(filebeat篇)
- 读猿码系列——4. 从filebeat和go-stash深入日志收集及处理(go-stash篇)
- 读猿码系列——5.解析Golang常用定时任务库gron和cron
- 读猿码系列——6.Golang中用幂等思路解决缓存击穿的方案:singleflight