2010-10-31 178 views
11

在C#如何聲明從定義不同,即:聲明VS定義

  1. 類聲明Vs的類定義
  2. 變量聲明VS定義
  3. 的方法參數聲明VS定義

在C++中,這很明顯,但在C#中,從ECMA標準和MSDN中可以看出,一切都是聲明,並且在使用單詞定義的地方,用來表示與聲明相同的東西。

回答

7
  1. 該區別不存在。你指的是聲明的範圍,定義的點與變量/字段的範圍無關。

  2. int x; // 'x' is declared 
    x = 10; // 'x' is assigned 
    
    
    int y = 20; // 'y' is both declared and assigned 
    
  3. 這沒有什麼意義。方法參數在方法簽名中聲明。

我覺得你是個位1和3

+0

那麼,在C++中:int x = 10; //不是一個聲明,而是一個嚴格的定義。這就是爲什麼我對C#術語感到困惑。另外,C++允許類聲明與類定義完全不同。 C#允許部分類和完全定義的類,但兩者似乎都是聲明! – 2010-10-31 19:22:10

+0

@ michael:不,兩者都是定義。 – 2010-10-31 19:26:26

+0

@michael:部分類只是一個類拆分成多個源文件。一些成員被定義在一個文件中,一些成員被定義在其他文件中 – 2010-10-31 19:34:19

2

它並不是因爲C#不需要做出區分。

10

混淆有關術語的C++從這樣一個時代的鐵氧體磁芯是一美元一打建模型日期。多個源代碼文件一次編譯一個。使用單通編譯器。鏈接器將所有內容粘合在一起。這在頭文件和原型中需要單獨的聲明。

C#編譯器充分利用現代機器資源。構成程序集的所有源代碼文件都是同時編譯的,編譯器至少會創建兩遍,因此它可以在方法體之前解析聲明。還有一個可能的鏈接模型,但它很少被使用。

聲明必須與我能想到的定義相匹配的唯一概念是必須匹配目標方法的委託類型和必須匹配其具體實現的接口成員聲明。

+2

+1爲鐵氧體磁芯。 – Euphoric 2010-10-31 21:03:01

15

在使用這個詞的定義,它是用來表示同樣的事情聲明

正確的。

由於其編譯模型,在C和C++中需要'聲明'作爲軟/轉發定義的概念。 C++(概念上)使用單遍編譯,C#是多遍。考慮:

class Bar; // declaration: needed in C++, illegal and unnecessary in C# 

class Foo // counts as a declaration of Foo 
{ 
    Foo f; // use of declared but still incomplete type 
    Bar b; // use of declared but still undefined class Bar 
} 

class Bar // definition and re-declaration 
{ 
} 

C++無法首先處理Bar b字段。 C#可以。

1

根據Kernighan &「The C Programming Language」中的Ritchie: 「聲明」宣佈變量的屬性;它由一個名稱和一個變量列表組成,例如: int fahr,celsius;

根據Stroustrup在「The C++ Programming Language」中的說法: 「聲明」是一個聲明,它向程序中引入了一個名稱。它爲該名稱指定了一個類型。一個類型定義了名稱或表達式的正確使用。

這兩本書都沒有具體定義「定義」。但是兩者都使用科學意義上的變量的VALUE這個術語。因此,函數聲明聲明函數的調用簽名。函數定義包含實際的代碼。

在這些語言中需要單獨的含義是因爲以前的編譯器。在實際使用名稱之前,他們需要提前知道名稱的類型。否則,他們需要再次通過源代碼。

0

答案原來的問題1,2,3:在C#中沒有差異

但可能是值得一提的這些術語的問候方法:

  • 宣言是發生在接口哪裏我們只是「聲明」方法的簽名
  • 定義是我們「定義」聲明的實際執行的實際位置以前的方法。 (與「實現」相同)