Trong bài này chúng ta sẽ tìm hiểu:

  • Lệnh (statements), định danh (identifiers), và từ khoá (keywords)
  • Chú thích (comment)
  • Biến (variables)
  • Kiểu dữ liệu sơ cấp (primitive data types)
  • Các toán tử (operators)
  • Biểu thức (expressions)
  • Biến tăng, giảm

Lệnh (statements)

Mỗi chương trình là một tập chỉ dẫn cho máy tính thực hiện một hay nhiều nhiệm vụ nào đó. Các chỉ dẫn của chương trình còn được gọi là các lệnh (statement). Mỗi lệnh trong C# phải kết thúc bằng dấu chấm phẩy và tuân theo cú pháp (syntax – tập các luật tạo nên hình thức, cấu trúc các lệnh) và ngữ nghĩa (semantic –  ý nghĩa của lệnh) của ngôn ngữ C#. Ví dụ lệnh:


System.Console.WriteLine("Hello World !");

Lệnh trên có ý nghĩa hay ngữ nghĩa là dùng để xuất dòng chữ Hello World ! trên màn hình đồng thời phải tuân theo cú pháp trong C# như thứ tự tên namespace, tên lớp, tên phương thức, viết đúng các từ khoá như System, Console, viết đúng cú pháp phương thức WriteLine,v.v.

Chú thích (comments)

Chú thích là nội dung không được thực thi nhằm giải thích các đoạn mã giúp người khác có thể đọc code dễ dàng hơn hoặc có thể giúp ích trong quá trình sửa lỗi chương trình.

Chú thích trong C# dùng dấu // để chú thích một dòng và dùng /*…*/ để chú thích nhiều dòng . Ví dụ chú thích


// khai bao bien kieu int

// và gan gia tri là 5

int x = 5;

hay


/* khai bao bien kieu Integer

và gan gia tri là 5 */

int x = 5;

Chú thích XML có thể được thực hiện bằng cách thêm các phần tử XML. Chú thích XML bắt đầu bằng ba dấu ///.

Ví dụ phương thức Add có thể chú thích XML như sau: đặt con trỏ chuột phía trên phương thức Add và gõ ba dấu / liên tiếp sẽ xuất hiện các thẻ XML như <summary> hay <param>. Các thẻ XML cũng như các thẻ HTML có thẻ bắt đầu, như <summary>, và thẻ kết thúc, như </summary>:

Thêm một vài chú thích

Khi sử dụng phương thức Add, giả sử trong phương thức Main, các chú thích sẽ hiển thị như sau:

Định danh (identifiers)

Định danh (identifier) là tên dùng để xác định các thành phần trong chương trình như namspace, lớp, phương thức, v.v. Đặt tên cho các định danh phải tuân theo các luật sau:

  • C# là ngôn ngữ case – sensitive tức là Main khác main.
  • Định danh được tạo từ các kí tự thường hay hoa (letters), kí số (digits), và dấu _ (underscore).
  • Định danh bắt đầu bằng kí tự hay dấu _.

Các định danh hợp lệ result, _score, plan9; các định danh không hợp lệ result%, 3plan, money$.

Từ khoá (keyworks)

Mỗi ngôn ngữ tự nhiên (Việt, Anh, Pháp, v.v.) sẽ cung cấp một tập các từ vựng cho người sử dụng; tương tự mỗi ngôn ngữ lập trình cung cấp một tập các từ vựng hay từ khoá (keywords) cho người lập trình và mỗi từ khoá có một ý nghĩa riêng biệt. Chúng ta không thể sử dụng các từ khoá cho mục đích của riêng mình. C# cung cấp 77 từ khoá bao gồm:

abstract do in protected true as double int public try base else interface readonly typeof bool enum internal ref uint break event is return ulong byte explicit lock sbyte unchecked case extern long sealed unsafe catch false namespace short ushort char finally new sizeof using checked fixed null stack alloc virtual class float object static void const for operator string volatile continue foreach out struct while decimal goto override switch default if params this delegate implicit private throw

Các định danh sau không phải là từ khoá nhưng chúng ta vẫn nên tránh dùng cho mục đích riêng như đặt tên biến, lớp, phương thức, v.v.

dynamic join set from let value get orderby var group partial where into select yield

Kiểu dữ liệu sơ cấp (primitive data types)

Các ngôn ngữ lập trình thường cung cấp một danh sách các kiểu dữ liệu sơ cấp (data type) khác nhau dùng để biểu diễn các kiểu thông tin khác nhau như số (numbers), thời gian (date, time), văn bản (text), v.v.

