声明与定义

在C#中,声明与定义有何不同,即:

  1. 类声明与类定义
  2. 变量声明与定义
  3. 方法参数声明与定义

在C ++中,这是相当明显的,但在C#中我从ECMA标准和MSDN中可以看出,一切都是声明,在使用单词定义的地方,它用于表示与声明相同的东西。

  1. 这种区别不存在。 您指的是声明的范围,定义点与变量/字段的范围无关。

  2. int x; // 'x' is declared x = 10; // 'x' is assigned int y = 20; // 'y' is both declared and assigned 
  3. 这没有多大意义。 方法参数在方法签名中声明。

我认为你对1和3中的术语有点困惑。

在使用单词定义的地方,它用于表示与声明相同的内容

正确。

由于其编译模型,C和C ++中需要将“声明”作为软/前向定义的概念。 C ++(概念上)使用单通道编译,C#是多通道。 考虑:

 class Bar; // declaration: needed in C++, illegal and unnecessary in C# class Foo // start of definition, counts as a declaration of Foo { Foo f; // use of declared but still incompletely defined class Foo Bar b; // use of declared but still undefined class Bar } class Bar // definition and re-declaration { } 

如果没有声明,C ++就无法处理Bar b字段。 C#可以。

C ++构建模型可以追溯到铁氧体核心价格为十几美元的时代。 一次编译一个多个源代码文件。 使用单通道编译器。 链接器将所有内容粘合在一起。 这使得头文件和原型中的单独声明成为必要。

C#编译器充分利用了现代机器资源。 构成程序集的所有源代码文件都是同时编译的,编译器至少进行两次传递,因此它可以在方法体之前解析声明。 还有一种可能的链接模型,但很少使用它。

声明必须匹配我能想到的定义的唯一概念是必须匹配目标方法的委托类型和必须匹配其具体实现的接口成员声明。

它不是因为C#不必区分。

原问题1,2,3的答案:C#没有区别

但是可能值得一提的是关于方法的那些术语:

  • 声明Interface中 ,我们只是“声明”方法的签名
  • 定义是我们“定义”声明的先前方法的实际实现的实际位置。 (与“ 实施 ”相同)

根据Kernighan&Ritchie在“C程序设计语言”中的说法:“声明”宣布了变量的属性; 它由一个名称和一个变量列表组成,例如:int fahr,celsius;

根据Stroustrup在“The C ++ Programming Language”中的说法:“声明”是一个在程序中引入名称的声明。 它指定该名称的类型。 类型定义了名称或表达式的正确使用。

这两本书都没有具体定义“定义”。 但两者都使用科学意义上的变量值。 因此,函数声明声明了函数的调用签名。 函数定义包含实际代码。

因为过去的编译器需要在这些语言中具有单独的含义。 在实际使用名称之前,他们需要提前知道名称的类型。 否则他们需要再次通过源代码。