【问题标题】:Declarations vs definitions声明与定义
【发布时间】:2018-09-21 07:47:42
【问题描述】:

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

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

在 C++ 中,这很明显,但在 C# 中,从 ECMA 标准和 MSDN 中我可以看出,一切都是声明,并且在使用定义一词的地方,它与声明的含义相同。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    在使用定义一词的地方,它与声明的意思相同

    正确。

    由于它们的编译模型,在 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# 可以。

    【讨论】:

      【解决方案2】:
      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++ 中: int x=10; // 不是声明,严格来说是定义。这就是我对 C# 术语感到困惑的原因。此外,C++ 允许与类定义完全不同的类声明。 C# 允许部分类和完全定义的类,但两者似乎都是声明!
      • @michael:不,两者都是定义。
      • @michael:部分类只是一个类拆分为多个源文件。有些成员在一个文件中定义,有些则在其他文件中。
      • @michael,我不明白什么是声明,什么是定义?我认为在 c++ int x = 10;是定义和声明。你能解释一下吗?
      • 让我建议阅读 C++ 规范以尝试理解 C# 语义是愚蠢的。只需阅读 C# 规范! =)
      【解决方案3】:

      C++ 构建模型可以追溯到铁氧体磁芯一打一美元的时代。多个源代码文件一次编译一个。使用单遍编译器。将所有内容粘合在一起的链接器。这就需要在头文件和原型中单独声明。

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 我倾向于同意,不过,我不确定 C# 社区是否真的会关心这种区别。
        【解决方案5】:

        不是因为 C# 不需要区分。

        【讨论】:

          【解决方案6】:

          根据 Kernighan & Ritchie 在“C 编程语言”中的说法: “声明”宣布变量的属性;它由名称和变量列表组成,例如: int fahr, 摄氏度;

          根据 Stroustrup 在“C++ 编程语言”中的说法: “声明”是将名称引入程序的语句。它指定该名称的类型。类型定义了名称或表达式的正确使用。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-28
            • 2022-01-02
            • 2020-10-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多