Microsoft .NET hỗ trợ rất nhiều ngôn ngữ lập trình như C#, VB, v.v. và các ngôn ngữ này có thể giao tiếp được với nhau. Ví dụ khi biên dịch file C# thành các file DLL thì các file  DLL này có thể được dùng trong ứng dụng VB. Vì các ngôn ngữ lập trình có thể giao tiếp qua lại với nhau nên cần có một hệ thống các kiểu chung để các ngôn ngữ có thể hiểu được nhau, hệ thống này được gọi là CTS (Common Type System). Mỗi ngôn ngữ lập trình sẽ định nghĩa cho mình các kiểu dữ liệu và chúng tham chiếu đến kiểu dữ liệu chung trong CTS. Ví dụ, trong VB có kiểu integer, C# có kiểu int, và cả hai kiểu này cùng tham chiếu đến kiểu System.Int32 trong CTS.

Bảng dưới đây là danh sách các kiểu trong CTS và tương ứng với chúng trong C# hay VB:

CTS C# VB Mô tả
System.Byte byte Byte Lưu trữ các số nguyên dương từ 0 -255. Mặc định là 0.
System.Int16 short Short Lưu trữ các số nguyên có dấu từ -32,768 đến +32,767. Mặc định là 0.
System.Int32 int Integer Lưu trữ các số nguyên có dấu từ –2,147,483,648 đến +2,147,483,647. Mặc định là 0.
System.Int64 long Long Lưu trữ các số nguyên có dấu từ

–9,223,372,036,854,775,808 đến +9,223,372,036,854,775,807. Mặc định là 0.

System.Single float Single Lưu trữ các số thực có dấu từ

–3.4028235E+38 đến

+ 3.4028235E+38. Mặc định là 0.0.

