Tương tự, C # về cơ bản giống như một bộ công cụ cơ khí mà ai đó đã đọc rằng bạn thường nên tránh kìm và cờ lê có thể điều chỉnh, do đó, nó không bao gồm cờ lê có thể điều chỉnh được, và kìm bị khóa trong một ngăn kéo đặc biệt được đánh dấu là "không an toàn" và chỉ có thể được sử dụng với sự chấp thuận của người giám sát, sau khi ký từ chối trách nhiệm miễn trừ cho chủ nhân của bạn về bất kỳ trách nhiệm nào đối với sức khỏe của bạn.
C ++, bằng cách so sánh, không chỉ bao gồm cờ lê và kìm có thể điều chỉnh, mà một số công cụ mục đích đặc biệt khá kỳ quặc mà mục đích của chúng không rõ ràng ngay lập tức và nếu bạn không biết cách giữ chúng đúng cách, chúng có thể dễ dàng cắt đứt bạn ngón tay cái (nhưng một khi bạn hiểu cách sử dụng chúng, có thể làm những việc cơ bản là không thể với các công cụ cơ bản trong hộp công cụ C #). Ngoài ra, nó có máy tiện, máy phay, máy mài bề mặt, máy cưa cắt kim loại, v.v., để cho phép bạn thiết kế và tạo ra các công cụ hoàn toàn mới bất cứ khi nào bạn cảm thấy cần (nhưng vâng, những công cụ của thợ máy có thể và sẽ gây ra chấn thương nghiêm trọng nếu bạn không biết bạn đang làm gì với chúng - hoặc thậm chí nếu bạn bất cẩn).
Điều đó phản ánh sự khác biệt cơ bản trong triết lý: C ++ cố gắng cung cấp cho bạn tất cả các công cụ bạn có thể cần cho bất kỳ thiết kế nào bạn muốn. Nó hầu như không cố gắng kiểm soát cách bạn sử dụng các công cụ đó, vì vậy cũng dễ dàng sử dụng chúng để tạo ra các thiết kế chỉ hoạt động tốt trong các tình huống hiếm gặp, cũng như các thiết kế có lẽ chỉ là một ý tưởng tệ hại và không ai biết về tình huống trong đó họ có khả năng làm việc tốt Đặc biệt, rất nhiều điều này được thực hiện bằng cách tách rời các quyết định thiết kế - ngay cả những quyết định trong thực tế gần như luôn luôn được kết hợp. Kết quả là, có một sự khác biệt rất lớn giữa việc chỉ viết C ++ và viết C ++ tốt. Để viết C ++ tốt, bạn cần biết rất nhiều thành ngữ và quy tắc ngón tay cái (bao gồm cả quy tắc ngón tay cái về cách nghiêm túc xem xét lại trước khi phá vỡ các quy tắc khác của ngón tay cái). Kết quả là C ++ được định hướng nhiều hơn về tính dễ sử dụng (của các chuyên gia) hơn là dễ học. Cũng có những trường hợp (tất cả quá nhiều) trong đó nó cũng không thực sự dễ sử dụng.
C # làm nhiều hơn nữa để cố gắng ép buộc (hoặc ít nhất là cực kỳ mạnh mẽ đề xuất) những gì các nhà thiết kế ngôn ngữ coi là thực hành thiết kế tốt. Khá nhiều thứ được tách rời trong C ++ (nhưng thường đi đôi với nhau trong thực tế) được ghép trực tiếp trong C #. Nó không cho phép mã "không an toàn" đẩy ranh giới một chút, nhưng thành thật mà nói, không phải là toàn bộ.
Kết quả là một mặt có khá nhiều thiết kế có thể được thể hiện khá trực tiếp trong C ++, về cơ bản là vụng về hơn để thể hiện trong C #. Mặt khác, đó là một toàn bộ dễ dàng hơn nhiều để tìm hiểu C #, và các cơ hội tạo ra một thiết kế thực sự khủng khiếp đó sẽ không làm việc cho tình hình của bạn (hoặc có thể là bất kỳ khác) đều quyết liệt giảm. Trong nhiều trường hợp (có thể là hầu hết), bạn có thể có được một thiết kế chắc chắn, khả thi bằng cách đơn giản là "đi theo dòng chảy", có thể nói như vậy. Hoặc, là một trong những người bạn của tôi (ít nhất là tôi thích nghĩ về anh ấy như một người bạn - không chắc anh ấy có thực sự đồng ý hay không), C # làm cho nó dễ rơi vào hố thành công.
Vì vậy, nhìn cụ thể hơn vào câu hỏi làm thế nào class
và struct
có được chúng như thế nào trong hai ngôn ngữ: các đối tượng được tạo trong hệ thống phân cấp thừa kế, nơi bạn có thể sử dụng một đối tượng của lớp dẫn xuất trong vỏ bọc của lớp / giao diện cơ sở của nó, bạn khá nhiều bị mắc kẹt với thực tế là bạn thường cần phải làm như vậy thông qua một số loại con trỏ hoặc tham chiếu - ở mức cụ thể, điều xảy ra là đối tượng của lớp dẫn xuất chứa một bộ nhớ có thể được coi là một thể hiện của lớp cơ sở / giao diện và đối tượng dẫn xuất được thao tác thông qua địa chỉ của phần đó của bộ nhớ.
Trong C ++, tùy thuộc vào lập trình viên để làm điều đó một cách chính xác - khi anh ta sử dụng tính kế thừa, anh ta phải đảm bảo rằng (ví dụ) một hàm hoạt động với các lớp đa hình trong hệ thống phân cấp thực hiện thông qua một con trỏ hoặc tham chiếu đến cơ sở lớp học.
Trong C #, về cơ bản, sự phân tách giống nhau giữa các loại rõ ràng hơn nhiều và được thực thi bởi chính ngôn ngữ. Lập trình viên không cần thực hiện bất kỳ bước nào để vượt qua một thể hiện của một lớp bằng tham chiếu, bởi vì điều đó sẽ xảy ra theo mặc định.
struct
không phải lúc nào cũng được lưu trữ trên ngăn xếp; xem xét một đối tượng với mộtstruct
lĩnh vực. Điều đó sang một bên, như Mason Wheeler đã đề cập đến vấn đề cắt lát có lẽ là lý do lớn nhất.