C# 11 中的 file local type

C# 11 中的 file local type

Intro

在之前的版本中,我们想要一个类型只在当前的类型中生效,通常我们会在一个类的内部声明一个 private 的类型以此来控制这个类型的访问权限,在 C# 11 中引入了一个 file local type,仅在声明类型的这个文件中可以访问,这样我们就可以不用声明成一个私有类型了,下面就来看个示例吧

Sample

C# 11 新增加了一个 file 关键词,这个关键词也属于访问修饰符的一种,用于限定类型只有当前文件有效,使用和其他访问修饰符类似,使用示例如下:

file class FileLocalTypeSample2
{public int Age { get; set; } = 10;
}

file 本身就是一个访问修饰符,所以它不能再与其他访问修饰符一起使用,比如说 public/internal/private 等一起使用,否则会看到一个类似下面这样的一个错误

5d6902e45e5860078fe9369581345d16.png

file 是一个类型修饰符,只能用于类型,方法、属性等成员不能使用,也会报错

aeccd2a585b2f4735520dd51609e3d7d.png

file 不限于 class 也可以用于接口、结构体以及 C# 9/10 引入的 record

file class FileLocalTypeSample2
{public int Age { get; set; } = 10;
}file record FileLocalRecord();file struct FileLocalStruct
{public string RecordName => nameof(FileLocalRecord);
}file record struct FileLocalRecordStruct { }file interface IAnimal
{string Name => GetType().Name;
}file class Cat : IAnimal { }class Dog : IAnimal { }

当你尝试在另外一个文件中尝试访问 file 修饰的类型时,会访问不到,比如说上面定义的类型是在 FileLocalTypeSample2.cs 文件中,而下面尝试访问则是在 FileLocalTypeSample.cs 文件中,就会报错,如下所示

e493abab3a9b50b7e582213974506c0a.png

那么它是怎么实现的呢,我们可以反编译一下我们生成的 dll,我们可以找到有一个类型和我们定义的 FileLocalTypeSample2 是一样的,反编译结果如下

28f00122ca16022fdb1033e41b1e65fa.png

可以看到,我们用 file 声明的名称其实变掉了,实际的类型修饰符是 internal 的,这也意味着我们是有机会来访问到这个类型的,那我们就来试一下

首先直接引用这个类型,编译器会报错,类型不存在

3680b968f8955d0086f4f9d2cc0c5748.png

既然不能直接访问,那我们来尝试一下反射吧,从下图可以看到我们成功通过反射获取到了这一类型

7d0c6f58b812172c77d577d7bb94a1c0.png

接着我们可以创建一个实例来试试

b8765f2569852b22c275bd1b0ae43d90.png

可以看到我们成功的创建的一个实例,并获取了其中 Age 属性的值

More

从上面的示例,我们可以看得出来, file 关键词是一个在编译器层面实现的特性,本质是由编译器生成了一个 internal的类型再加一些编译检查来限制只能在声明的文件中进行访问,前面虽然我们通过反射的方式创建了file 修饰的类型,但是并不推荐这样做,随着编译器的更新生成的规则一旦变化就可能会 break

有一些不想不暴露出去的类型之前可能是声明一个 private  的类型,有了这个特性之后就可以多一种选择了~~

References

  • https://github.com/dotnet/csharplang/issues/6011

  • https://github.com/dotnet/csharplang/blob/main/proposals/file-local-types.md

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp11Sample/FileLocalTypeSample.cs

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp11Sample/FileLocalTypeSample2.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP实现类似百度搜索自动完成(代码简单)

一、效果图: 二、HTML代码 <html lang"en"> <head><meta charset"utf-8"><title>jQuery UI 自动完成&#xff08;Autocomplete&#xff09; - 默认功能</title><link rel"stylesheet" href"/public/Auto…

CentOS 搭建Postfix+Dovecot简单邮件系统

2019独角兽企业重金招聘Python工程师标准>>> 服务器信息 系统&#xff1a;CentOS 6.5 minimal版本 主机&#xff1a;虚拟机 虚拟机IP&#xff1a;192.168.128.128/24 宿主IP:10.1.79.24/24 安装postfix 注意&#xff1a;CentOS 7实际上已经用postfixSasl2代替sendma…

php面试题2018

一 、PHP基础部分 1、PHP语言的一大优势是跨平台&#xff0c;什么是跨平台&#xff1f; PHP的运行环境最优搭配为ApacheMySQLPHP&#xff0c;此运行环境可以在不同操作系统&#xff08;例如windows、Linux等&#xff09;上配置&#xff0c;不受操作系统的限制&#xff0c;所以…

学生党的专属定制福利,你想要的这里全都有!

同学们&#xff1a;您好&#xff01;很⾼兴认识⼤家&#xff01;我是微软的 Regional Cloud Advocate Kinfey Lo&#xff0c;感谢您在课余时间打开这封信。踏⼊⾦秋&#xff0c;技术峰会进⼊了旺季&#xff0c;有⾯向商业的&#xff0c;有⾯向开发者的&#xff0c;有⾯向技术社…

Quartus prime16.0 与modelsim ae 联调

前言 quartus和modelsim联调对仿真还是很方便的&#xff0c;当然最好是quartus干综合到烧录的活&#xff0c;modelsim单独仿真。而且ae版的性能比se版差。 流程&#xff1a; 1.配置modelsim ae路径&#xff1a; 我这里是这个路径&#xff0c;根据你自己安装的地方配置路径。 2.…

