Giới thiệu ngôn ngữ C#, cài đặt môi trường với Visual Studio IDE, kiểu dữ liệu, toán tử, function (hàm), variable (biến), ép kiểu.
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.
Ngôn ngữ lập trình C# có những đặc trưng cơ bản sau:
Một số ưu điểm nổi bật của C#:
Đi kèm với những điểm mạnh trên thì C# cũng có những nhược điểm:
Chúng ta lựa chọn C# để tìm hiểu là vì:
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 !!!");
}
}
}
Để 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 =))
Key đây cần thì kích hoạt luôn :)
NJVYC-BMHX2-G77MM-4XJMR-6Q8QF
KBJFW-NXHK6-W4WJM-CRMQB-G3CDH
HMGNV-WCYXV-X7G9W-YCX63-B98R2
HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

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:
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,
Bước 8) Màn hình Visual Studio 'Get Started' sẽ xuất hiện.
Bước 1) Trong Menu File, Bấm New > Project...
Bước 2) Trong màn hình tiếp theo,

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.

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();
}
}
}
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 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
}
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> { }
Đâ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.
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 để:
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
}
}
}
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:
{ }.Ngoài ra bạn cũng cần nên lưu ý một số điểm như:
Chúng ta sẽ cùng tìm hiểu các vấn đề:
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.
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 mẹo nhỏ để giải quyết:
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
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ư:
Console.Write(Environment.NewLine);
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à:
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).
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ả.
}

Cú pháp:
Console.ReadKey()
Ý nghĩa:
Ứ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ị.
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à:

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ư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ú pháp:
<Kiểu dữ liệu> <Tên biến>;
Trong đó:
Khai báo:
int BienKieuSoNguyen;
float BienKieuSoThuc;
string BienKieuChuoi;
bool BienKieuLuanLy;
char BienKieuKyTu;
Trong đó:
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ị:
int BienKieuSoNguyen = 10;
string BienKieuChuoi = “AnhTester”;
<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.
Một số quy tắc khi đặt tên biến cũng như là các định danh khác:
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
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, . . .
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:
Kiểu dữ liệu được định nghĩa như sau:
Trong C#, kiểu dữ liệu được chia thành 2 tập hợp kiểu dữ liệu chính:
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ự. 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:
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:
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ử được định nghĩa như sau:
Có 6 loại toán tử cơ bản:
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();
}
5
6
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).
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 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:
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);

Tìm hiểu thêm
Tìm hiểu thêm
Độ ư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!
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();
}

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ì.
Khái niệm về hằng:
Tại sao phải có hằng?
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 ý:
VÍ DỤ:
Chương trình sau minh họa cách định nghĩa và sử dụng một hằng trong chương trình C# của bạn:
using System;
namespace HoclaptrinhCsharp
{
class TestCsharp
{
static void Main(string[] args)
{
Console.WriteLine("Hang so trong C#");
Console.WriteLine("-------------------");
//khai bao hang so pi
const double pi = 3.14159;
double r;
Console.Write("Nhap ban kinh: ");
r = Convert.ToDouble(Console.ReadLine());
double dien_tich = pi * r * r;
Console.WriteLine("\nBan kinh: {0}, Dien tich: {1}", r, dien_tich);
Console.ReadLine();
Console.ReadKey();
}
}
}
Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

É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?
Trong C#, ép kiểu có 4 loại:
Chúng ta sẽ sử dụng cách: Sử dụng phương thức, lớp hỗ trợ sẵn
Cú pháp:
<kiểu dữ liệu>.Parse(<dữ liệu cần chuyển đổi>);
Ý nghĩa:
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
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ả>);
Ý nghĩa:
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():
Các đặc điểm của các phương thức trong lớp Convert:
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 |
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é.
Severity: Notice
Message: Undefined variable: new
Filename: post/post_detail.php
Line Number: 384
Backtrace:
File: /home/anhtest2/public_html/application/views/frontend/post/post_detail.php
Line: 384
Function: _error_handler
File: /home/anhtest2/public_html/application/views/frontend/layout/layout_view.php
Line: 591
Function: view
File: /home/anhtest2/public_html/application/core/MY_Controller.php
Line: 34
Function: view
File: /home/anhtest2/public_html/application/controllers/frontend/Post.php
Line: 59
Function: render
File: /home/anhtest2/public_html/index.php
Line: 315
Function: require_once
Severity: Notice
Message: Trying to get property 'slug' of non-object
Filename: post/post_detail.php
Line Number: 384
Backtrace:
File: /home/anhtest2/public_html/application/views/frontend/post/post_detail.php
Line: 384
Function: _error_handler
File: /home/anhtest2/public_html/application/views/frontend/layout/layout_view.php
Line: 591
Function: view
File: /home/anhtest2/public_html/application/core/MY_Controller.php
Line: 34
Function: view
File: /home/anhtest2/public_html/application/controllers/frontend/Post.php
Line: 59
Function: render
File: /home/anhtest2/public_html/index.php
Line: 315
Function: require_once
Anh Tester
Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu