NỘI DUNG BÀI HỌC
C# là một ngôn ngữ lập trình đơn giản, hiện đại, mục đích tổng quát, hướng đối tượng được phát triển bởi Microsoft bên trong phần khởi đầu .NET của họ, được phát triển chủ yếu bởi Anders Hejlsberg, một kiến trúc sư phần mềm nổi tiếng với các sản phẩm Turbo Pascal, Delphi, J++, WFC. Loạt bài hướng dẫn này sẽ cung cấp cho bạn kiến thức cơ bản về lập trình C# qua các khái niệm từ cơ bản đến nâng cao liên quan tới ngôn ngữ lập trình C#.
Được xây dựng dựa trên nền tảng của 2 ngôn ngữ lập trình đó là C++ và Java. Do đó C# được miêu tả là ngôn ngữ có sự cân bằng giữa C++, Visual Basic, Delphi và Java.
C# là gì ?
C# (đọc là “C thăng” hay “C sharp” (“xi-sáp”)) là một ngôn ngữ lập trình thuần hướng đối tượng được phát triển bởi Microsoft.
C# ra đời năm 2000, được thiết kế chủ yếu bởi Anders Hejlsberg – kiến trúc sư phần mềm nổi tiếng với các sản phẩm Turbo Pascal, Delphi,...
Được xây dựng dựa trên nền tảng của 2 ngôn ngữ lập trình mạnh nhất đó là C++ và Java. Do đó C# được miêu tả là ngôn ngữ có sự cân bằng giữa C++, Visual Basic, Delphi và Java.
C# với sự hỗ trợ mạnh mẽ của .NET Framework giúp cho việc tạo một ứng dụng Windows Forms hay WPF (Windows Presentation Foundation), . . . trở nên rất dễ dàng.
Những đặc trưng của ngôn ngữ C#
Ngôn ngữ lập trình C# có những đặc trưng cơ bản sau:
- Là một ngôn ngữ thuần hướng đối tượng
- Là ngôn ngữ khá đơn giản, chỉ có khoảng 80 từ khóa và hơn mười mấy kiểu dữ liệu được dựng sẵn.
- Cung cấp những đặc tính hướng thành phần (component-oriented) như là Property, Event
- C# không khuyến khích sử dụng con trỏ như trong C++ nhưng nếu bạn thực sự muốn sử dụng thì phải đánh dấu đây là mã không an toàn (unsafe).
- C# có bộ Garbage Collector sẽ tự động thu gom vùng nhớ khi không còn sử dụng nữa.
- C# đã loại bỏ đa kế thừa trong C++ mà thay vào đó C# sẽ hỗ trợ thực thi giao diện interface.
Một số ưu điểm nổi bật của C#:
- Gần gũi với các ngôn ngữ lập trình thông dụng (C++, Java, Pascal).
- Xây dựng dựa trên nền tảng của các ngôn ngữ lập trình mạnh nên thừa hưởng những ưu điểm của những ngôn ngữ đó.
- Cải tiến các khuyết điểm của C/C++ như con trỏ, các hiệu ứng phụ, . . .
- Dễ tiếp cận, dễ phát triển.
- Được sự chống lưng của .NET Framework.
Đi kèm với những điểm mạnh trên thì C# cũng có những nhược điểm:
- Nhược điểm lớn nhất của C# là chỉ chạy trên nền Windows và có cài .NET Framework.
- Thao tác đối với phần cứng yếu hơn so với ngôn ngữ khác. Hầu hết phải dựa vào windows.
Tại sao lại lựa chọn ngôn ngữ C#?
Chúng ta lựa chọn C# để tìm hiểu là vì:
- C# là một ngôn ngữ đơn giản.
- C# là một ngôn ngữ hiện đại.
- C# là một ngôn ngữ mạnh mẽ và mềm dẻo.
- C# là một ngôn ngữ ít từ khóa.
- C# là một ngôn ngữ phổ biến.
- C# mang sức mạnh của nhiều ngôn ngữ (C++, Java, . . .)
- Đặc biệt là code Automation với Selenium khá mạnh và đơn giản.
Mỗi ngôn ngữ sẽ có một thế mạnh phát triển riêng. Nhưng C# đang chứng minh cho thế giới thấy nó có khả năng thay thế một số ngôn ngữ khác và trở thành ngôn ngữ đa năng.
Ví dụ:
Dưới đây là chương trình C# mẫu để in văn bản "Hello Automation Testing Team !!!" trên bảng điều khiển hệ thống.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SeleniumCSharp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello Automation Testing Team !!!");
}
}
}
Hướng dẫn cài đặt Visual Studio 2017
- Windows 7 SP1 Trở lên
- CPU: 1.8 GHz or faster processor. Dual-core hoặc cao hơn càng tốt.
- RAM: 2 GB hoặc cao hơn
- Hard disk space: 1GB ==> 40GB tùy thuộc vào số tính nặng bạn cài đặt.
Để tải Visual Studio 2017:
Bước 1) Điều hướng đến URL https://my.visualstudio.com/Downloads?q=visual%20studio%202017 và Đăng nhập nếu Microsoft yêu cầu. Xong nhấp vào nút 'Download' được hiển thị như hình.
Các bạn tải bản Community hoặc Professional 2017 nhen chơi cho máu lửa =))
Bước 2) Mở exe đã tải xuống. Nhấp vào 'Yes' nếu được yêu cầu Quyền quản trị.
Bước 3) Cửa sổ bật lên bên dưới sẽ xuất hiện. Nhấp vào nút 'Continue'.
Các tệp sẽ được tải xuống như hiển thị trong cửa sổ bật lên bên dưới.
Bước 4) Trong màn hình tiếp theo,
Chọn các hộp kiểm cho:
- Platform development
- .Net desktop development
Chờ cài đặt từng thành phần hoàn tất. Các tệp có kích thước 16GB và sẽ mất thời gian.
Bước 5) Cửa sổ bật lên bên dưới sẽ được hiển thị. Nhấp vào nút 'Restart'.
Bước 6) Sau khi máy được khởi động lại, hãy tìm kiếm "Visual Studio 2017" trên menu bắt đầu và nhấp vào kết quả tìm kiếm. Cửa sổ bật lên sau sẽ xuất hiện. Nhấp vào liên kết "Not now, mustbe after" nếu bạn chưa có tài khoản hiện tại.
Bước 7) Trong màn hình tiếp theo,
- Chọn chủ đề màu sắc theo ý thích của bạn
- Nhấp vào nút "Start Visual Studio"
Bước 8) Màn hình Visual Studio 'Get Started' sẽ xuất hiện.
Tạo một dự án mới trong Visual Studio:
Bước 1) Trong Menu File, Bấm New > Project...
Bước 2) Trong màn hình tiếp theo,
- Chọn tùy chọn 'Visual C#'
- Nhấp vào Console App (.Net Framework)
- Nhập tên là "VTACourses" hay cái gì cũng được nhe
- Bấm OK
Bước 3) Màn hình bên dưới sẽ được hiển thị sau khi dự án được tạo thành công.
Cấu trúc chương trình C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// in ra màng hình dòng lệnh Hello world!
Console.Write("Hello world!");
Console.ReadLine();
}
}
}
using
Dùng để chỉ khai báo thư viện nào sẽ sử dụng trong chương trình (thư viện là tập hợp các phương thức, kiểu dữ liệu có sẵn nào đó được tạo ra nhằm hỗ trợ cho việc lập trình nhanh chóng và hiệu quả hơn).
Ví dụ khi bạn muốn viết chương trình game thì phải sử dụng thư viện đồ họa có sẵn, như vậy việc lập trình sẽ nhanh chóng và dễ dàng hơn tự viết rất nhiều.
Cú pháp để khai báo thư viện như sau:
using <tên thư viện>;
namespace
Namespace
dùng để báo cho trình biên dịch biết rằng các thành phần nằm bên trong khối { }
ngay dưới namespace
thuộc về namespace
đó, điều này sẽ giúp ta tránh được những xung đột về code. Chúng ta sẽ tìm hiểu nó kỹ hơn ở một bài khác.
Cú pháp của một namespace
namespace <tên namespace>
{
// các thành phần bên trong name space bao gồm các class,enum
// delegate hoặc các namespace con
}
class
Cũng tương tự như namespace
, class
báo cho trình biên dịch biết rằng những thành phần trong khối { }
ngay sau tên class thì thuộc vào chính class
đó. Chi tiết về class
sẽ được trình bày trong các bài sau nhé
Cú pháp một class:
class <tên class> { }
Hàm (phương thức) main
Đây là hàm được tạo sẵn khi tạo project với cấu trúc như sau:
static void Main(String[] args ) { }
Đây là hàm chính của toàn chương trình. Mỗi khi trình biên dịch dịch chương trình sẽ đi vào hàm Main
đầu tiên để bắt đầu chương trình. Từ đây chúng ta sẽ viết code bên trong khối { }
của hàm Main.
comment
Trong lập trình, ngoài viết những đoạn mã trong sáng, sạch sẽ, bạn cũng cần nên đưa ra các chú thích để:
- Thứ nhất: Đôi khi bạn sau 1 tháng 2 tháng hay một tuần thôi, khi đọc lại code của mình đã viết thì bạn lại không hiểu nó viết ra để làm gì, vì vậy chú thích chức năng cho đoạn code của bạn là thực sự cần thiết.
- Thứ hai: Bạn muốn đóng một đoạn code để sau này có thể sử dụng lại.
Có 3 cách để comment trong Visual C#:
Cách 1: Sử dụng ký tự // nội dung comment
Bất kỳ dòng code nào nằm sau ký tự // đều không được biên dịch, nhưng chỉ có tác dụng trên một dòng.
// Đây là comment một dòng
Cách 2: Sử dụng kí tự /* nội dung comment */
Bất kỳ đoạn code nào nằm trong /* */ đều không đươch biên dịch, nó có tác dụng trên nhiều dòng.
/* Đây là đoạn code
chú thích nhiều dòng */
Cách 3: Sử dụng ký tự ///
Hai kiểu chú thích trên có thể đặt mọi nơi trong mã nguồn của bạn. Và kiểu chú thích thứ ba này có đôi chút khác biệt, nó bắt đầu bởi ///
và nó thường được dùng để ghi chú giải, chú thích cho một phương thức hoặc lớp.
Sau khi bạn viết phương thức hoặc lớp, đặt con trỏ chuột lên trước một dòng và gõ ///
Visual C# sẽ tự động generate cho bạn.
namespace ConsoleApplication
///
/// nội dung chú thích tại đây !
///
{
class Program
{
static void Main(string[] args)
{
// viết code tại đây
}
}
}
Dấu chấm phẩy (;)
Mỗi khi kết thúc một dòng lệnh chúng ta phải viết thêm một dấu ;
ngay sau dòng code để báo cho trình biên dịch biết rằng chúng ta đã kết thúc dòng lệnh hiện tại.
Chúng ta có thể viết các dòng lệnh trên một hàng, nhưng các bạn không nên viết như vậy vì code sẽ rất khó rõ ràng cộng với đó là việc fix bug rất khó khăn. Vậy nên khi viết code chúng ta phải:
- Mỗi dòng code là một hàng.
- Các đoạn code con thì để trong khối lệnh
{ }
.
Ngoài ra bạn cũng cần nên lưu ý một số điểm như:
- C# có phân biệt kiểu chữ
- Sự thực thi chương trình bắt đầu tại phương thức Main.
- Tên file trong C# có thể khác tên lớp nếu bạn muốn.
CẤU TRÚC NHẬP XUẤT CƠ BẢN TRONG C#
Chúng ta sẽ cùng tìm hiểu các vấn đề:
- Cấu trúc cơ bản của các lệnh nhập xuất và ý nghĩa của chúng trong C#.
- Ví dụ demo chương trình nhập xuất bằng C#.
Cấu trúc cơ bản của các lệnh nhập xuất và ý nghĩa của chúng trong C#
Trong C# có 5 lệnh dùng để nhập xuất đó là:
Console.Write();
Console.WriteLine();
Console.Read();
Console.ReadLine();
Console.ReadKey();
Bây giờ chúng ta sẽ cùng tìm hiểu lần lượt các lệnh trên.
Console.Write();
Cú pháp:
Console.Write(<giá trị cần in ra màn hình>);
Ý nghĩa: In giá trị ra màn hình console. Giá trị này có thể là 1 ký tự, 1 chuỗi, một giá trị có thể chuyển về kiểu chuỗi.
Ví dụ:
Các bạn tạo mới một Project Console Application và thử đoạn lệnh sau:
static void Main(string[] args)
{
// In ra màn hình dòng chữ Kteam
Console.Write("Kteam");
// In ra màn hình số 10
Console.Write(10);
// In ra màn hình số 10.9 (f biểu thị cho kiểu dữ liệu float sẽ được trình bày chi tiết ở bài 5)
Console.Write(10.9f);
// In ra màn hình chữ true của kiểu dữ liệu bool(sẽ được trình bày chi tiết ở bài 5)
Console.Write(true);
}
Thực hiện chạy chương trình thì ta thấy màn hình console vừa hiện lên đã tắt. Vậy làm sao để xem được kết quả?
Để giải quyết vấn đề này chúng ta có nhiều cách:
- Sử dụng sự trợ giúp của công cụ hỗ trợ lập trình (cụ thể ở đây là Visual Studio):
- Ta thực hiện chạy chương trình bằng cách vào Debug > Start Without Debugging.
- Phím tắt Ctrl + F5.
Sử dụng mẹo nhỏ để giải quyết:
- Ý tưởng: ta sẽ dùng một lệnh nào đó là cho chương trình phải dừng lại đợi mình nhấn một phím bất kỳ mới kết thúc như vậy trước khi chúng ta nhấn một phím bất kỳ thì chúng ta có thể quan sát được kết quả trên màn hình console.
- Lệnh để thực hiện điều này:
Console.Read();
Console.ReadLine();
Console.ReadKey();
Chúng ta chỉ cần thêm 1 trong 3 lệnh trên vào cuối chương trình là xong. Ý nghĩa của 3 lệnh trên sẽ được giải thích chi tiết ở phần sau.
Có vẻ như kết quả in ra không như chúng ta mong muốn thì phải. Vấn đề đặt ra bây giờ là “chúng ta muốn in mỗi giá trị trên một dòng thì phải làm sao?” Để trả lời cho câu hỏi này chúng ta cùng qua phần tiếp theo
Console.WriteLine();
Cú pháp:
Console.WriteLine(<giá trị cần in ra màn hình>);
Ý nghĩa:
Lệnh này cũng tượng tự như Console.Write()
Nhưng sẽ khác khi in giá trị ra màn hình xong nó sẽ tự động đưa con trỏ xuống dòng. Điều này giúp ta có thể giải quyết được vấn đề đã đặt ra ở phần trên.
Ngoài ra, để xuống dòng ta còn có nhiều cách khác như:
- Sử dụng ký tự đặc biệt: chúng ta sử dụng ký tự “\n” trong chuỗi in ra màn hình thì trình biên dịch sẽ tự động đổi nó thành ký tự xuống dòng.
- Như vậy thay vì dùng Console.WriteLine(“K team”) ta có thể dùng Console.Write (“K team \n”)
- Các ký tự đặc biệt sẽ được giới thiệu trong phần sau của bài học.
- Sử dụng lệnh xuống dòng: ta sử dụng thêm 1 lệnh xuống dòng là Environment.NewLine
Như vậy thay vì dùng 2 cách trên ta sẽ viết:
Console.Write(Environment.NewLine);
Cách này khá dài dòng so với 2 cách trên và cũng rất ít người sử dụng. Hầu hết khi xuống dòng ta sử dụng Console.WriteLine() hoặc “\n”
Ví dụ:
static void Main(string[] args)
{
Console.Write("K team \n"); // Sử dụng ký tự đặc biệt để xuống dòng
Console.WriteLine(5); // Sử dụng lệnh in ra màn hình có xuống dòng
Console.Write(6.5f); // In ra giá trị nhưng không xuống dòng
Console.Write(Environment.NewLine); // sử dụng lệnh xuống dòng
Console.Write(true);
Console.ReadLine();
}
Kết quả khi chạy chương trình là:
Như vậy chúng ta đã tìm hiểu qua 2 lệnh xuất dữ liệu ra màn hình rồi. Điểm khác biệt cơ bản giữa 2 lệnh là:
- Console.Write(<giá trị cần in ra màn hình>): in giá trị ra màn hình nhưng không đưa con trỏ xuống dòng.
- Console.WriteLine(<giá trị cần in ra màn hình>): in giá trị ra màn hình và đưa con trỏ xuống dòng.
Console.Read();
Cú pháp:
Console.Read();
Ý nghĩa:
Đọc 1 ký tự từ bàn phím và trả về kiểu số nguyên là mã ASCII (American Standard Code for Information Interchange - Chuẩn mã trao đổi thông tin Hoa Kì,là bộ kí tự và bộ mã kí tự dựa trên bảng chữ cái La Tinh được dùng trong tiếng Anh hiện đại và các ngôn ngữ Tây Âu khác) của ký tự đó.
Chú ý: lệnh này không đọc được các phím chức năng như Ctrl, Shift, Alt, Caps Lock, Tab, . . .
Ví dụ:
Để biết chắc rằng máy tính có đọc được ký tự mình vừa nhấn hay không thì chúng ta sẽ thử viết chương trình đọc 1 ký tự và in ký tự đó ra màn hình như sau:
static void Main(string[] args)
{
Console.WriteLine(Console.Read()); // đọc 1 ký tự từ bàn phím bằng lệnh Console.Read() sau đó in ra ký tự vừa đọc được.
Console.ReadKey(); // lệnh này dùng với mục đích dừng màn hình để xem kết quả.
}
Các bạn nhập cái từ gì đó vào tùy ý
Kết quả khi chạy chương trình ta được: coi lại như nào
Như đã giải thích lệnh Console.Read() dùng để đọc 1 ký tự và trả về 1 số nguyên là mã ASCII của ký tự đó nên khi ta nhập a thì màn hình sẽ in ra số 97 (là mã ASCII của ký tự a).
Console.ReadLine();
Cú pháp:
Console.ReadLine();
Ý nghĩa: Đọc dữ liệu từ bàn phím cho đến khi gặp ký tự xuống dòng thì dừng (Nói cách khác là đọc cho đến khi mình nhấn enter thì dừng) và giá trị đọc được luôn là một chuỗi.
Ví dụ:
static void Main(string[] args)
{
Console.WriteLine(Console.ReadLine()); // đọc dữ liệu từ bàn phím cho đến khi gặp ký tự xuống dòng thì dừng. Sau đó in giá trị đã nhập ra màn hình.
Console.ReadKey(); // lệnh này dùng với mục đích dừng màn hình để xem kết quả.
}
- Kết quả khi chạy chương trình:
- Màn hình có 2 chữ “K team” là vì chữ đầu tiên do người dùng nhập từ bàn phím chữ thứ 2 là máy tính in ra bằng lệnh Console.WriteLine()
Console.ReadKey();
Cú pháp:
Console.ReadKey()
Ý nghĩa:
- Lệnh này cũng dùng để đọc một ký tự từ bàn phím nhưng trả về kiểu ConsoleKeyInfo (là một kiểu dữ liệu có cấu trúc được định nghĩa sẵn để chứa những ký tự của bàn phím bao gồm các phím chức năng).
- Tham số kiểu bool bao gồm 2 giá trị: true hoặc false. Nếu truyền vào true thì phím được ấn sẽ không hiển thị lên màn hình console mà được đọc ngầm ngược lại thì phím được ấn sẽ hiển thị lên màn hình console. Nếu không truyền tham số vào thì mặc định sẽ là false.
Ứng dụng của lệnh này rất mạnh nhưng trong phạm vi bài học hôm nay chúng ta chỉ tìm hiểu cú pháp và ý nghĩa cơ bản. Trong những bài học sau này sẽ giải thích chi tiết khi gặp lệnh trên. Vì thế phần ví dụ mình chỉ trình bày minh hoạ cho việc truyền tham số cho các bạn hiểu trước.
static void Main(string[] args)
{
Console.WriteLine("K team");
Console.ReadKey(); // không truyền tham số vào thì mặc định là false.
Console.ReadKey(false); // hiển thị phím ấn lên màn hình.
Console.ReadKey(true); // Không hiển thị phím ấn lên màn hình.
}
Các bạn chạy chương trình bằng cách ấn Ctrl + F5. Kết quả khi chạy ta được:
Khi chạy chương ta thử ấn 3 ký tự bất kỳ, ở đây mình ấn 3 lần phím ‘K’ nhưng trên màn hình chỉ có 2 chữ k được hiển thị.
Ví dụ chương trình nhập xuất cơ bản trong C#
static void Main(string[] args)
{
Console.WriteLine(" K team"); // In chữ "K team" sau đó xuống dòng.
Console.Write(" Moi ban nhap ten cua minh: "); // In không xuống dòng.
Console.WriteLine("Ten cua ban la: " + Console.ReadLine()); // Quy tắc chung trong thực hiện lệnh là lệnh bên trong thực hiện trước rồi đến lệnh bên ngoài chứa nó. Do đó chạy đến đây chương trình sẽ thực hiện lệnh Console.ReadLine() sau đó thực hiện cộng chuỗi và cuối cùng in chuỗi ra màn hình.
Console.Write(" Moi ban nhap ngay sinh: ");
Console.WriteLine(" Ngay sinh cua ban la: " + Console.ReadLine()); // Tương tự như trên
Console.Write(" Moi ban nhap que quan: ");
Console.WriteLine(" Que quan: " + Console.ReadLine()); // Tương tự như trên.
Console.ReadKey();
}
Kết quả khi chạy chương trình trên là:
Biến là gì? Tại sao phải sử dụng biến?
Trong toán học ta đã quá quen thuộc với thuật ngữ “biến”. Nếu biến số trong toán học là một số có thể thay đổi thì trong lập trình biến cũng được định nghĩa tương tự:
- Là một giá trị dữ liệu có thể thay đổi được.
- Là tên gọi tham chiếu đến một vùng nhớ nào đó trong bộ nhớ.
- Là thành phần cốt lõi của một ngôn ngữ lập trình.
Tại sao phải sử dụng biến?
Lưu trữ dữ liệu và tái sử dụng: ví dụ hãy tưởng tượng nếu bạn yêu cầu người nhập vào tuổi của họ, nhưng bạn không lưu trữ lại thì đến khi bạn muốn sử dụng thì chẳng biết lấy đâu ra để sử dụng cả.
Thao tác với bộ nhớ một cách dễ dàng:
- Cấu trúc của bộ nhớ bao gồm nhiều ô nhớ liên tiếp nhau, mỗi ô nhớ có một địa chỉ riêng (địa chỉ ô nhớ thường mã hex (thập lục phân)).
- Khi muốn sử dụng ô nhớ nào (cấp phát, hủy, lấy giá trị, . . .) bạn phải thông qua địa chỉ của chúng. Điều này làm cho việc lập trình trở nên khó khăn hơn.
- Thay vào đó bạn có thể khai báo một biến và cho nó tham chiếu đến ô nhớ bạn cần quản lý rồi khi sử dụng bạn sẽ dùng tên biến bạn đặt chứ không cần dùng địa chỉ của ô nhớ đó nữa. Rất tiện lợi phải không nào!
Khai báo và sử dụng biến
Cú pháp:
<Kiểu dữ liệu> <Tên biến>;
Trong đó:
- <Kiểu dữ liệu> có thể là:
- Kiểu dữ liệu cơ bản.
- Kiểu dữ liệu có cấu trúc, . . . (Sẽ được trình bày chi tiết trong bài KIỂU DỮ LIỆU TRONG C# ).
- <Tên biến>
- Là tên do người dùng đặt.
- Phải tuân thủ theo quy tắc đặt tên (sẽ được trình bày ngay sau đây).
Sử dụng biến
Khai báo:
int BienKieuSoNguyen;
float BienKieuSoThuc;
string BienKieuChuoi;
bool BienKieuLuanLy;
char BienKieuKyTu;
Trong đó:
- Kiểu dữ liệu là: int, float, string, bool, char
- Tên biến là: BienKieuSoNguyen, BienKieuSoThuc,…
Sử dụng:
Để sử dụng biến ta cần phải gán giá trị cho nó trước. Có 2 cách gán giá trị:
- Khởi tạo giá trị lúc khai báo:
int BienKieuSoNguyen = 10;
string BienKieuChuoi = “AnhTester”;
- Gán giá trị theo cú pháp:
<Tên biến> = <Giá trị>;
BienKieuSoNguyen = 9;
BienKieuKyTu = ‘K’;
Còn khi bạn muốn gọi một biến ra để lấy giá trị thì bạn chỉ cần gọi tên của nó ra là được. Ví dụ:
Console.WriteLine(BienKieuSoNguyen);
// In giá trị của biến tên là BienKieuSoNguyen ra màn hình. Kết quả là 9
hoặc
int a = 1, b = 2 ;
int c = a + b;
// Biến a và biến b được gọi để lấy giá trị sau đó cộng chúng lại rồi gán cho biến c.
Quy tắc đặt tên biến
Một số quy tắc khi đặt tên biến cũng như là các định danh khác:
- Tên biến là một chuỗi ký tự liên kết (không có khoảng trắng) và không chứa ký tự đặc biệt.
- Tên biến không được đặt bằng tiếng việt có dấu.
- Tên không được bắt đầu bằng số.
- Tên biến không được trùng nhau.
- Tên biến không được trùng với từ khóa:
Dưới dây là danh sách các từ khóa trong C#, các bạn chỉ cần nắm để tránh đặt tên trùng với từ khóa còn việc mặt ý nghĩa từ khóa sẽ được trình bày trong suốt các bài học sau này.
Ngoài ra các lập trình viên cũng đưa ra một số quy tắc chung trong việc đặt tên để dễ quản lý và giúp cho người khác có thể dễ dàng đọc code của mình
Quy tắc Lạc Đà
Viết thường từ đầu tiên và viết hoa chữ cái đầu tiên của những từ tiếp theo.
Thường được dùng để đặt tên cho các biến có phạm vi truy cập là private hoặc protected (phạm vi truy cập sẽ được trình bày chi tiết trong phần Class và các tham số của hàm.
Ví dụ: automationTesting, anhTester, . . .
Quy tắc Pascal
Viết hoa chữ cái đầu tiên của mỗi từ.
Thường được dùng để đặt tên cho những thành phần còn lại như hàm, Interface, Enum, Sự kiện,...
Một số lưu ý khi đặt tên biến:
- Nên đặt tên ngắn gọn dễ hiểu, thể hiện rõ mục đích của biến. Ví dụ như: Name, Tuoi, GioiTinh, . . .
- Không nên đặt tên biến bằng một ký tự như i, k, m, . . . như vậy sau này khi xem lại code hoặc đưa code cho người khác đọc thì chúng ta sẽ không hiểu biến này dùng để làm gì. Trừ những trường hợp đặc biệt (sẽ nói trong những bài học sau).
- C# có phân biệt chữ hoa chữ thường. Ví dụ biến a khác biến A hoặc lệnh Console.WriteLine() khác lệnh Console.WRITELINE().
Kiểu dữ liệu là gì? Tại sao phải có kiểu dữ liệu?
Định nghĩa
Kiểu dữ liệu được định nghĩa như sau:
- Là tập hợp các nhóm dữ liệu có cùng đặc tính, cách lưu trữ và thao tác xử lý trên trường dữ liệu đó.
- Là một tín hiệu để trình biên dịch nhận biết kích thước của một biến (ví dụ như int là 4 bytes, sẽ được trình bày ở phần sau) và khả năng của nó (ví dụ biến kiểu int chỉ có thể chứa được các số nguyên).
- Là thành phần cốt lõi của một ngôn ngữ lập trình.
Tại sao phải có kiểu dữ liệu?
- Như trong định nghĩa đã trình bày, phải có kiểu dữ liệu để nhận biết kích thước và khả năng của một biến.
- Nhằm mục đích phân loại dữ liệu. Nếu như không có kiểu dữ liệu ta rất khó xử lý vì không biết biến này kiểu chuỗi hay kiểu số nguyên hay kiểu số thực, . . .
Phân loại kiểu dữ liệu và ý nghĩa của từng kiểu dữ liệu
Trong C#, kiểu dữ liệu được chia thành 2 tập hợp kiểu dữ liệu chính:
- Kiểu dữ liệu dựng sẵn (built - in) mà ngôn ngữ cung cấp.
- Kiểu dữ liệu do người dùng định nghĩa (user - defined).
Trong phạm vi bài học này chúng ta chỉ tìm hiểu qua các kiểu dữ liệu dựng sẵn cơ bản những kiểu dữ liệu còn lại chúng ta sẽ tìm hiểu trong các bài học sau. Ý nghĩa của một số kiểu dữ liệu cơ bản:
Nhóm |
Kiểu dữ liệu |
Kích thước (bytes) |
Ý nghĩa |
Kiểu số nguyên |
byte |
1 |
Số nguyên dương không dấu có giá trị từ 0 đến 255 |
sbyte |
1 |
Số nguyên có dấu có giá trị từ -128 đến 127 |
|
short |
2 |
Số nguyên có dấu có giá trị từ -32,768 đến 32,767 |
|
ushort |
2 |
Số nguyên không dấu có giá trị từ 0 đến 65,535 |
|
int |
4 |
Số nguyên có dấu có giá trị từ -2,147,483,647 đến 2,147,483,647 |
|
uint |
4 |
Số nguyên không dấu có giá trị từ 0 đến 4,294,967,295 |
|
long |
8 |
Số nguyên có dấu có giá trị từ -9,223,370,036,854,775,808 đến 9,223,370,036,854,775,807 |
|
ulong |
8 |
Số nguyên không dấu có giá trị từ 0 đến 18,446,744,073,709,551,615 |
|
Kiểu ký tự |
char |
2 |
Chứa một ký tự Unicode |
Kiểu logic |
bool |
1 |
Chứa 1 trong 2 giá trị logic là true hoặc false |
Kiểu số thực |
float |
4 |
Kiểu số thực dấu chấm động có giá trị dao động từ 3.4E – 38 đến 3.4E + 38, với 7 chữ số có nghĩa |
double |
8 |
Kiểu số thực dấu chấm động có giá trị dao động từ 1.7E – 308 đến 1.7E + 308, với 15, 16 chữ số có nghĩa |
|
decimal |
8 |
Có độ chính xác đến 28 con số và giá trị thập phân, được dùng trong tính toán tài chính |
- Khác với những kiểu dữ liệu trên, string là kiểu dữ liệu tham chiếu và dùng để lưu chuỗi ký tự.
Một số lưu ý khi sử dụng các kiểu dữ liệu trên:
Khác với những kiểu dữ liệu trên, string là kiểu dữ liệu tham chiếu và dùng để lưu chuỗi ký tự. Trong phạm vi bài học hôm nay chúng ta chỉ tìm hiểu qua các kiểu dữ liệu dựng sẵn cơ bản những kiểu dữ liệu còn lại chúng ta sẽ tìm hiểu trong các bài học sau.
Ý nghĩa của một số kiểu dữ liệu cơ bản:
- Kiểu dữ liệu có miền giá trị lớn hơn sẽ chứa được kiểu dữ liệu có miền giá trị nhỏ hơn. Như vậy biến kiểu dữ liệu nhỏ hơn có thể gán giá trị qua biến kiểu dữ liệu lớn hơn (sẽ được trình bày trong phần tiếp theo).
- Giá trị của kiểu char sẽ nằm trong dấu ‘ ’ (nháy đơn).
- Giá trị của kiểu string sẽ nằm trong dấu “ ” (nháy kép).
- Giá trị của biến kiểu float phải có chữ F hoặc f làm hậu tố.
- Giá trị của biến kiểu decimal phải có chữ m hoặc M làm hậu tố.
- Trừ kiểu string, tất cả kiểu dữ liệu trên đều không được có giá trị null:
- Null là giá trị rỗng, không tham chiếu đến vùng nhớ nào.
- Để có thể gán giá trị null cho biến thì ta thêm ký tự ? vào sau tên kiểu dữ liệu là được. Ví dụ: int? hay bool? . . .
Ví dụ chương trình sử dụng kiểu dữ liệu
Ví dụ 1: Khai báo biến với các kiểu dữ liệu đã học.
static void Main(string[] args)
{
// Kiểu số nguyên
byte BienByte = 10;
short BienShort = 10;
int BienInt = 10;
long BienLong = 10;
// Kiểu số thực
float BienFloat = 10.9f; // Giá trị của biến kiểu float phải có hậu tố f hoặc F.
double BienDouble = 10.9; // Giá trị của biến kiểu double không cần hậu tố.
decimal BienDecimal = 10.9m; // Giá trị của biến kiểu decimal phải có hậu tố m.
// Kiểu ký tự và kiểu chuỗi
char BienChar = 'K'; // Giá trị của biến kiểu ký tự nằm trong cặp dấu '' (nháy đơn).
string BienString = "Kteam"; // Giá trị của biến kiểu chuỗi nằm trong cặp dấu "" (nháy kép).
Console.ReadKey();
}
Các bạn chú ý vào cách khai báo, khởi tạo giá trị cho các biến.
Ví dụ 2: Một số thao tác liên quan đến biến và kiểu dữ liệu.static void Main(string[] args)
{
// Kiểu số nguyên
byte BienByte = 3;
short BienShort = 9;
int BienInt = 10;
long BienLong = 0;
BienLong = BienByte; // BienLong có kiểu dữ liệu lớn hơn BienByte nên giá trị BienByte có thể gán qua cho BienLong
Console.WriteLine(" BienLong = " + BienLong);
BienLong = BienInt; // tương tự như trên
Console.WriteLine(" BienLong = {0}", BienLong);
BienShort = BienByte; // tương tự như trên
Console.WriteLine(" BienShort = " + BienShort);
BienInt = BienShort; // tương tự như trên
Console.WriteLine(" BienInt = " + BienInt);
Console.ReadKey();
}
Ở ví dụ này chúng ta kiểm chứng lại xem việc gán giá trị từ biến có kiểu dữ liệu nhỏ hơn sang biến có kiểu dữ liệu lớn hơn có được hay không. Và kết quả sau khi chạy chương trình:
Ví dụ 3: Những lỗi cần lưu ý.
static void Main(string[] args)
{
int a;
Console.WriteLine(" a = " + a); // Lỗi vì biến a không thể sử dụng khi chưa có giá trị.
int b = 10.9; // Lỗi vì b là biến kiểu số nguyên nên không thể nhận giá trị ngoài số nguyên.
byte c = 1093; // Lỗi vì c là biến kiểu byte mà kiểu byte có miền giá trị từ -128 đến 127 nên không thể nhận giá ngoài vùng này được.
string d = 'K'; // Lỗi vì không thể gán giá trị ký tự vào biến kiểu chuỗi được mặc dù chuỗi có thể hiểu là tập hợp nhiều ký tự. Có thể sửa bẳng cặp dấu "" thay vì ''.
long e = null; // Lỗi vì không thể gán null cho biến kiểu long, int, byte, . . .
long? f = null; // Cách khắc phục là thêm dấu ? vào sau kiểu dữ liệu. Lúc này kiểu dữ liệu của f là long?
int g = 10;
byte h = g; // Lỗi vì giá trị của biến có kiểu dữ liệu lớn hơn không thể gán cho biến có kiểu dữ liệu nhỏ hơn mặc dù trong trường hợp này ta thấy số 10 đều có thể gán cho 2 biến.
string k = "AnhTester";
Console.WriteLine(" k = " + K); // Lỗi vì phía trên khai báo biến k còn khi sử dụng là biến K (C# có phân biệt chữ hoa, thường cần lưu ý để tránh gặp lỗi)
Console.ReadKey();
}
Toán tử là gì?
Toán tử được định nghĩa như sau:
- Là một công cụ để thao tác với dữ liệu.
- Một toán tử là một ký hiệu dùng để đại diện cho một thao tác cụ thể được thực hiện trên dữ liệu.
Có 6 loại toán tử cơ bản:
- Toán tử toán học.
- Toán tử quan hệ.
- Toán tử logic.
- Toán tử khởi tạo và gán.
- Toán tử so sánh trên bit.
- Toán tử khác.
Cú pháp và ý nghĩa của từng toán tử
Toán tử toán học
Giả sử biến a có giá trị là 10 biến b có giá trị là 9
Toán tử |
Mô tả |
Ví dụ |
+ |
Thực hiện cộng hai toán hạng |
a + b kết quả bằng 19 |
- |
Thực hiện trừ hai toán hạng |
a - b kết quả bằng 1 |
* |
Thực hiện nhân hai toán hạng |
a * b kết quả bằng 90 |
/ |
Thực hiện chia lấy phần nguyên hai toán hạng nếu 2 toán hạng là số nguyên. Ngược lại thì thực hiện chia bình thường |
a / b kết quả bằng 1 |
% |
Thực hiện chia lấy dư |
a%b kết quả bằng 1 |
++ |
Tăng giá trị lên 1 đơn vị |
a++ kết quả bằng 11 |
-- |
Giảm giá trị xuống 1 đơn vị |
a-- kết quả bằng 9 |
Lưu ý: đối với toán tử ++ và -- cần phần biệt a++ và ++a (hoặc a-- và --a):
- a++: là sử dụng giá trị của biến a để thực hiện biểu thức trước rồi mới thực hiện tăng lên 1 đơn vị. Tương tự cho a--.
- ++a: là tăng giá trị biến a lên 1 đơn vị rồi mới sử dụng biến a để thực hiện biểu thức. Tương tự cho --a.
Ví dụ:
static void Main(string[] args)
{
int i = 5, j = 5;
Console.WriteLine(i++); // Sử dụng giá trị i để in ra rồi mới tăng i
Console.WriteLine(++j); // Tăng j lên rồi mới in giá trị j ra màn hình
Console.ReadKey();
}
- Kết quả khi chạy chương trình:
5
6
- Biến i đã được sử dụng để in ra màn hình rồi sau đó mới tăng lên 1 đơn vị cho nên màn hình mới in ra số 5.
- Biến j thì ngược lại, tăng lên 1 đơn vị trước rồi mới sử dụng giá trị mới để in ra màn hình nên màn hình in ra số 6.
Toán tử quan hệ
Giả sử biến a có giá trị bằng 10 và biến b có giá trị bằng 9:
Toán tử |
Mô tả |
Ví dụ |
== |
So sánh 2 toán hạng có bằng nhau hay không. Nếu bằng thì trả về true nếu không bằng thì trả về false |
a == b sẽ trả về false |
!= |
So sánh 2 toán hạng có bằng nhau hay không. Nếu không bằng thì trả về true nếu bằng thì trả về false |
a != b sẽ trả về true |
> |
So sánh 2 toán hạng bên trái có lớn hơn toán hạng bên phải hay không. Nếu lớn hơn thì trả về true nếu không lớn hơn thì trả về false |
a > b sẽ trả về true |
< |
So sánh 2 toán hạng bên trái có nhỏ hơn toán hạng bên phải hay không. Nếu nhỏ hơn thì trả về true nếu không nhỏ hơn thì trả về false |
a < b sẽ trả về false |
>= |
So sánh 2 toán hạng bên trái có lớn hơn hoặc bằng toán hạng bên phải hay không. Nếu lớn hơn hoặc bằng thì trả về true nếu nhỏ hơn thì trả về false |
a >= b sẽ trả về true |
<= |
So sánh 2 toán hạng có nhỏ hơn hoặc bằng hay không. Nếu nhỏ hơn hoặc bằng thì trả về true nếu lớn hơn thì trả về false |
a <= b sẽ trả về false |
Lưu ý:
- Các toán tử quan hệ này chỉ áp dụng cho số hoặc ký tự.
- Hai toán hạng hai bên phải cùng loại (cùng là số hoặc cùng là ký tự).
- Bản chất của việc so sánh 2 ký tự với nhau là so sánh mã ASCII của các ký tự đó.
- Ví dụ: so sánh ‘A’ và ‘B’ bản chất là so sánh số 65 với 66.
- Không nên sử dụng các toán tử trên để so sánh các chuỗi với nhau vì bản chất việc so sánh chuỗi là so sánh từng ký tự tương ứng với nhau mà so sánh ký tự là so sánh mã ASCII của ký tự đó như vậy ký tự ‘K’ sẽ khác ký tự ‘k’. Để so sánh hai chuỗi người ta thường dùng hàm so sánh chuỗi đã được hỗ trợ sẵn (sẽ tìm hiểu ở những bài tiếp theo).
Toán tử logic
Giả sử mệnh đề A là đúng và mệnh đề B là sai:
Toán tử |
Mô tả |
Ví dụ |
&& |
Hay còn gọi là toán tử logic AND (và). Trả về true nếu tất cả toán hạng đều mang giá trị true. Và trả về false nếu có ít nhất 1 toán hạng mang giá trị false. |
A && B kết quả là false |
|| |
Hay còn gọi là toán tử logic OR (hoặc). Trả về true nếu có ít nhất 1 toán hạng mang giá trị true. Và trả về false nếu tất cả toán hạng đều mang giá trị false. |
A || B kết quả là true. |
! |
Hay còn gọi là toán tử logic NOT (phủ định). Có chức năng đảo ngược trạng thái logic của toán hạng. Nếu toán hạng đang mang giá trị true thì kết quả sẽ là false và ngược lại. |
!A kết quả là false |
Lưu ý:
- Các toán tử && và || có thể áp dụng đồng thời nhiều toán hạng, ví dụ như: A && B && C || D || K (Thứ tự thực hiện sẽ được trình bày ở phần sau).
- Các toán hạng trong biểu thức chứa toán tử logic phải trả về true hoặc false.
Toán tử khởi tạo và gán
Toán tử khởi tạo và gán thường được sử dụng nhằm mục đích lưu lại giá trị cho một biến nào đó. Một số toán tử khởi tạo và gán hay được sử dụng:
Toán tử |
Mô tả |
Ví dụ |
= |
Gán giá trị của toán hạng bên phải cho toán hạng bên trái. |
K = 10 sẽ gán 10 cho biến K |
+= |
Lấy toán hạng bên trái cộng toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. |
K += 1 tương đương với K = K + 1 |
-= |
Lấy toán hạng bên trái trừ toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. |
K -= 1 tương đương với K = K – 1 |
*= |
Lấy toán hạng bên trái nhân toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. |
K *= 1 tương đương với K = K * 1 |
/= |
Lấy toán hạng bên trái chia lấy phần nguyên với toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. |
K /= 1 tương đương với K = K / 1 |
%= |
Lấy toán hạng bên trái chia lấy dư với toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. |
K %= 1 tương đương với K = K % 1 |
Một số lưu ý khi sử dụng các toán tử trên:
- Toán tử bên trái thường là một biến, còn toán tử bên phải có thể là biến có thể là biểu thức đều được.
- Một phép toán gán hoặc khởi tạo có thể được sử dụng như là toán hạng bên phải cho một phép gán hoặc khởi tạo khác. Ví dụ:
int H, K, T;
H = K = T = 10;
Console.WriteLine(" H = {0}, K = {1}, T = {2}", H, K, T);
H += K = T = 5;
Console.WriteLine(" H = {0}, K = {1}, T = {2}", H, K, T);
- Phép toán H =K =T = 10 sẽ thực hiện gán 10 cho biến T sau đó gán giá trị biến T cho biến K sau đó gán giá trị biến K cho biến H. Như vậy ta được cả 3 biến H K T đều có giá trị bằng 10.
- Phép toán H += K = T = 5 sẽ thực hiện gán 5 cho biến T sau đó gán giá trị biến T cho biến K sau đó lấy H + K gán kết quả cho biến H. Cuối cùng ta được H = 15, K = 5, T = 5.
Toán tử so sánh trên bit
Tìm hiểu thêm
Toán tử khác
Tìm hiểu thêm
Độ ưu tiên của toán tử
Độ ưu tiên của các toán tử biểu thị cho việc toán tử nào được ưu tiên thực hiện trước trong câu lệnh. Độ ưu tiên được tóm tắt ở bảng sau:
Mức |
Toán tử |
Thứ tự |
|||||||||
Cao nhất |
() [] . |
Trái sang phải |
|||||||||
|
+ - |
++ -- |
! ~ |
new |
sizeof() typeof() |
Phải sang trái |
|||||
* |
/ |
% |
Trái sang phải |
||||||||
<< |
>> |
Trái sang phải |
|||||||||
< |
<= |
> |
>= |
Trái sang phải |
|||||||
== |
!= |
Trái sang phải |
|||||||||
& |
^ |
| |
Trái sang phải |
||||||||
&& |
|| |
Trái sang phải |
|||||||||
? : |
|
||||||||||
= |
+= -= |
*= /= |
%= |
Phải sang trái |
|||||||
Thấp nhất |
, |
|
Bảng thống kê trên chỉ thể hiện những toán tử chúng ta đã học, ngoài ra vẫn còn nhiều toán tử khác những ít khi sử dụng nên không đề cập đến.
Từ bảng trên ta có thể rút ra được 1 kinh nghiệm đó là nếu muốn biểu thức nào được thực hiện trước ta chỉ cần nhóm chúng vào cặp ngoặc tròn ( ) là được!
Ví dụ chương trình sử dụng một số toán tử
Ví dụ 1: Các phép toán cơ bản
static void Main(string[] args)
{
int a, b, c;
a = b = (c = 9) + 1; // khởi tạo giá trị: a = 10, b = 10, c = 9
a += b; // tương đương a = a + b
b = c++; // thực hiện gán giá trị c cho biến b sau đó thực hiện c = c + 1
--c; // thực hiện c = c - 1
Console.WriteLine(" a = {0}, b = {1}, c = {2}", a, b, c);
Console.ReadKey();
}
- Các bạn chú ý vào phần chú thích (chữ màu xanh lá) để hiểu ý nghĩa từng câu lệnh. Kết quả khi chạy chương trình:
Lưu ý: đối với phép toán --c hoặc c-- khi đứng độc lập thì không có khác biệt gì.
Hằng là gì? Tại sao phải có hằng?
Khái niệm về hằng:
- Là một biến những giá trị không thay đổi trong suốt chương trình.
- Bắt buộc phải khởi tạo giá trị khi khai báo.
Tại sao phải có hằng?
- Để ngăn chặn việc gán giá trị khác vào biến.
- Hằng làm cho chương trình dễ đọc hơn bằng cách biến những con số vô cảm thành những tên có nghĩa.
- Hằng giúp cho chương trình dễ nâng cấp, dễ sửa chữa hơn.
- Hằng giúp cho việc tránh lỗi dễ dàng hơn. Nếu bạn vô ý gán giá trị cho một biến hằng ở đâu thì trình biên dịch sẽ báo lỗi ngay lập tức.
Cú pháp để tạo một biểu tượng hằng:
const <kiểu dữ liệu> <tên biến> = <giá trị hằng>;
Có thể thấy cú pháp này khá giống với cú pháp khai báo nhưng có 2 điểm các bạn cần lưu ý:
- Phải có từ khóa const phía trước khai báo.
- Phải khởi tạo giá trị ngay tại khai báo.
Ép kiểu là gì? Tại sao phải ép kiểu?
Ép kiểu là biến đổi dữ liệu thuộc kiểu dữ liệu này thành kiểu dữ liệu khác.
Tại sao phải ép kiểu?
- Để chuyển dữ liệu sang một kiểu dữ liệu mong muốn phục vụ cho việc thao tác xử lý.
- Đưa dữ liệu về định dạng mà mình mong muốn (ví dụ chuyển kiểu ngày tháng bên Mỹ sang dạng ngày tháng bên Việt Nam).
Có mấy loại ép kiểu? Cách sử dụng từng loại
Trong C#, ép kiểu có 4 loại:
- Chuyển đổi kiểu ngầm định (implicit).
- Chuyển đổi kiểu tường minh (explicit).
- Sử dụng phương thức, lớp hỗ trợ sẵn:
- Dùng phương thức Parse(), TryParse().
- Dùng lớp hỗ trợ sẵn (Convert).
- Người dùng tự định nghĩa kiểu chuyển đổi.
Chúng ta sẽ sử dụng cách: Sử dụng phương thức, lớp hỗ trợ sẵn
Phương thức Parse(), TryParse()
Parse()
Cú pháp:
<kiểu dữ liệu>.Parse(<dữ liệu cần chuyển đổi>);
- <kiểu dữ liệu> là kiểu dữ liệu cơ bản mình muốn chuyển đổi sang.
- <dữ liệu cần chuyển đổi> là dữ liệu thuộc kiểu chuỗi, có thể là biến kiểu chuỗi hoặc giá trị hằng kiểu chuỗi (giá trị hằng đã giải thích trong bài HẰNG TRONG C#).
Ý nghĩa:
- Chuyển đổi một chuỗi sang một kiểu dữ liệu cơ bản tương ứng.
- Phương thức trả về giá trị kết quả chuyển kiểu nếu chuyển kiểu thành công. Ngược lại sẽ báo lỗi chương trình.
Ví dụ:
string stringValue = "10";
int intValue = int.Parse(stringValue); // Chuyển chuỗi stringValue sang kiểu int và lưu giá trị vào biến intValue - Kết quả intValue = 10
double HowKteam = double.Parse("10.9"); // Chuyển chuỗi giá trị hằng "10.9" sang kiểu int và lưu giá trị vào biến HowKteam - Kết quả HowKteam = 10.9
TryParse()
Cú pháp:
<kiểu dữ liệu>.TryParse(<dữ liệu cần chuyển đổi>, out <biến chứa kết quả>);
- <kiểu dữ liệu> là kiểu dữ liệu cơ bản mình muốn chuyển đổi sang.
- <dữ liệu cần chuyển đổi> là dữ liệu thuộc kiểu chuỗi, có thể là biến kiểu chuỗi hoặc giá trị hằng kiểu chuỗi.
- <biến chứa kết quả> là biến mà bạn muốn lưu giá trị kết quả sau khi chuyển kiểu thành công. Từ khóa out là từ khóa bắt buộc phải có, ý nghĩa của từ khóa này sẽ được trình bày chi tiết trong bài HÀM TRONG C#.
Ý nghĩa:
- Chuyển một chuỗi sang một kiểu dữ liệu cơ bản tương ứng.
- Phương thức sẽ trả về true nếu chuyển kiểu thành công và giá trị kết quả chuyển kiểu sẽ lưu vào <biến chứa kết quả>. Ngược lại sẽ trả về false và <biến chứa kết quả> sẽ mang giá trị 0.
Ví dụ:
int Result; // Biến chứa giá trị kết quả khi ép kiểu thành công
bool isSuccess; // Biến kiểm tra việc ép kiểu có thành công hay không
string Data1 = "10", Data2 = "Kteam"; // Dữ liệu cần ép kiểu
isSuccess = int.TryParse(Data1, out Result); // Thử ép kiểu Data1 về int nếu thành công thì Result sẽ chứa giá trị kết quả ép kiểu và isSuccess sẽ mang giá trị true. Ngược lại Result sẽ mang giá trị 0 và isSuccess mang giá trị false
Console.Write(isSuccess == true ? " Success !" : " Failed !"); // Sử dụng toán tử 3 ngôi để in ra màn hình việc ép kiểu đã thành công hay thất bại.
Console.WriteLine(" Result = " + Result); // In giá trị Result ra màn hình
isSuccess = int.TryParse(Data2, out Result); // Tương tự như trên nhưng thao tác với Data2
Console.Write(isSuccess == true ? " Success !" : " Failed !"); // Tương tự như trên
Console.WriteLine(" Result = " + Result); // Tương tự như trên
Lưu ý khi sử dụng Parse() và TryParse():
- Tham số truyền vào phải là một chuỗi.
- Cả 2 phương thức được gọi thông qua tên kiểu dữ liệu.
- Parse() trả về giá trị kết quả ép kiểu nếu ép kiểu không thành công thì sẽ báo lỗi. Còn TryParse() trả về xem ép kiểu có thành công hay không, giá trị kết quả ép kiểu sẽ nằm trong <biến chứa kết quả>.
- Ngoài TryParse() ra thì vẫn có một cách ép kiểu không báo lỗi chương trình. Đó là sử dụng toán tử as:
- Trong bài TOÁN TỬ TRONG C# chúng ta có giới thiệu toán tử as dùng để “Ép kiểu mà không gây ra lỗi. Nếu ép kiểu không thành công sẽ trả về null”.
- Chỉ áp dụng cho việc chuyển kiểu giữa các kiểu tham chiếu tương thích (thường là các kiểu có quan hệ kế thừa (sẽ được trình bày ở bài TÍNH KẾ THỪA TRONG C#)) hoặc các kiểu nullable (là các kiểu có thể chứa giá trị null).
- Qua phần KIỂU DỮ LIỆU OBJECT TRONG C# sẽ ví dụ rõ hơn.
Convert
Lớp Convert là một lớp tiện ích trong C# cung cấp cho chúng ta rất nhiều phương thức tĩnh khác nhau để chuyển đổi từ một kiểu dữ liệu này sang kiểu dữ liệu khác.
Các đặc điểm của các phương thức trong lớp Convert:
- Tham số truyền vào của các phương thức không nhất thiết là chuỗi (có thể là int, bool, . . .).
- Nếu tham số truyền vào là null thì các phương thức sẽ trả về giá trị mặc định của kiểu dữ liệu.
- Các trường hợp tham số truyền vào sai định dạng hoặc vượt quá giới hạn thì chương trình sẽ báo lỗi như phương thức Parse().
Ví dụ:
Các phương thức trong lớp Convert sẽ trả về giá trị mặc định nếu như tham số truyền vào là null. Còn trong các trường hợp sai định dạng hoặc vượt quá giới hạn thì các phương thức đó sẽ ném ra các ngoại lệ tương tự như phương thức Parse. Ví dụ:
Một số phương thức chuyển kiểu mà Convert có:
Tên phương thức | Ý nghĩa |
ToBoolean | Chuyển đổi một kiểu thành một bool (true, false) nếu có thể |
ToByte | Chuyển đổi một kiểu thành một byte |
ToChar | Chuyển đổi một kiểu thành một char nếu có thể |
ToDateTime | Chuyển đổi một kiểu thành các cấu trúc date-time |
ToDecimal | Chuyển đổi một kiểu thành một kiểu thập phân |
ToDouble | Chuyển đổi một kiểu thành kiểu double |
ToInt32 | Chuyển đổi một kiểu thành kiểu int |
ToString | Chuyển đổi một kiểu thành kiểu string |
- Các phương thức chuyển kiểu trong lớp Convert đều có thể nhận các kiểu dữ liệu cơ bản (int, bool, byte, . . .) làm tham số truyền vào.
- Ở bảng trên mình chỉ liệt kê những phương thức hay dùng. Để tìm hiểu thêm các phương thức chuyển kiểu khác các bạn có thể sử dụng tính năng gợi ý của Visual Studio:
- Đầu tiên các bạn gõ “Convert.” (lưu ý dấu chấm liền sau Convert)
- Visual Studio sẽ hiển thị ra tất cả các phương thức có trong lớp Convert. Giờ bạn chỉ việc lựa chọn phương thức muốn sử dụng là được.
Người dùng tự định nghĩa kiểu chuyển đổi
Casting (Ép kiểu)
Ép kiểu là cách chúng ta có thể sử dụng khi muốn chuyển đổi giữa các kiểu dữ liệu có tính chất tương tự nhau (thường là số). Ví dụ :
Ngoài ra, đối với các giá trị được lưu trong kiểu tổng quát Object (bằng cách boxing) thì chúng ta có thể ép kiểu đưa về kiểu dữ liệu ban đầu (Tìm hiểu về Boxing và Unboxing)
Ép kiểu chỉ được sử dụng khi chúng ta biết rõ rằng đối tượng đó chứa kiểu dữ liệu tương ứng với kiểu mà ta cần chuyển tới. Ví dụ như các trường hợp sau sẽ là các lỗi cú pháp trong lập trình:
Chú ý: Việc sử dụng cách nào là do tùy chương trình và còn phụ thuộc vào sự quan hệ giữa các kiểu dữ liệu vì thế các bạn nên chú ý nhé.