Đề tài So sánh C++, C#, Java
Cách sửdụng chú thích trong C#
Có hai loại “chú thích” (comment)
sửdụng trong .NET framework:
loại chú thích dòng và chú thích
XML.
- Loại thông thường nhất là các
loại “chú thích dòng” (Bất cứkhi
nào bạn sửdụng // với C# hoặc
VB.NET ñể ñánh dấu một dòng là
chú thích.) Loại chú thích này
thường ñược sửdụng ñểgiải thích
những gì mà dòng lệnh hiện hành
hoặc dòng mã kếtiếp ñang thực
hiện.
chế chuyển ñổi tường minh hoặc chuyển ñổi ngầm ñịnh. việc chuyển ñổi ngầm ñịnh ñược thực hiện tự ñộng và phải ñảm bảo không mất thông tin. Nghĩa là kiểu ñược chuyển ñổi phải có kích thước lơn hơn. VD ta có thể gán ngầm ñịnh một số kiểu short vào một số kiểu int nhưng không thể làm ngược lại vì kích thước của kiểu int lớn hơn kích thước của kiểu short. IV. Kiểm tra kiểu, ñổi kiểu Java: dễ dàng chuyển kiểu giữa các kiểu primitive và khi ép kiểu lên cao hơn cho siêu lớp và thấp hơn cho các lớp con. C#: cho phép khả năng ñịnh nghĩa chuyển ñổi kiểu tự tạo cho hai ñối tượng bất kỳ. Hai kiểu chuyển ñổi phải như sau: * Chuyển ñổi tương ñối: kiểu chuyển này yêu cầu kiểu ñích phải ñược xác ñịnh trong phát biểu,cũng như việc chuyển ñổi này không chắc chắn làm việc hoặc nếu nó làm việc thì kết quả của nó có thể bị mất ñi thông tin. Các lập trình viên Java thường thân thuộc với việc chuyển ñổi tuyệt ñối khi ép một ñối tượng thành một một ñối tượng của các lớp con của nó. * Chuyển ñổi tuyệt ñối: việc chuyển ñổi này không yêu cầu kiểu cha, cũng như việc chuyển ñổi này chắc chắn làm việc. Dưới ñây, chúng ta chuyển một kiểu double thành một kiểu FlooredDouble và ngược lại. Chúng ta cần ñịnh nghĩa việc chuyển kiểu tương ñối từ double thành FlooredDouble, thông tin có thể bị mất ñi trong quá trình chuyển ñổi. Ở quá trình ngược lại, chúng ta sẽ ñịnh nghĩa việc chuyển kiểu tuyệt ñối, và sẽ không bị mất thông tin. public class FloorDouble : Object{ private double value; public FloorDouble( double value ) { this.value = Math.Floor( value ); } public double Value { get { return this.value; } } public static explicit operator FloorDouble( double value ) { return new FloorDouble( value ); } public static implicit operator double( FloorDouble value ) { return value.Value; } } // this class can be used by FloorDouble fl = (FloorDouble)10.5 double d = fl; IV. Không gian tên vùng tên (NameSpace ) Java Package harding.compsci.graphics; import harding.compsci.graphics.Rectangle;(nhập 1 class ñơn) import harding.compsci.graphics.*; ( nhập tòan bộ class) class ñơn) import harding.compsci.graphics.*; ( nhập tòan bộ class) C# namespace Harding.Compsci.Graphics { ... } hoặc namespace Harding { namespace Compsci { namespace Graphics { ... } } } . using Harding.Compsci.Graphics; (chỉ nhập tòan bộ class, không nhập class ñơn) Namespaces là một khái niệm trong C++, nhưng trong C# dùng namespaces thường xuyên hơn. C# không ñặt bất kỳ yêu cầu nào trong việc tổ chức file – một lập trình viên có thể sắp xếp toàn bộ chương trình C# bên trong một file .cs (Java thường yêu cầu một file .java chứa một lớp). C# cũng cung cấp một cách ñể chia nhỏ các ñối tượng của chương trình tương tự như các khối trong Java. Sử dụng namespace, các kiểu có quan hệ có thể ñược nhóm vào trong một phân cấp. Nếu không có block “namespace” nó sẽ nằm trong một namespace mặc ñịnh. Trong thư viện .Net, System là namespace cấp cao nhất trong các namespace. Trong C#, bằng cách mặc ñịnh tồn tại một namespace toàn cục, một class ñịnh nghĩa bên ngoài một namespace ñược lưu trực tiếp trong namespace toàn cục này. V. Quản lý và cấp phát bộ nhớ Trong C++ có thể dung các hàm cấp phát bộ nhớ ñộng của C như: hàm malloc ñể cấp phát bộ nhớ, hàm free ñể giải phóng bộ nhớ ñược cấp phát. Ngoài ra trong C++ còn ñưa them toán tử new ñể cấp phát bộ nhớ và toán tử delete ñể giải phóng bộ nhớ ñược cấp phát bởi new. Stack là một cấu trúc dữ liệu lưu trữ thông tin dạng xếp chồng tức là vào sau ra trước (Last In First Out : LIFO), ñiều này giống như chúng ta có một chồng các ñĩa, ta cứ xếp các ñĩa vào chồng và khi lấy ra thì ñĩa nào nằm trên cùng sẽ ñược lập ra trước, tức là ñĩa vào sau sẽ ñược lấy ra trước. Trong C#, kiểu giá trị như kiểu số nguyên ñược cấp phát trên stack, ñây là vùng nhớ ñược thiết lập ñể lưu các giá trị, và vùng nhớ này ñược tham chiếu bởi tên của biến. Kiểu tham chiếu như các ñối tượng thì ñược cấp phát trên heap. Khi một ñối tượng ñược cấp phát trên heap thì ñịa chỉ của nó ñược trả về, và ñịa chỉ này ñược gán ñến một tham chiếu. Thỉnh thoảng cơ chế thu gom sẽ hũy ñối tượng trong stack sau khi một vùng trong stack ñược ñánh dấu là kết thúc. Thông thường một vùng trong stack ñược ñịnh nghĩa bởi một hàm. Do ñó, nếu chúng ta khai báo một biến cục bộ trong một hàm là một ñối tượng thì ñối tượng này sẽ ñánh dấu ñể hũy khi kết thúc hàm. Những ñối tượng trên heap sẽ ñược thu gom sau khi một tham chiếu cuối cùng ñến ñối tượng ñó ñược gọi. Java loại bỏ các ñặc trưng phức tạp của C và C++ như thao tác con trỏ, thao tác ñịnh nghĩa chồng toán tử (operator overloading),… Java không sử dụng lệnh “goto” cũng như file header (.h). Cấu trúc “struct” và “union” cũng ñược loại bỏ khỏi Java. ðối với các chương trình viết bằng C, C++ hoặc một ngôn ngữ nào khác, trình biên dịch sẽ chuyển tập lệnh thành mã máy (machine code),hay lệnh của bộ vi xử lý. Những lệnh này phụ thuộc vào CPU hiện tại trên máy bạn. Nên khi muốn chạy trên loại CPU khác, chúng ta phải biên dịch lại chương trình. Kiểu dữ liệu trong Java nhất quán cho tất cả các hệ ñiều hành và phần cứng khác nhau. Java có riêng một thư viện các lớp cơ sở. Vì vậy chương trình Java ñược viết trên một máy có thể dịch và chạy trơn tru trên các loại máy khác mà không cần viết lại.trình biên dịch của Java chuyển mã nguồn thành dạng bytecode ñộc lập với phần cứng mà có thể chạy trên bất kỳ CPU nào. Java không sử dụng con trỏ và các phép toán con trỏ vì vậy không cho phép truy xuất bộ nhớ trực tiếp Trong chương trình Java không phải bận tâm ñến việc cấp phát bộ nhớ. Qúa trình cấp phát, giải phóng ñược thực hiện tự ñộng, nhờ dịch vụ thu nhặt những ñối tượng không còn sử dụng nữa VI. Hàm trùng tên: Trong ngôn ngữ C#, các toán tử là các phương thức tĩnh, giá trị trả về của nó thể hiện kết quả của một toán tử và những tham số là các toán hạng. Khi chúng ta tạo một toán tử cho một Nạp Chồng Toán Tử 153 Ngôn Ngữ Lập Trình C# lớp là chúng ta ñã thực việc nạp chồng (overloaded) những toán tử ñó, cũng giống như là chúng ta có thể nạp chồng bất cứ phương thức thành viên nào. Do ñó, ñể nạp chồng toán tử cộng (+) chúng ta có thể viết như sau: public static Fraction operator + ( Fraction lhs, Fraction rhs) Trong toán tử trên ta có sự qui ước ñặt tên của tham số là lhs và rhs. Tham số tên lhs thay thế cho “left hand side” tức là toán hạng bên trái, tương tự tham số tên rhs thay thế cho “right hand side” tức là toán hạng bên phải. Cú pháp ngôn ngữ C# cho phép nạp chồng một toán tử bằng cách viết từ khóa operator và theo sau là toán tử ñược nạp chồng. Từ khóa operator là một bổ sung phương thức (method operator). Như vậy, ñể nạp chồng toán tử cộng (+) chúng ta có thể viết operator +. Khi chúng ta viết: Fraction theSum = firstFraction + secondFraction; Thì toán tử nạp chồng + ñược thực hiện, với firstFraction ñược truyền vào như là tham số ñầu tiên, và secondFraction ñược truyền vào như là tham số thứ hai. Khi trình biên dịch gặp biểu thức: firstFraction + secondFraction thì trình biên dịch sẽ chuyển biểu thức vào: Fraction.operator+(firstFraction, secondFraction) Kết quả sau khi thực hiện là một ñối tượng Fraction mới ñược trả về, trong trường hợp này phép gán sẽ ñược thực hiện ñể gán một ñối tượng Fraction cho theSum. *Ghi chú: ðối với người lập trình C++, trong ngôn ngữ C# không thể tạo ñược toán tử nonstatic, và do vậy nên toán tử nhị phân phải lấy hai toán hạng. VII. Nhập xuất: C++ C# Java Dòng cin là một ñối tượng kiểu istream ñã ñịnh nghĩa trong C++ . ðó là dòng vào (input) chuẩn gắn với bàn phím (tương tự như stdin của C). Các thao tác nhập trên dòng cin ñồng nghĩa với nhập dữ liệu từ bàn ðể ñọc một ký tự văn bản từ của sổ console, chúng ta dùng phương thức Console.Read(), giá trị trả về sẽ là kiểu int hoặc kiểu Dùng class ñể nhập xuất. Cũng giống như trong C++, thao tác in-out dữ liệu trong phím. Do cin là một ñối tượng của lớp istream nên với cin chung ta có thể sử dụng toán tử nhập >> và các phương thức nhập của các lớp ios và istream. Cách dùng toán tử nhập ñể ñọc dữ liệu từ dòng cin như sau: cin >> Tham_số ; Trong ñó Tham_số có thể là: - Biến hoặc phần tử mảng nguyên ñể nhận một số nguyên - Biến hoặc phần tử mảng thực ñể nhận một số thực - Biến hoặc phần tử mảng ký tự ñể nhận một ký tự - Con trỏ ký tự ñể nhận một dẫy các ký tự khác trống string tuỳ ý . Và chúng ta cũng có hai phương thức dùng ñể viết ra chuổi ký tự như sau Console.Write() - Viết một giá trị ra của sổ window Console.WriteLine() - tương tự trên nhưng sẽ tự ñộng xuống hàng khi kết thúc lệnh java là một thao tác khá thường xuyên. + in-out với (màn hình + bàn phím) + in-out với file in-out với 4 loại dữ liệu cơ bản sau: + text ( tức là in-out dưới dạng ñọc/ghi các ký tự ) + byte ( ñọc theo từng byte ) + primitive data ( dữ liệu kiểu nguyên thủy như int float long double ) + Object ( các loại ñối tượng ) VIII. Nhận xét: C# và Java khá giống nhau, ñều là ngôn ngữ hướng ñối tượng, chúng có cú pháp hầu như giống nhau. Trên nền Windows thì C# phù hợp hơn vì môi trường lập trình, thư viện lập trình của nó rất mạnh và thân thiện (do Microsoft viết), ngoài ra ứng dụng C# giao tiếp với các ứng dụng khác dễ dàng hơn nhiều so với ứng dụng viết bằng Java. Ứng dụng C# chạy hiệu quả hơn nhiều so với ứng dụng Java cùng chức năng (do cơ chế thực thi khác nhau). Với các ứng dụng web chạy trên nhiều platform khác nhau thì Java ưu thế hơn vì Java là ngôn ngữ ñộc lập với platform, còn C# thì chưa có tính chất này, nó chỉ chạy tốt trên nền Windows. Nhìn chung C# linh hoạt hơn java. về tốc ñộ Java nhanh nhất, sau ñó là C# và C++.
File đính kèm:
- Đề tài So sánh C++, C#, Java.pdf