C# Fast Food
C# là một ngôn ngữ mang những đặc điểm của C++, có phong cách lập trình như Java và có mô hình ứng dụng nhưBasic. Nếu đã biết về C++ thì các bạn sẽ mất không dưới một giờ để tìm hiểu cú pháp của C#. Còn nếu các bạn đã quenthuộc với Java thì sẽ là một lợi thế khác khi học C#. Cấu trúc chương trình Java, khái niệm về gói (package), garbage
collection chắc chắn sẽ giúp bạn học C# nhanh hơn. Trong bài viết này, khi chúng tanói về các cấu trúc của C#, tôi sẽ
xem như các bạn đã biết C++.
Bài viết này sẽ nói về các cấu trúc và những đặc điểm của ngôn ngữ C#, minh họa bằng những ví dụ ngắn gọn và dễ hiểu
để khi các bạn nhìn vào ví dụ, các bạn có thể hiểu rõ những khái niệm. Trong bài viếtnày , chúng ta sẽ bàn về những chủ
đề sau:
·Cấu trúc chương trình
·Namespaces
·Kiểu dữ liệu
·Biến
·Toán tử và biểu thức
·Kiểu liệt kê
·Câu lệnh
trong namespace System. Do đó việc đóng gói những kiểu căn bản hay nguyên thủy vào trong class Object được gọi là boxing, và thao tác ngược lại được gọi là unboxing. Ví dụ như: class Test { static void Main() { int myInt = 12; // boxing object obj = myInt ; // unboxing int myInt2 = (int) obj; } } Ví dụ trên cho ta thấy cả hai thao tác boxing và unboxing. Một giá trị int có thể được chuyển đổi thành đối tượng và chuyển đổi trở lại thành int. Khi kiểu dữ liệu của một biến cần được chuyển thành một kiểu truyền bằng tham khảo, một object box được tạo ra để chứa giá trị, và giá trị được lưu vào box. Unboxing chỉ là quá trình ngược lại. Khi một object box được trả lại thành kiểu nguyên thủy , giá trị sẽ được chuyển từ box sang ô nhớ lưu trữ ban đầu. ---Thông số của hàm Trong C# có 3 loại thông số: 1.Thông số in/ truyền bằng trị. 2.Thông số in– out/truyền bằng tham khảo. 3.Thông số out. Nếu bạn đã nắm rõ về COM interface và những kiểu thông số của nó, bạn sẽ dễ dàng hiểu được các kiểu thông số của C#. --Thông số in/ truyền bằng trị Khái niệm thông số truyền bằng trị cũng tương tự như trong C++. Giá trị truyền được chép vào một ô nhớ và được truyền vào hàm. Ví dụ: C# Fast Food 9 of 16 9/15/2008 5:12 PM SetDay(5); ... void SetDay(int day) { .... } ---Thông số in – out/truyềnbằng tham khảo Thông số truyền bằng tham khảo trong C++ được truyền thông qua một con trỏ hay toán tử &. Trong C#, thông số truyền bằng tham khảo còn được gọi là thông số in – out, vì khi bạn truyền một địa chỉ tham khảo của một ô nhớ, bạn đã truyền một giá trị nhập và lấy một giá trị xuất từ hàm đó. Bạn không thể truyền một thông số chưa khởi tạo vào một hàm. C# dùng từ khóa ref để chỉ thông số truyền bằng tham khảo. Bạn cũng có thể dùng từ khóa ref cho một đối số trong khi truyền nó vào một hàm có thông số truyền bằng tham khảo. Ví dụ: int a= 5; FunctionA(ref a); Console.WriteLine(a); void FunctionA(ref int Val) { int x= Val; Val = x* 4; } ----Thông số out Là thông số chỉ trả về giá trị là kết quả của một hàm, không đòi hỏi giá trị nhập. C# dùng từ khóa out cho loại tham số này. int Val; GetNodeValue(Val); bool GetNodeValue(out int Val) { Val = value; return true; } ---Số lượng các thông số và mảng Để truyền thông số là một mảng trong C#, người ta dùng từ khóa params. Chỉ có thể có một đối số kiểu mảng. Bạn có thể truyền phần tử như là một đối số của mảng đó. Tốt nhất, ta hãy xem ví dụ sau: void Func(params int[] array) { Console.WriteLine(“number of elements {0}”, array.Length); } Func(); Func(5); Func(7,9); Func(new int[] {3,8,10}); int[] array = new int[8] {1,3,4,5,5,6,7,5}; Func(array); ---Toán tử và biểu thức Hầu hết các toán tử trong C# hoàn toàn giống như trong C++, do đó biểu thức cũng vậy. Tuy nhiên C# còn bổ sung thêm C# Fast Food 10 of 16 9/15/2008 5:12 PM một số toán tử mới và hữu ích. Chúng ta sẽ xem xét vài toán tử trong số đó. ---Toán tử is Toán tử này được dùng để kiểm tra xem kiểu của các toán hạng có tương đương hay không. Toán tử is thường được sử dụng trong kịch bản đa ngữ cảnh. Toán tử này có hai toán hạng và kết quả trả về có kiểu bool. Chúng ta xem ví dụ sau: void function(object param) { if(param is ClassA) // something else if(param is MyStruct) //something } } ---Toán tử as Toán tử as kiểm tra xem kiểu của các toán hạng có khả đổi hay không, nếu có thì kết quả trả về là một đối tượng đã được chuyển đổi hay được box. Nếu đối tượng không chuyển đổi hay box được, kết quả trả về null. Chúng ta xem ví dụ sau để hiểu rõ hơn về khái niệm này: Shape shp = new Shape(); //kết quả là null, không chuyển đổi //kiểu được Vehicle veh = shp as Vehicle; Circle cir = new Circle(); Shape shp = cir; //sẽ được chuyển đổi Circle cir2 = shp as Circle; object[] objects = new object[2]; objects[0] = “Aisha”; object[1] = new Shape(); string str; for(int i=0; i&< objects.Length; i++) { str = objects[i] as string; if(str == null) Console.WriteLine(“can not be converted”); else Console.WriteLine(“{0}”,str); } ----Câu lệnh Đa số các câu lệnh trong C# đều tương tự như trong C++, ngoài ra còn có một số câu lệnh mới được bổ sung và có một vài sự sửa đổi trong một số câu lệnh cũ. Sau đây là một số câu lệnh mới: foreach: dùng cho việc thực hiện vòng lặp cho một tập hợp như mảng… Ví dụ: foreach (string s in array) Console.WriteLine(s); lock: dùng để bao một đoạn code thành một section. checked/unchecked: dùng để kiểm tra tràn trong các toán tử có đối số là số. Ví dụ như: int x = Int32.MaxValue; x++; C# Fast Food 11 of 16 9/15/2008 5:12 PM { x++; } unchecked { x++; } } ---Switch Trong C#, câu lệnh switch được thay đổi như sau: 1.Sau khi thực thi một câu lệnh case, chương trình sẽ không nhảy đến câu lệnh case kế tiếp. Ví dụ: int var = 100; switch (var) { case 100: Console.WriteLine(“”); // không dùng break case 200: Console.WriteLine(“”); break; } Trong C++, kết quả sẽ là: Trong C#, bạn sẽ nhận được thông báo lỗi sau: error CS0163: Control cannot fall through from one case label (‘case 100:’) to another Tuy nhiên, bạn có thể làm như sau: switch (var) { case 100: case 200: Console.WriteLine(“100 or 200”); break; } 2.Bạn cũng có thể dùng hằng trong giá trị của case. Ví dụ như: const string WeekEnd = “Sunday”; const string WeekDay1 = “Monday”; .... string WeekDay = Console.ReadLine(); switch (WeekDay ) { case WeekEnd: Console.WriteLine(“It’s weekend!!”); break; case WeekDay1: C# Fast Food 12 of 16 9/15/2008 5:12 PM Console.WriteLine(“It’s Monday”); break; } ----Delegate Delegate cho phép chúng ta lưu sự tham khảo hàm vào một biến. Trong C++, việc này giống như dùng và lưu con trỏ hàm và chúng ta hay dùng typedef. Ví dụ: delegate int Operation(int val1, int val2); public int Add(int val1, int val2) { return val1 + val2; } public int Subtract (int val1, int val2) { return val1- val2; } public void Perform() { Operation Oper; Console.WriteLine(“Enter + or - “); string optor = Console.ReadLine(); Console.WriteLine(“Enter 2 operands”); string opnd1 = Console.ReadLine(); string opnd2 = Console.ReadLine(); int val1 = Convert.ToInt32 (opnd1); int val2 = Convert.ToInt32 (opnd2); if (optor == “+”) Oper = new Operation(Add); else Oper = new Operation(Subtract); Console.WriteLine(“ Result ={0}”, Oper(val1, val2)); } Tính thừa kế và tính đa hình Trong C# chỉ cho phép sự thừa kế đơn. Nếu bạn muốn thực hiện đa thừa kế, bạn có thể dùng interface. Ví dụ: class Parent{ } class Child : Parent Hàm ảo Từ khái niệm hàm ảo đến hiện thực khái niệm đa hình trong C# là như nhau, ngoại trừ việc bạn dùng từ khóa override đối với việc hiện thực hàm ảo trong lớp con. Lớp cha vẫn sử dụng từ khóa virtual. Lớp nào override phương thức ảo cũng sử dụng từ khóa override. C# Fast Food 13 of 16 9/15/2008 5:12 PM class Shape { public virtual void Draw() { Console.WriteLine(“Shape.Draw”); } } class Rectangle : Shape { public override void Draw() { Console.WriteLine(“Rectangle.Draw”); } } class Square : Rectangle { public override void Draw() { Console.WriteLine(“Square.Draw”); } } class MainClass { static void Main(string[] args) { Shape[] shp = new Shape[3]; Rectangle rect = new Rectangle(); shp[0] = new Shape(); shp[1] = rect; shp[2] = new Square(); shp[0].Draw(); shp[1].Draw(); shp[2].Draw(); } } Xuất ra kết quả như sau: Shape.Draw Rectangle.Draw Square.Draw Ẩn lớp cha bằng cách dùng “new” Trong một lớp con, bạn có thể định nghĩa một hàm mới, ẩn với lớp cha, bằng cách dùng từ khóa new. Trong ví dụ dưới đây, là bản sửa đổi của ví dụ trên, tôi thay thế từ khóa override bằng từ khóa new trong lớp Rectangle. class Shape C# Fast Food 14 of 16 9/15/2008 5:12 PM { public virtual void Draw() { Console.WriteLine(“Shape.Draw”); } } class Rectangle : Shape { public new void Draw() { Console.WriteLine(“Rectangle.Draw”); } } class Square : Rectangle { public new void Draw() { Console.WriteLine(“Square.Draw”); } } class MainClass { static void Main(string[] args) { Console.WriteLine(“Using Polymorphism:”); Shape[] shp = new Shape[3]; Rectangle rect = new Rectangle(); shp[0] = new Shape(); shp[1] = rect; shp[2] = new Square(); shp[0].Draw(); shp[1].Draw(); shp[2].Draw(); Console.WriteLine(“Using without Polymorphism:”); rect.Draw(); Square sqr = new Square(); sqr.Draw(); } } Kết quả xuất ra như sau: Using Polymorphism Shape.Draw Shape.Draw Shape.Draw Using without Polymorphism: Rectangle.Draw Square.Draw Trong ví dụ trên, phương thức Draw của lớp Rectangle không phải là dạng đa hình của phương thức Draw trong lớp Shape. Thay vì vậy, nó được xem như là một phương thức khác. Do đó, để tránh sự trùng tên giữa lớp cha và lớp con, ta C# Fast Food 15 of 16 9/15/2008 5:12 PM nên dùng từ khóa new. Lưu ý: bạn không thể dùng hai phương thức cùng tên trong cùng một lớp nếu một phương thức dùng từ khóa new, phương thức kia dùng override hay virtual. Do đó trong lớp Square, tôi không thể override phương thức Draw của lớp Shape. Gọi những member của lớp cha Nếu lớp con có dữ liệu member cùng tên với dữ liệu đó trong lớp cha, để tránh bị trùng tên, dữ liệu và hàm member của lớp cha được truy xuất thông qua từ khóa base. Trong ví dụ sau, hãy xem cách constructor của lớp cha được gọi và dữ liệu member được dùng: public Child(int val) :base(val) { myVar = 5; base.myVar; } Hay public Child(int val) { base(val); myVar = 5 ; base.myVar; } Bài viết này chỉ giới thiệu một cách rất tổng quát về ngôn ngữ C# để các bạn có thể quen với những đặc trưng cơ bản của ngôn ngữ. Mặc dù đã cố gắng đề cập đến hầu hết những khái niệm chính trong C#, nhưng tôi nghĩ vẫn còn rất nhiều thứ khác cần thêm vào và bàn đến. (Theo: Trần Phạm thanh Tùng - Báo Học Lập Trình) Nguồn: tincntt.com C# Fast Food 16 of 16 9/15/2008 5:12 PM
File đính kèm:
- CFastFood.pdf