C#和CLR存在混淆,哪些功能值得严格描述为C#功能?

时间:2008-11-19 11:26:38

标签: c# .net clr

我必须写几句关于C#的文字,一般都是小菜一碟?没有!

我搜索了各种互联网资源和书籍,我得到的是一种令人头痛的问题。例如垃圾收集器一些消息来源说这是C#功能,其他CLR获得此功能,C#以及所有其他.NET语言默认获得它。当然,我对CLR的投票,但还有很多其他事情会引起混淆,比如避免明确的代码转换。也许我有糟糕的书籍和资源......所以也许有人会建议一些地方以清晰的方式讲述C#

第二件事是C#语法的起源,同样很少有选择,没有什么是明确的,其他语言组合是彼此的作者。 C,c ++,Java,没关系,但VB6和Delphi,我有疑问。而且这些语言的特征来源与c#混合在一起,但实际上不清楚它是否是C#或CLR特征

MTH

5 个答案:

答案 0 :(得分:6)

GC由CLR提供

C#是语言规范所声明的所有内容,而不再是。

一些更有趣的事实上是C#特征:

  • 迭代器块[yield return]
  • 匿名方法/闭包/ lambdas [语法,不要与表达式树混淆]

但是,与您键入的代码相关但不是由CLR或框架直接提供的任何内容都是语言功能。当然,其他语言也可以实现它们......

  • 使用[try / finally / Dispose]
  • lock [Monitor.Enter / try / finally / Monitor.Exit]
  • foreach [GetEnumerator()/ while / [Dispose]]
  • 扩展方法解析
  • 查询语法[“where pred”to .Where(x => pred)etc]

(这些只是当然的几个例子;而且 - 其他语言也可以自由提供这些功能!)

答案 1 :(得分:3)

GC本身是一个CLR功能,但C#语言假定它在一个带有垃圾收集的平台上运行 - 没有定义确切的语义。

精确确定是一件很难的事,但一个粗略的经验法则是“如果它在语言规范中得到很好的定义,它就是一个C#特征。”

如果您可以提供更多功能的分类示例(“避免显式代码转换”不是语言功能,除非您想提供更多详细信息),这将有所帮助。

答案 2 :(得分:0)

CLR是一个开发平台,一个运行时环境,支持用其中一种.NET语言编写的托管代码,其中C#是其中之一。垃圾收集是CLR功能。与托管代码的代码访问安全性和及时编译一样。

答案 3 :(得分:0)

您可以使用C#语言规范。以下是参考资料:

  1. C# Specification (MSDN)
  2. Standard ECMA-334 C# Language Specification

答案 4 :(得分:0)

  

第二件事是C#语法的起源,同样很少有选择,没有什么是明确的,其他语言组合是彼此的作者。 C,c ++,Java,没关系,但VB6和Delphi,

C#从VB获得的东西:

  • 属性
  • 活动
  • For-Each循环
  • 模块,在C#中声明为“静态类”
  • 使用默认属性使类像数组一样工作
  • 晚期绑定(C#4)
  • 整数溢出检查(C,C ++和Java无法检测何时溢出整数)
  • 用于调用C ++ dll的P / Invoke

在某种方式中可选参数(C#4),但实际上来自COM。