30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)

去年八月时要做一个OA系统为了后台界面而烦恼&#xff0c;后来写了一篇博客&#xff08;《后台管理UI的选择》&#xff09;介绍了选择过程与常用后台UI&#xff0c;令我想不到的时竟然有许多开发者与我一样都为这个事情而花费不少时间&#xff0c;最后界面效果还是不佳&#xf…

分析拼多多的崛起【产品思维】

最近朋友圈讨论拼多多上市的新闻大火&#xff0c;各有各的看法&#xff0c;很有意思&#xff0c;突然想起前段时间得到上的《梁宁-产品思维30讲》&#xff0c;所以想从数据和产品角度分析分析拼多多的崛起。 一&#xff1a;拼多多的迅速崛起 我们先看看拼多多这几年的成长历程&…

KestrelServer详解[2]: 网络连接是如何创建的?

《KestrelServer详解[1]&#xff1a;注册监听终结点&#xff08;Endpoint&#xff09;》已经详细讲述了如何使用KestrelServer&#xff0c;现在我们来简单聊聊这种服务器的总体设计和实现原理。当KestrelServer启动的时候&#xff0c;注册的每个终结点将转换成对应的“连接监听…

支付宝支付开发流程

支付宝开发流程1、首先我们先谈谈第三方支付所谓第三方支付就是和一些各大银行签约&#xff0c;并具备一定实力和信誉保障的第三方独立机构提供的交易平台目前市面上常见的有支付宝&#xff0c;财付通&#xff0c;网银&#xff0c;易宝支付等&#xff0c;网站需要实现第三方支付…

MQ消息队列之MSMQ

主要参考文章&#xff1a; 消息队列&#xff08;Message Queue&#xff09;简介及其使用 转载于:https://www.cnblogs.com/mailaidedt/p/6599130.html

css选择器总结

一.选择器 1. css1选择器 2.css2选择器 3.css3选择器 4.:nth-of-type(n)和:nth-child(n)区别 (1).在不指定类型时&#xff0c;nth-child(n)选中的是父元素下的第N个子元素。nth-of-type(n)选中的是父元素下的不同类型标签的第N个。(2).在指定具体元素时,ele:nth-child(n)要求不…

Hypercrx:开源项目不只有Star

01战队简介大家好&#xff0c;我们是Hypercrx战队&#xff0c;非常荣幸获得了首届Microsoft Edge浏览器开拓者大赛的一等奖&#xff01;我是队长唐烨男&#xff08;中&#xff09;&#xff0c;位于我左侧的是宁志成&#xff0c;右侧的是林以任&#xff0c;我们都来自华东师范大…

PHP上传图片到数据库,并进行显示

1、创建数据表 CREATE TABLE ccs_image (id int(4) unsigned NOT NULL auto_increment,description varchar(250) default NULL,bin_data longblob,filename varchar(50) default NULL,filesize varchar(50) default NULL,filetype varchar(50) default NULL,PRIMARY KEY (id)…

.NET 反向代理-YARP

什么是 YARPYARP (另一个反向代理) 设计为一个库&#xff0c;提供核心代理功能&#xff0c;你可以根据应用程序的特定需求进行自定义。YARP 是使用 .NET的基础架构构建在 .NET上的。YARP 的主要不同之处在于&#xff0c;它被设计成可以通过 .NET 代码轻松定制和调整&#xff0c…

JavaScript 开发的45个经典技巧

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a;此篇译文在各网站均有标注原创的声明&#xff0c;译者名字已不可考&#xff0c;暂为佚名 JavaScript是一个绝冠全球的编程语言&#xff0c;可用于Web开发、移动应用开发&#xff08;PhoneGap、Appcelera…

回归远程 - 云原生IDE是IaC从表象触达本质的必然选择 | SmartIDE

作者&#xff1a;徐磊&#xff0c;开源云原生SmartIDE创始人、LEANOSFT创始人/首席架构师/CEO&#xff0c;微软最有价值专家MVP/微软区域技术总监Regional Director&#xff0c;华为云最有价值专家。从事软件工程咨询服务超过15年时间&#xff0c;为超过200家不同类型的企业提供…

[BZOJ]1095 Hide捉迷藏(ZJOI2007)

一道神题&#xff0c;两种神做法。 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻&#xff0c;并且他们有很多孩子。某天&#xff0c;Jiajia、Wind和孩子们决定在家里玩捉迷藏游戏。他们的家很大且构造很奇特&#xff0c;由N个屋子和N-1条双向走廊组成&#xff0c;这N-1条走…

Spring4-自动装配Beans-通过注解@Autowired在构造方法上

1.创建Maven项目,项目名称springdemo19,如图所示2.配置Maven,修改项目中的pom.xml文件,修改内容如下<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://mave…

15个开源的工业软件

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013)不同的工业流程&#xff0c;需要不同的工业软件。此前&#xff0c;我们已经介绍了面向研发设计环节的开源软件&#xff08;详情查看&#xff1a;20 个开源的工业设计软件&#xff09;&#xff0c;今天就来介绍一下面向…

MySQL远程访问报错解决

2019独角兽企业重金招聘Python工程师标准>>> 我之前的一篇博客讲了MySQL配置远程访问的方法&#xff0c;但是可能配置了账户以后还是不能访问&#xff0c;这可能是防火墙的原因&#xff0c;在CentOS里&#xff0c;我们修改一下防火墙设置就可以了 1. 进入防火墙配置…