System.Double double Double Lưu trữ các số thực rất lớn. Mặc định là 0.0.
System.Decimal decimal Decimal Lưu trữ các số thực rất lớn. Mặc định là 0. Thường dùng trong biểu diễn tiền tệ.
System.Boolean bool Boolean Lưu trữ hai giá trị là True hay False (VB)(true, false trong C#). Mặc định là False (hay false).
System.DateTime n/a Date VB hỗ trợ để lưu trữ date và time. C# không hỗ trợ. Mặc định là 1/1/0001: 12:00 am.
System.Char char Char Lưu trữ một kí tự. Mặc định là Nothing (VB) hay null (C#).
System.String string String Lưu trữ chuỗi có thể lên đến 2 tỉ kí tự. Mặc định là Nothing (VB) hay null (C#).
System.SByte sbyte SByte Lưu trữ các số nguyên có dấu từ -128 đến +127. Mặc định là 0.
System.UInt16 ushort UShort Lưu trữ các số nguyên không dấu từ 0 đến 65,535. Mặc định là 0.
System.UInt32 uint UInteger Lưu trữ các số nguyên không dấu từ 0 đến 4,294,967,295. Mặc định là 0.
System.UInt64 ulong ULong Lưu trữ các số nguyên không dấu từ 0 đến 18,446,744,073,709,551,615. Mặc định là 0.
System.Object object Object Là cha của tất cả các kiểu dữ liệu. Mỗi kiểu dữ liệu là một object. Mặc định là Nothing (VB) hay null (C#).

Thực hành tạo ứng dụng với primitive data types

Tạo ứng dụng WPF với Form chính như sau:

Thông tin các điều khiển như sau:

Điều khiển (controls) Giá trị thuộc tính Name
ListBox type
TextBox value
Button quit

Thêm các giá trị vào ListBox bằng cách chọn ListBox > chọn VIEW > chọn Properties Window > Chọn Common > Tại Items chọn nút (…):

Xuất hiện cửa sổ Collection Editor: Items. Tại ComboBox bên dưới chọn ListBoxItem và nhấn nút Add:

Trong khung Items chọn [0] ListBoxItem, bên khung Properties > chọn Common và gõ int vào Content:

Nhấn OK.

Tương tự thêm long, float, double, v.v.

Tại Form chọn ListBox > chọn VIEW > chọn Properties Window > chọn sự kiện (biểu tượng hình tia chớp) và tại sự kiện SelectionChanged gõ nội dung typeSelectionChanged:

Nhấp đôi chuột vào nội dung typeSelectionChanged sẽ đến thủ tục xử lý sự kiện SelectionChanged của ListBox:


private void typeSelectionChanged(object sender, SelectionChangedEventArgs e)

{

}

Gõ đoạn mã sau vào thủ tục typeSelectionChanged:


ListBoxItem selectedType = (type.SelectedItem as ListBoxItem);

switch (selectedType.Content.ToString())

{

case "int":

showIntValue();

break;

...

}

Dưới phương thức typeSelectionChanged thêm phương thức showIntValue:


private void showIntValue()

{

int intVar;

intVar = 42;

value.Text = intVar.ToString();

}

Chọn sự kiện Click cho nút Quit và viết đoạn mã sau cho phương thức xử lý sự kiện Click (quitClick):


private void quitClick(object sender, RoutedEventArgs e)

{

this.Close();

}

Thực thi chương trình. Tại Form chính, chọn int trong ListBox thì TextBox sẽ xuất hiện như sau:

Nhấn nút Quit thoát Form.

Thêm đoạn mã sau vào phương thức typeSelectionChanged:


case "int":

showIntValue();

break;

case "long":

showLongValue();

break;

Thêm phương thức showLongValue:


private void showLongValue()

{

long longVar;

longVar = 42L;

value.Text = longVar.ToString();

}

Lưu ý rằng, giá trị của biến longVar là 42L (có thêm chữ cái L) để phân biệt với các kiểu số nguyên khác như byte, short, int.

Thêm đoạn mã và phương thức sau cho các mục float, double, decimal, string, char, bool:


case "int":

showIntValue();

break;

case "long":

showLongValue();

break;

case "float":

showFloatValue();

break;

case "double":

showDoubleValue();

break;

case "decimal":

showDecimalValue();

break;

case "string":

showStringValue();

break;

case "char":

showCharValue();

break;

case "bool":

showBoolValue();

break;

Các phương thức:


private void showFloatValue()

{

float floatVar;

floatVar = 0.42F; // thêm F sau 42 để phân biệt với kiểu double

value.Text = floatVar.ToString();

}

private void showDoubleValue()

{

double doubleVar;

doubleVar = 0.42;

value.Text = doubleVar.ToString();

}

private void showDecimalValue()

{

decimal decimalVar;

decimalVar = 0.42M; // thêm M sau 42 để phân biệt với kiểu

// double, float

value.Text = decimalVar.ToString();

}

private void showStringValue()

{

string stringVar;

stringVar = "forty two";

value.Text = stringVar; // không cần dùng ToString

}

private void showCharValue()

{

char charVar;

charVar = 'x';

value.Text = charVar.ToString();

}

private void showBoolValue()

{

bool boolVar;

boolVar = false;

value.Text = boolVar.ToString();

}

private void quitClick(object sender, RoutedEventArgs e)

{

this.Close();

}

Biến

Để làm việc với các dữ liệu, chúng ta cần lưu trữ nó trong một biến. Cú pháp khai báo một biến là:

Kiểu_Dữ_Liệu tên_biến;

tên_biến là tên của biến cần khai báo gồm các kí tự, số, dấu _, và không được bắt đầu bằng số. Kiểu_Dữ_Liệu là một trong các kiểu dữ liệu ở bảng trên hay kiểu do người dùng định nghĩa.

Ví dụ khai báo một biến kiểu int, tên biến là  x và một biến kiểu string, tên biến là s như sau:


int x;

string s;

Sau khi khai báo biến, chúng ta có thể gán giá trị cho chúng, ví dụ với hai biến trên và để ý đối với biến s kiểu string thì giá trị của nó  là một chuỗi kí tự được đặt trong cặp dấu “:


int x;

x = 5;

string s;

s = "Hello ";

Chúng ta cũng có thể kết hợp khai báo và gán giá trị cho biến như ví dụ:


int x = 5;

string s = "Hello ";

Một số chú ý khi đặt tên biến:

  • Không bắt đầu bằng số
  • Không trùng với các từ khoá (keywords), là các từ vựng có sẵn trong ngôn ngữ.
  • Đặt theo mục đích, ví dụ firstName, age.
  • Tuân theo chuẩn camel case, tức là nếu tên biến gồm nhiều từ như firstName (gồm firstName) thì từ đầu tiên viết thường tất cả các kí tự, các từ kế tiếp sẽ viết hoa kí tự đầu tiên, như firstName.

Toán tử (operator)

Toán tử là các thao tác để kết hợp các giá trị tạo ra một giá trị mới. Các giá trị được gọi là các toán hạng (operands). Ví dụ 2 + 3 = 5 thì 2, 3 được gọi là các toán hạng, + là toán tử (số học), và 5 là kết quả.

Toán tử trong C# gồm các loại sau:

Toán tử gán (assigment operator)

Dùng để gán một giá trị đến một biến. Giá trị này có thể là hằng (như 6 hay “hello”), giá trị của biến khác, kết quả của một biểu thức hay hàm.

Kí hiệu: =

Ví dụ: gán giá trị 6 cho biến x


int x = 6;

Toán tử số học (arithmetic operator)

Cho phép thực hiện các thao tác tính toán giữa các giá trị số. Gồm:

Toán tử số học Chức năng
+ Cộng hai giá trị
Trừ hai giá trị
* Nhân hai giá trị
/ Chia hai giá trị
% Lấy dư từ phép chia

* Chú ý: trong C# nếu chúng ta chia hai số nguyên, ví dụ lấy 7 chia 3, thì kết quả sẽ là một số nguyên, ví dụ 7 chia 3 là 3. Điều này chúng ta cần chú ý vì sẽ không cho kết quả như mong đợi. C# cũng không hỗ trợ toán tử tính luỹ thừa mà sẽ dùng phương thức Pow của lớp Math thay thế.

Độ ưu tiên của các toán tử trong biểu thức theo thứ tự giảm dần từ trên xuống như sau:

Độ ưu tiên
*, /, %
+, –

C# cho phép kết hợp toán tử số học và toán tử gán. Xem bảng dưới đây:

Toán tử Ví dụ Ý nghĩa
+= x += 3 x = x + 3
-= x -= 3 x = x – 3
*= x *= 3 x = x * 3
/= x /= 3 x = x / 3
%= x %= 3 Lấy dư từ phép chia x cho 3

 Toán tử so sánh (comparison operator)

Cho phép so sánh hai giá trị, thường dùng trong các biểu thức điều kiện. Kết quả trả về là true hay false. Một số toán tử so sánh phổ biến:

Toán tử so sánh Chức năng
== Kiểm tra hai giá trị có bằng nhau không
!= Kiểm tra hai giá trị khác nhau
< Kiểm tra giá trị đầu có bé hơn giá trị sau không
> Kiểm tra giá trị đầu có lớn hơn giá trị sau không
<= Kiểm tra giá trị đầu có bé hơn hoặc bằng giá trị sau không
>= Kiểm tra giá trị đầu có lớn hơn hoặc bằng giá trị sau không
is Trong Visual Basic: so sánh hai object với nhau; trong C#: kiểm tra một biến có phải là một kiểu dữ liệu nào đó.

Toán tử cộng chuỗi (concatention operator)

Để kết hợp hai chuỗi (kiểu string) trong C# dùng +. Có thể kết hợp với toán tử gán là += Ví dụ: khai báo các biến sau:


string firstString = "Hello";

string secondString = "World";

string result;

Kết hợp hai chuỗi trong biến firstString và secondString và lưu kết quả trong biến result có thể viết như sau:


result = firstString + secondString;

hoặc


result = firstString;

result = result + secondString;

hoặc


result = firstString;

result += secondString;

Do toán tử + được dùng cho kết hợp hai chuỗi đồng thời cũng là một toán tử số học nên cần thận trọng khi dùng toán tử này khi có liên quan đến chuỗi, ví dụ:


Console.WriteLine ("4" + "3"); // kết quả là "43" thay vì 7

Trong C# hỗ trợ phương thức Parse dùng để chuyển một chuỗi số thành số. Ví dụ chuyển “4” thành số nguyên ta dùng Int32.Parse, chuyển thành số kiểu double dùng Double.Parse.

Toán tử luận lý (logical operator)

Trả về giá trị true hay false từ việc kết hợp nhiều biểu thức. Một số toán tử

Toán tử luận lý Chức năng
& Trả về True nếu tất cả các biểu thức đều trả về True
| Trả về True nếu ít nhất một biểu thức trả về True
! Trả về True nếu biểu thức là False và ngược lại
&& Tương tự & nhưng sẽ không kiểm tra các biểu thức còn lại nếu biểu thức đầu tiên quyết định kết quả trả về.
|| Tương tự | nhưng sẽ không kiểm tra các biểu thức còn lại nếu biểu thức đầu tiên quyết định kết quả trả về.

Ví dụ:


int num1 = 3;

int num2 = 7;

num1 == 3 & num2 == 7   // true

num1 == 2 & num2 == 7  // false

num1 == 3 | num2 == 11  // true

!(num1 == 5)  // true

num1 == 2 && num2 == 7 //trả về false vì num1 khác 2 và không

//cần kiểm tra biểu thức num2 = 7

Biểu thức (expressions)

Biểu thức là một kết hợp giữa các toán hạng và các toán tử và có thể cho ra một kết quả nào đó. Biểu thức có thể đơn giản chỉ là một toán hạng nhưng cũng có thể rất phức tạp.

Ví dụ các biểu thức:

  • Biểu thức đơn giản có thể chỉ là một số 3
  • Biểu thức gồm toán hạng và toán tử: 3 + 2
  • Biểu thức phức tạp hơn: ((2 + 3)*5)/3

Trong quá trình tính toán một biểu thức cần chú ý:

  • Các toán tử có độ ưu tiên cao hơn sẽ được thực hiện trước
  • Biểu thức trong dấu ngoặc đơn thực hiện trước
  • Nếu trong một biểu thức xuất hiện các toán tử có cùng độ ưu tiên thì thực hiện tính toán từ trái sang phải

Ví dụ: (2 – 3 + 7) / 3 * 2 = 4

  • Toán tử gán thực hiện kết hợp từ phải sang trái. Ví dụ:

x = y = z = 1; // 1 được gán cho biến z, biến y, và biến x

Tăng, giảm biến

Nếu muốn tăng giá trị biến count lên 1, chúng ta có thể dùng toán tử +:


count = count + 1;

Chúng ta cũng có thể dùng toán tử một ngôi (unary) (tức là toán tử chỉ có một toán hạng) ++ như sau:


count ++;

Tương tự, nếu muốn giảm 1 cho biến count, chúng ta có thể viết:


count = count -1;

hay


count --;

Toán tử một ngôi ++ hay – – tuỳ theo vị trí đặt trước (prefix) hay sau (postfix) sẽ cho ra những kết quả khác nhau, ví dụ:


int x;

x = 4;

Cosole.WriteLine (x++);// kết quả hiển thị là 4 vì x được hiển thị

// trước khi tăng 1

x = 4;

Console.WriteLine (++x); // kết quả hiển thị là 5 vì x hiển thị sau

// khi tăng 1

Khai báo biến cục bộ kiểu ngầm định (Implicitly Typed Local Variables)

Khi khai báo biến chúng ta thường khai báo kiểu dữ liệu kèm theo , ví dụ:


int count;

hay chúng ta cũng có thể khai báo và khởi tạo giá trị:


int count = 3;

Trong C# chúng ta cũng có thể khai báo biến kiểu ngầm định bằng từ khoá var và biến sẽ được gán đến kiểu dữ liệu của giá trị (hay biểu thức) khởi tạo kèm theo, ví dụ:


var count = 3; // biến count sẽ có kiểu dữ liệu của 3

count = “Hello”; // lỗi vì count kiểu số

Lưu ý khi khai báo kiểu ngầm định phải luôn đi kèm với giá trị (hay biểu thức) khởi tạo, ví dụ:


var count; // lỗi

Thực hành với các toán tử

Tạo ứng dụng WPF với Form chính sau:

Nhập các toán hạng, chọn toán tử +, nhấn nút Calculate:

Một số điều khiển trên Form:

Điều khiển (controls) Giá trị thuộc tính Name
TextBox lhsOperand
TextBox rhsOperand
TextBlock expression
TextBlock result
RadioButton addition
RadioButton subtraction
RadioButton multiplication
RadioButton division
RadioButton remainder
Button calculate
Button quit

Đoạn mã toán tử + cho phương thức xử lý sự kiện Click của Button Calculate:


private void calculateClick(object sender, RoutedEventArgs e)

{

try

{

if ((bool)addition.IsChecked)

{

addValues();

}

}

catch (Exception caught)

{

expression.Text = "";

result.Text = caught.Message;

}

}

Phương thức addValues:


private void addValues()

{

int lhs = int.Parse(lhsOperand.Text);

int rhs = int.Parse(rhsOperand.Text);

int outcome = 0;

// TODO: cộng lhs và rhs, lưu trong outcome

outcome = lhs + rhs;

expression.Text = lhsOperand.Text + " + " + rhsOperand.Text;

result.Text = outcome.ToString();

}

Tương tự thêm đoạn mã cho các toán tử -, *, /, % và các phương thức subtractValues, multiplyValues, divideValues, remainderValues.

Học C# và WPF >