C# NET框架的哪些部分实际上是语言的一部分?
我想知道C# NET框架的哪些部分实际上是语言的一部分?,c#,C#,我想知道系统的哪些部分是语言特性(核心组件),哪些部分只是有用的填充,但不是严格必需的。我可能对这里的措辞不太理解,所以让我用一个例子来说明我的意思 考虑一下System.Consoleclass,它显然是用于非常特殊的东西。本质上,这是为了更好地利用Windows/current OS的一项功能。这不是我所说的语言的核心部分 另一方面,使用System.IDisposable界面。这一点显然非常重要,因为没有它,using()语句就毫无用处。一个类需要实现这个特定的接口,才能启动语言功能 我可
系统的哪些部分是语言特性(核心组件),哪些部分只是有用的填充,但不是严格必需的。我可能对这里的措辞不太理解,所以让我用一个例子来说明我的意思
考虑一下System.Console
class,它显然是用于非常特殊的东西。本质上,这是为了更好地利用Windows/current OS的一项功能。这不是我所说的语言的核心部分
另一方面,使用System.IDisposable
界面。这一点显然非常重要,因为没有它,using()
语句就毫无用处。一个类需要实现这个特定的接口,才能启动语言功能
我可以假设mscorlib
是这里的责任方。快速浏览一下objectexplorer,可以发现它确实包含了许多我认为是核心的组件,同时它将控制台
类放入系统名称空间,这只是一个填充
将填充对象和特定于语言的对象放在同一个名称空间的概念等同于它们,但是为了更深入地理解C#,我想知道哪个是哪个。因此,我正在寻找C#的核心组件列表。我假设某个地方有一个方便的参考,但由于我在谷歌讲座期间睡着了,所以我无法形成正确的查询来找到它
提前谢谢
很久以后编辑我读了Lippert的博客文章,有点相关。有趣的是,foreach
构造实际上并不需要IEnumerable
接口才能工作。C实际需要的类型并不多。通过快速检查规格,我可以在脑海中想到这些:
- 系统对象
- 系统枚举
- System.ValueType
- 基本类型:System.{Int16、Int32、Int64、UInt16、UInt32、UInt64、Byte、SByte、Double、Single、Char、Boolean}
- 系统字符串
- 十进制
- 系统。可为空
- 系统数组
- 系统异常(和各种子类-见规范第16.4节)
- System.Delegate(可能还有System.MulticastDelegate)
- System.IDisposable
- 属性(以及一些特定属性,如ConditionalAttribute和ObsoleteAttribute)
- 系统类型
- System.Collections.IEnumerable/IEnumerator
- System.Collections.Generic.IEnumerable/IEnumerator
- System.Collections.Generic.IList
- System.Threading.Monitor
- 系统。线程。联锁
- System.Linq.Expressions.Expression
- C#5的任务和任务
- System.GC(在规范中提到,但编译器AFAIK未明确使用)
现在,任何目标框架都需要比课程实现更多的类型——如注释中提到的MethodInfo
,可能需要属性来修饰参数(以及一大堆其他类型的动态类型)。但是不同的目标系统可能有不同的实现——在编写真正可移植的C#时,你不能依赖它们。也许寻找语言的“核心”类型是错误的起点
任何.NET应用程序都由CLR运行,因此更重要的观点是“CLR的基本部分/类是什么”
这也确实有助于理解C
Expression
类(不仅仅是Expression
),因为C#可以将lambda转换为表达式
IEnumerator
,IEnumerator
由foreach
和yield
迭代器使用
- 一些神奇的属性,用于支持关键字
dynamic
、params
、out
和扩展方法
System.Type
据我所知,C#和Objective-C等语言只是一些语法,带有数学库和一些核心函数,如if语句和循环。有一些语言级别的东西,但它们严重依赖于为其设计的框架。目标C将是具有不同语法和设计模式的C,没有Cocoa.and System.Monitor(用于lock
)和Type
用于typeof(…)
@Eamon:不一定-您可以使用Edulinq,例如:)LINQ基于模式而不是该模式的任何特定实现,这是一种设计功能。@Eamon因为LINQ只在方法名称上工作,所以不需要对IEnumerable
/IQueryable
进行特殊处理IEnumerable
当然会受到其他语言功能(迭代器)的特殊处理,但我认为,IQueryable
不会。我们怎么会忘记StackOverflowException
;-)虽然编译器确实使用属性来修饰动态、参数等,但我不认为它们是规范的一部分-因此不同的目标平台可能会使用不同的类型。是的,我在这里列出了C#编译器的常见实现所特别处理的类型,而且,foreach不仅需要spec.IEnumerator所要求的那些,因为它是基于模式的。foreach
不完全基于模式。特别是,如果GetEnumerator()
是IEnumerator
的显式接口实现,那么它将起作用。规范基本上说,首先执行模式匹配,如果失败,则返回接口。因此,在foreach
编译器代码中,这些接口确实是特殊情况,foreach
的规范明确提到了它们。我不认为C#的所有核心组件都一定是CRL的核心组件,尽管我承认有很大的重叠。从我的头上