Chương 3 trình bày những kiến thức cơ bản về ngôn ngữ lập trình C#. Nội dung cụ thể gồm: Lập trình hướng đối tượng, cách tạo ra một chương trình C#, Các thành phần của một chương trình C#, biến - kiểu dữ liệu - hằng, toán tử, xuất dữ liệu, lập trình chương trình đơn giản với C#. Mời các bạn cùng tham khảo.
Trang 1v 1.1 - 09/2013
Cơ bản ngôn ngữ lập trình C#
Trang 3Giải bài toán trên máy tính
1 Xác định bài toán
2 Thiết kế thuật toán
3 Phân tích thuật toán
4 Cài đặt thuật toán
5 Kiểm tra / Bắt lỗi
6 [ Sửa lỗi ]
Trang 5Lập trình hướng đối tượng
Trang 6.NET và hướng đối tượng
• Nền tảng NET hỗ trợ hướng đối tượng từ dưới lên trên
• Trình biên dịch hỗ trợ hướng đối tượng
• Intermediate Language là hướng đối tượng
• Base Class Library hoàn toàn là hướng đối tượng
• Các ngôn ngữ lập trình chấp nhận NET (.NET-aware languages) cũng là
hướng đối tượng
• Ngôn ngữ lập trình C# là ngôn ngữ lập trình hướng đối tượng
• Cần hiểu hai khái niệm :
• Đối tượng
Trang 7Lớp & đối tượng
• Lớp giống như một cái khuôn bánh
• Nó định nghĩa khuôn dạng của các đối tượng
• Các đối tượng như các cái bánh
• Chúng là các instances (thực thể/thể hiện) của lớp
Trang 8• Một đối tượng là một thực thể trong miền
xác định có một định danh riêng (tên)
• Một tập những đặc tính (attribute) mô tả
tình trạng của đối tượng
type state nameBorrower dateBorrow dateReminder calculDateReminder
• Một tập các thao tác (phương thức / hàm - methods) định nghĩa
các hành vi của đối tượng
• Một đối tượng là một thể hiện (instance) của một lớp
• Lớp là kiểu dữ liệu trừu tượng, được mô tả bởi những thuộc tính
(đặc tính và phương thức) chung của các đối tượng và cho phép
tạo ra các đối tượng có những thuộc tính đó
Đặc tả UML của một lớp
Trang 9Ví dụ
Car
mark color registering
start driver stop
twingo : Car
mark = Renault color = gray registering = 995 LKZ 75
Nhóm các dữ liệu và xử lý liên quan trong một lớp
Object : một thể hiện của lớp
Trang 10Lớp & đối tượng trong C#
Định nghĩa lớp Sử dụng từ khoá class
Định nghĩa một kiểu dữ liệu mới Tạo một đối tượng
Có hai loại hàm với hai cách triệu gọi khác nhau :
• Hàm không tĩnh - Gọi từ đối tượng
• Hàm tĩnh (từ khoá static) - Gọi từ lớp
Bitmap bm = new Bitmap(20, 20);
Bitmap bm = new Bitmap(20, 20);
bm.Save( "bitmap.png" );
Console.Write( "Please enter a number :" );
Trang 11.NET Base Class Library
• Một tập hợp khổng lồ các lớp được cung cấp cho người lập
trình, cho phép bạn làm bất cứ việc gì với máy tính mà hệ điều hành có hỗ trợ
• Bạn có thể sử dụng các lớp cơ bản NET này để
• Tạo các thể hiện (object)
• Truy xuất các phương thức / hàm thành phần các lớp cung cấp
• Cung cấp, truy xuất các dữ liệu trong các thể hiện của lớp
• Để nghiên cứu về các lớp cung cấp cái gì, nằm ở assembly
(tập tin dll) nào, cách sử dụng
• Sử dụng Object Browser
• MSDN - http://msdn.microsoft.com/en-us/library/gg145045%28v=vs.100%29.aspx
Trang 12Namespace (1/5)
• Là cách mà NET tránh né việc các định danh (tên lớp, tên
biến, tên hàm, ) choảng nhau vì trùng tên
• Là việc gộp lại những kiểu dữ liệu có liên hệ với nhau về mặt
ngữ nghĩa
• System.IO gộp các kiểu dữ liệu liên quan đến xuất nhập dữ liệu trên tập tin
• System.Data gộp các kiểu dữ liệu cơ bản về cơ sở dữ liệu
• Tên tất cả các kiểu dữ liệu trong phạm vi namespace sẽ tự động
được gán một tiền tố mang tên namespace
• Lớp Array nằm trong System, nên tên trọn vẹn của nó là System Array
• NET đòi hỏi các kiểu dữ liệu phải được định nghĩa trong một
namespace nào đó
System Console
System Array
Trang 13Namespace (2/5)
• [Lời khuyên của Microsoft] Nên cung cấp ít nhất hai namespace
lồng nhau :
• namespace đầu : tên công ty
• namespace thứ hai : tên công nghệ, tên gói phần mềm, tên phần mềm hoặc
tên project
• Trong NET, hầu hết những namespace quan trọng đều xoay
quanh namespace System
• Namespace này cung cấp phần cốt lõi các kiểu dữ liệu
• Một chương trình C# ít nhất phải khai báo sử dụng namespace này
• Việc tìm hiểu từng kiểu dữ liệu được chứa đựng trong mỗi
namespace đòi hỏi thời gian
YourCompanyName.ProjectName ClassName
Trang 14Namespace (3/5)
System Chứa các lớp cốt lõi liên quan đến các kiểu dữ liệu bẩm sinh,
tính toán số học
System.Collections Định nghĩa một số đối tượng như ArrayList , Queue , SortedList
System.Data System.Data.Common System.Data.SqlClient
Những namespace dùng trong việc thao tác với các cơ sở dữ liệu
System.Drawing System.Drawing.Drawing2D System.Drawing.Printing Chứa các kiểu dữ liệu về vẽ đồ hoạ, in ấn
System.IO Chứa các kiểu dữ liệu lo việc xuất nhập dữ liệu
System.Net Các kiểu dữ liệu liên quan đến lập trình mạng
System.Web Các kiểu dữ liệu cho việc triển khai những ứng dụng Web, kể
cả ASP.NET
System.Windows.Form Các kiểu dữ liệu cho phép xây dựng giao diện đồ hoạ
System.XML Các kiểu dữ liệu cho phép tương tác với dữ liệu XML
Trang 15Namespace (4/5)
• Sử dụng từ khoá using để qui chiếu đến các namespace trong
chương trình
• Một khi đã qui chiếu các namespace , bạn tự do tạo ra những thể
hiện của những kiểu dữ liệu mà namespace đó chứa đựng
• Nên dùng cách 1, chỉ dùng cách 2 khi muốn tránh sự nhập nhằng về tên
• Có thể dùng các alias cho các tên namespace dài
Trang 16Namespace (5/5)
• Một tập tin assembly (vd : mscorlib.dll ) có thể chứa một
lượng bất kỳ các namespace
• Cần phải báo cho trình biên dịch về tên của assembly chứa các
namespace có các kiểu được tham chiếu (được sử dụng)
• Tất cả các assembly được lưu trong GAC (Global Assembly Cache) -
C:\Windows\Assembly
• Trong Visual Studio, trên ngăn Solution Explorer, nháy phải chuột
lên thư mục References, nháy mục Add References
• Làm việc này rồi thì mới using được
Trang 17Cách tạo ra một chương trình C#
Trang 18Chương trình C#
• Mỗi Project được đặt trong một Solution
• Mỗi Solution có thể chứa nhiều Project
• Một Project bao gồm một hoặc nhiều đơn vị biên dịch
(compilation units)
• Mỗi đơn vị là một file mã nguồn riêng biệt (.cs)
• Program.cs là tên mặc định của đơn vị biên dịch đầu tiên của project
• Trong môn học này, chúng ta chủ yếu biên soạn chương trình trong tập tin này
• Mỗi Project được biên dịch thành một tập tin assembly ( exe
hoặc dll )
Trang 19Cấu trúc chương trình C#
Solution
namespace A { } namespace B { } namespace A { }
class X { } class Y { } class Z { }
Trang 20Chương trình đầu tiên
using System;
namespace Square {
class Program
{ static void Main( string [] args) {
double n;
// nhap mot so vao tu ban phim
Console Write( "Please enter a number:" );
n = double Parse( Console ReadLine());
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is {1}" , n, Square(n));
Program.cs
Trang 21• csc.exe cung cấp vài tham số dòng lệnh sau :
• /out : chỉ định tên của Assembly
• /target:exe : (mặc định) Assembly kiểu .exe
• /target:library : Assembly kiểu .dll
• /target:module : Assembly kiểu .netmodule, dùng cho biên dịch Assembly
nhiều tập tin
• /reference : tham chiếu các Assembly dll mà Assembly biên dịch cần sử dụng
• Nên sử dụng Visual Studio 2010 Command Prompt để biên dịch
Biên dịch chương trình
csc /out:Square.exe Program.cscsc /out:Square.exe *.cs
cmd.exe /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat""
Trang 22Các thành phần của một chương trình C#
Trang 23Chương trình đầu tiên
using System;
namespace Square {
class Program
{ static void Main( string [] args) {
double n;
// nhap mot so vao tu ban phim
Console Write( "Please enter a number:" );
n = double Parse( Console ReadLine());
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is {1}" , n, Square(n));
Program.cs
Trang 24Chương trình đầu tiên
using System;
namespace Square {
class Program
{ static void Main( string [] args) {
double n;
// nhap mot so vao tu ban phim
Console Write( "Please enter a number:" );
n = double Parse( Console ReadLine());
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is {1}" , n, square(n));
Program.cs
• Các tập tin cs là các tập tin mã nguồn C#
• Mỗi tập tin nên chứa cài đặt cho một và chỉ một lớp
• Program.cs là tập tin mặc định đầu tiên được tạo ra
trong Project để chứa đoạn chương trình, là điểm bắt đầu của chương trình
Trang 25Chương trình đầu tiên
using System;
namespace Square {
class Program
{ static void Main( string [] args) {
double n;
// nhap mot so vao tu ban phim
Console Write( "Please enter a number:" );
n = double Parse( Console ReadLine());
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is {1}" , n, Square(n));
được kết thúc bằng dấu chấm phẩy ( ; )
• Nhiều câu lệnh có thể
được gộp lại thành khối
và đặt trong cặp dấu ngoặc nhọn { }
Trang 26Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console Write( "Please enter a number:" );
n = double.Parse( Console ReadLine() );
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is {1}" , n, square(n));
• báo cho trình biên dịch biết bạn sẽ sử
dụng những kiểu dữ liệu trong namespace
nào
• đây cũng là cách để bạn giảm thiểu việc
gõ tên namespace trước tên lớp, tên hàm
• để báo cho trình biên dịch biết, mã nguồn
của bạn cần dùng assembly nào thì trong
Visual Studio, trên ngăn Solution Explorer, nháy phải chuột lên mục
References, nháy mục Add References
Trang 27Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console.Write("Please enter a number:");
n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do
Console.WriteLine("The square of {0} is {1}", n, square(n));
• Namespace có thể có hoặc không
Những kiểu dữ liệu thuộc namespace nào thì đặt trong cặp dấu ngoặc nhọn của
namespace đó
Có thể khai báo các namespace lồng nhau
Trang 28Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console.Write("Please enter a number:");
n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do
Console.WriteLine("The square of {0} is {1}", n, square(n));
• Tên lớp bắt đầu bằng kí tự viết hoa
Thân lớp được đặt trong cặp dấu ngoặc nhọn {}
Đối với C#, mọi biến và hàm đều phải được đặt trong một định nghĩa kiểu nào đó
Trong môn này, mã nguồn của chúng ta chỉ nằm trong lớp Program
Trang 29Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console.Write("Please enter a number:");
n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do
Console.WriteLine("The square of {0} is {1}", n, square(n));
• đây là điểm đầu vào của một chương trình
• có thể có nhiều hàm Main để xử lý cho nhiều
trường hợp khởi động chương trình khác nhau
• không thuộc về một lớp nào, global function
• là một hàm tĩnh (từ khoá static)
• người ta có thể truyền tham số cho nó
• có nhiều dạng giá trị trả về của hàm này
• ở đây là void , tức là không cần giá trị trả về
Trang 30Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console.Write("Please enter a number:");
n = double Parse( Console ReadLine());
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is {1}" , n, Square(n));
Khai báo biến :
• có thể khai báo bất cứ đâu trong chương
trình
• biến sẽ có kiểu dữ liệu và tên
Một biến sau khi đã khai báo thì có thể gán giá trị và sử dụng biến đó để tính toán
Trang 31Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console Write( "Please enter a number:" );
n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is {1}" , n, Square(n));
• Write - in chuỗi văn bản chỉ định ra màn hình
• WriteLine - in chuỗi văn bản chỉ định ra màn
hình rồi xuống dòng
• Thông số đầu tiên đại diện cho chuỗi ký tự in ra
màn hình
• Các token giữ chỗ {0}, {1} là vị trí các giá trị
của các thông số tiếp theo sẽ được chèn vào
Trang 32Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console.Write("Please enter a number:");
n = double Parse( Console ReadLine());
// in ra binh phuong cua so do
Console.WriteLine("The square of {0} is {1}", n, squ are(n));
• ReadLine - đọc vào một dòng
• Kết quả đọc vào là một chuỗi ký tự Do đó, ta
phải dùng hàm Parse của kiểu double để chuyển từ chuỗi thành số
• ReadKey - đọc vào một ký tự
• Ở đây, chức năng của hàm này là dừng màn
hình để cho người sử dụng đọc các kết quả xuất ra màn hình
Trang 33Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console Write( "Please enter a number:" );
n = double Parse( Console ReadLine());
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is {1}" , n, Square(n));
• Lời gọi hàm phải tuân theo qui định
của lời gọi hàm (Xem slide 10)
• Trong lời gọi hàm, cung cấp đầy đủ
giá trị cho các tham số theo định nghĩa hàm
Trang 34Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console.Write("Please enter a number:");
n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do
Console.WriteLine("The square of {0} is {1}", n, square(n));
Trang 35Biến, kiểu dữ liệu, Hằng
Trang 36Bộ nhớ của con người
1 Đầu tiên, yêu cầu bạn nhớ con số 5
2 Sau đó, yêu cầu bạn nhớ đồng thời
con số 2
3 Yêu cầu bạn cộng 1 vào con số đầu
tiên
4 Trừ hai số đó
Trang 37• Máy tính có thể chứa hàng triệu số cùng lúc và thực hiện tính
Trang 38Định danh
• Các tên biến, tên hàm, tên lớp gọi chung là các định danh và
phải tuân sau quy tắc đặt tên
• Định danh là chuỗi các ký tự, số và dấu gạch chân và luôn bắt
đầu bằng ký tự, dấu gạch chân hoặc ký tự @
• Trong C#, định danh :
• Hỗ trợ ký tự Unicode
• Phân biệt chữ hoa và chữ thường
• Ký hiệu @ được sử dụng để chỉ một từ khoá là định danh
• if - từ khoá
• @if - định danh if
• Có thể chứa các chuỗi mã Unicode (vd : \u03c0 tương đương 𝛑)
someNamesum_of3_10percent
@while𝛑
\u03c0b\u0061ck
Trang 39Từ khoá
Có tất cả 77 từ khoá
Trang 40Quy tắc đặt tên
• Các từ được viết hoa chữ cái đầu tiên (vd : ShowDialog)
• Ký tự đầu tiên được viết hoa, ngoại trừ tên biến
Trang 41Hệ thống kiểu dữ liệu
• Tất cả các kiểu dữ liệu đều thừa kế từ System Object
• có thể được gán cho các biến kiểu Object
• có thể sử dụng tất cả các hàm của kiểu Object
Types
Primitive Types Enums Structs Classes Interfaces Arrays Delegates
bool
char
sbyte short int long
byte ushort uint ulong
float double
Trang 42Kiểu trị & kiểu tham chiếu
Ví dụ intint i = 17; j = i; stringstring s = s1 = s;“Hello”;
i 17
j 17
ss1 0x0a10
0x0a10
Hello
stack
Trang 43Stack vs Heap
• stack được đặt trong bộ nhớ máy tính
chứa tất cả các biến được khai báo và khởi tạo trước thời gian chạy (runtime)
• được quản lý theo lời gọi hàm
• heap là một phần của bộ nhớ máy tính
chứa tất cả các biến được tạo ra và khởi tạo trong thời gian chạy (các biến động - dynamic memory)
heap
main()int ymyobj = new Object()
Trang 44Kiểu dữ liệu cơ bản
sbyte byte System.System.SByteByte số nguyên có dấu 8 bit
short ushort System.System.UInt16Int16 số nguyên có dấu 16 bit
int uint System.System.UInt32Int32 số nguyên có dấu 32 bit
long ulong System.System.UInt64Int64 số nguyên có dấu 64 bit
float double decimal
Các kiểu dữ liệu này đều có các hàm thành phần rất hữu ích Vd : int MaxValue