2010-10-11 21 views
5

Tôi thấy các tính năng ngôn ngữ như vòng lặp foreach của C# (yêu cầu sử dụng IEnumerable) và cú pháp using (sử dụng IDisposable, biết phương thức nào để gọi) và LINQ (tôi giả sử sử dụng một đống công cụ .NET) . Tất cả điều này dường như rất gắn liền với khung công tác .NET. Vì vậy:Cách tách biệt là C# và .NET?

  • C# có thể tồn tại với một khung công tác khác không? (Có phải không?)
  • Nếu có, ngôn ngữ chỉ định như thế nào "vòng lặp foreach yêu cầu một phiên bản IEnumerable" mà không buộc nó vào một khung công tác.

Trả lời

6

Nơi tốt nhất để điều tra này là C# language specification. Ví dụ, trong trường hợp của enumerables, sau đây là một số đoạn từ spec:

10.14.2 giao diện Enumerable

Các giao diện đếm được là những giao diện phi generic System.Collections. IEnumerable và tất cả instantiations của giao diện chung System.Collections.Generic.IEnumerable. Vì lợi ích ngắn gọn, trong chương này , các giao diện này là được tham chiếu là IEnumerable và IEnumerable, tương ứng.

...

10.14.5.1 Các GetEnumerator phương pháp

Một đối tượng đếm được cung cấp một thực hiện trong những phương pháp GetEnumerator của IEnumerable và giao diện IEnumerable. Hai phương pháp GetEnumerator chia sẻ một thực hiện phổ biến mà mua lại và trả về một điều tra có sẵn đối tượng. Đối tượng điều tra là được khởi tạo với các giá trị đối số và giá trị mẫu được lưu khi đối tượng được liệt kê là được liệt kê, nhưng nếu không thì đối tượng liệt kê chức năng như được mô tả trong §10.14.4.

này mối quan hệ độc đáo với cách các giao diện là thực định nghĩa trong .NET BCL, mặc dù nó sẽ là hoàn toàn có thể cho ra một khuôn khổ khác nhau (ví dụ non-.NET) để cung cấp một tương tự, thực hiện tương thích trình biên dịch C# sau đó có thể nhắm mục tiêu.

Các phần của thông số khó tách rời khỏi.NET framework thường được đánh dấu bằng:

Lưu ý: Phần này chỉ áp dụng cho việc triển khai Microsoft .NET của C#.

Ngày lưu ý khác, foreach không thực sự đòi hỏi IEnumerable; nó có thể sử dụng một loại 'gõ vịt', mà bạn có thể đọc trong phần 8.8.4 của spec.

+0

Ah, do đó, nó thực sự là tất cả về * thực hiện * của ngôn ngữ, sau đó? – Smashery

+0

@Smashery: Tôi nghĩ tốt hơn là nên nghĩ về nó trong việc thực hiện trình biên dịch * tuân thủ *. – Ani

+0

Là một cú pháp sang một bên, LINQ * * không đặt bất kỳ yêu cầu cụ thể nào; giống như 'foreach', nó hoàn toàn dựa trên mẫu. Cây biểu hiện phụ thuộc nhiều hơn, nhưng các chi tiết của bản dịch này thực sự không có trong spec. –

3
  1. Có - Mono là một mã nguồn mở cross-platform thực hiện khuôn khổ Net .
  2. Không chắc chắn, tốt câu hỏi. Mono thay thế cả hai .Net framework CLR, và vì vậy đây không phải là vấn đề đối với Mono.
+0

Đúng, mặc dù, như bạn nói, Mono là một triển khai thực hiện khuôn khổ .NET. Nó không thực sự là một khuôn khổ khác. Tôi đang tự hỏi nhiều hơn dọc theo dòng "Có thể C# làm việc với một cái gì đó rất khác nhau như thư viện Python?" – Smashery

Các vấn đề liên quan