声明与定义

Mic*_*eyn 11 .net c#

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

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

在C++中,这是相当明显的,但在C#中我从ECMA标准和MSDN中可以看出,一切都是声明,并且在使用单词定义时,它用于表示与声明相同的内容.

Hen*_*man 19

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

正确.

由于编译模型,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  
{
}
Run Code Online (Sandbox Code Playgroud)

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


Ed *_* S. 11

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

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

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

  • 让我建议,为了尝试理解C#语义,阅读C++规范是愚蠢的.刚看完C#规范!=) (3认同)

Han*_*ant 10

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

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

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


Dmy*_*ach 5

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

然而,关于方法的这些术语可能值得一提:

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

  • 我倾向于同意,但我不确定 C# 社区是否真的愿意做出这种区分。 (2认同)