2010-10-31 22 views
11

Trong C# như thế nào một tuyên bố khác với một định nghĩa, ví dụ:Declarations vs định nghĩa

  1. Một khai báo lớp vs một định nghĩa lớp
  2. Một khai báo biến vs định nghĩa
  3. Một tuyên bố tham số phương pháp vs định nghĩa

Trong C++, điều này khá rõ ràng, nhưng trong C# từ những gì tôi có thể nói từ tiêu chuẩn ECMA và MSDN là mọi thứ đều là khai báo và định nghĩa từ được sử dụng, được sử dụng để có nghĩa là cùng một điều như tuyên bố.

Trả lời

7
  1. Sự khác biệt đó không tồn tại. Bạn đang tham chiếu đến phạm vi của một khai báo, điểm định nghĩa không liên quan đến phạm vi của biến/trường.

  2. int x; // 'x' is declared 
    x = 10; // 'x' is assigned 
    
    
    int y = 20; // 'y' is both declared and assigned 
    
  3. Điều đó không có ý nghĩa nhiều. Đối số phương thức được khai báo trong chữ ký phương thức.

Tôi nghĩ rằng bạn là một chút nhầm lẫn về thuật ngữ trong 1 và 3.

+0

Vâng, trong C++: int x = 10; // Không phải là một tuyên bố và đúng là một định nghĩa. Đây là lý do tại sao tôi nhầm lẫn với thuật ngữ C#. Ngoài ra, C++ cho phép khai báo lớp hoàn toàn khác với các định nghĩa lớp. C# cho phép các lớp một phần và các lớp được định nghĩa hoàn toàn, nhưng cả hai đều có vẻ là khai báo! –

+0

@michael: Không, cả hai đều là định nghĩa. –

+0

@michael: các lớp một phần chỉ là một lớp được chia thành nhiều tệp nguồn. Một số thành viên được định nghĩa trong một tập tin và một số thành viên khác. –

2

Nó không phải vì C# không phải phân biệt.

10

C++ xây dựng ngày mô hình từ một thời đại mà lõi ferit là một đô la một tá. Nhiều tệp mã nguồn được biên dịch cùng một lúc. Với trình biên dịch một lần. Một mối liên kết để dán mọi thứ lại với nhau. Điều đó tạo ra các khai báo riêng biệt trong các tệp tiêu đề và các nguyên mẫu cần thiết.

Trình biên dịch C# tận dụng lợi thế của tài nguyên máy hiện đại. Tất cả các tệp mã nguồn cấu thành một assembly được biên dịch cùng một lúc, trình biên dịch tạo ra ít nhất hai lần truyền để nó có thể phân tích các khai báo trước các phần tử phương thức. Vẫn còn một mô hình liên kết có thể nhưng nó rất hiếm khi được sử dụng.

Khái niệm duy nhất của tuyên bố phải khớp với định nghĩa mà tôi có thể nghĩ là loại đại biểu phải khớp với phương pháp đích và khai báo thành viên giao diện phải khớp với việc triển khai cụ thể.

+2

+1 cho lõi ferit. – Euphoric

15

nơi định nghĩa từ được sử dụng, nó được sử dụng để có nghĩa là điều tương tự như khai

đúng.

Khái niệm 'khai báo' dưới dạng định nghĩa mềm/chuyển tiếp là cần thiết trong C và C++ do mô hình biên dịch của chúng. C++ (khái niệm) sử dụng trình biên dịch đơn, C# là multi-pass. Hãy xem xét:

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++ không thể xử lý trường Bar b mà không khai báo trước. C# có thể.

1

Theo Kernighan & Ritchie trong "Ngôn ngữ lập trình C": Một "tuyên bố" thông báo các thuộc tính của biến; nó bao gồm tên và danh sách các biến, chẳng hạn như: int fahr, celsius;

Theo Stroustrup trong "Ngôn ngữ lập trình C++": Một "tuyên bố" là tuyên bố giới thiệu tên vào chương trình. Nó chỉ định một loại cho tên đó. Một loại xác định việc sử dụng đúng tên hoặc biểu thức.

Không có sách cụ thể định nghĩa "định nghĩa". Nhưng cả hai đều sử dụng thuật ngữ theo nghĩa khoa học của VALUE của một biến. Do đó một khai báo hàm khai báo chữ ký gọi của hàm. Định nghĩa hàm chứa mã thực.

Sự cần thiết phải có ý nghĩa riêng biệt trong các ngôn ngữ này là do trình biên dịch của năm qua. Họ cần phải biết các loại tên trước thời hạn, trước khi tên được sử dụng thực sự. Nếu không, họ sẽ cần phải thực hiện một bước khác thông qua mã nguồn.

0

Câu trả lời cho câu hỏi ban đầu 1, 2, 3: không có sự khác biệt trong C#

Tuy nhiên có thể là đáng nói những điều khoản liên quan đến phương pháp:

  • Tuyên bố là nơi ở Interface nơi chúng tôi chỉ "tuyên bố" chữ ký của phương thức
  • Định nghĩa là địa điểm thực tế mà chúng tôi "xác định" việc triển khai thực tế của tuyên bố phương pháp trước đây. (giống như "triển khai")
Các vấn đề liên quan