【发布时间】:2018-09-21 07:47:42
【问题描述】:
在 C# 中,声明与定义有何不同,即:
- 类声明与类定义
- 变量声明与定义
- 方法参数声明与定义
在 C++ 中,这很明显,但在 C# 中,从 ECMA 标准和 MSDN 中我可以看出,一切都是声明,并且在使用定义一词的地方,它与声明的含义相同。
【问题讨论】:
在 C# 中,声明与定义有何不同,即:
在 C++ 中,这很明显,但在 C# 中,从 ECMA 标准和 MSDN 中我可以看出,一切都是声明,并且在使用定义一词的地方,它与声明的含义相同。
【问题讨论】:
在使用定义一词的地方,它与声明的意思相同
正确。
由于它们的编译模型,在 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# 可以。
【讨论】:
不存在这种区别。您指的是声明的范围,定义点与变量/字段的范围无关。
int x; // 'x' is declared
x = 10; // 'x' is assigned
int y = 20; // 'y' is both declared and assigned
这没有多大意义。方法参数在方法签名中声明。
我认为您对 1 和 3 中的术语有些困惑。
【讨论】:
C++ 构建模型可以追溯到铁氧体磁芯一打一美元的时代。多个源代码文件一次编译一个。使用单遍编译器。将所有内容粘合在一起的链接器。这就需要在头文件和原型中单独声明。
C# 编译器充分利用现代机器资源。构成程序集的所有源代码文件同时编译,编译器至少进行两次传递,以便它可以在方法体之前解析声明。仍然有一个可能的链接模型,但它很少使用。
我能想到的声明必须匹配定义的唯一概念是委托类型必须匹配目标方法,接口成员声明必须匹配其具体实现。
【讨论】:
原始问题1、2、3的答案:C#没有区别
然而,关于方法的这些术语可能值得一提:
【讨论】:
不是因为 C# 不需要区分。
【讨论】:
根据 Kernighan & Ritchie 在“C 编程语言”中的说法: “声明”宣布变量的属性;它由名称和变量列表组成,例如: int fahr, 摄氏度;
根据 Stroustrup 在“C++ 编程语言”中的说法: “声明”是将名称引入程序的语句。它指定该名称的类型。类型定义了名称或表达式的正确使用。
这两本书都没有具体定义“定义”。但两者都在科学意义上使用变量值的术语。因此,函数声明声明了函数的调用签名。函数定义包含实际代码。
在这些语言中需要有不同的含义是因为过去的编译器。他们需要在实际使用名称之前提前知道名称的类型。否则他们将需要再次通过源代码。
【讨论】: