• 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 date
Trang 1v 1.0 - 10/2012
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
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 :
• Lớp
• Đối tượng
Trang 7Lớp & đối tượng
• Lớp giống như một cái khuôn bánh
• 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 đoạn mã lớp được giám quản
( managed code ) mà Microsoft đã viết ra, cho phép bạn làm bất
cứ việc gì với máy tính mà Windows API hỗ trợ
• Bạn có thể sử dụng các lớp cơ bản NET này để
• Cung cấp, truy xuất các dữ liệu của các thể hiện của lớp
• Để nghiên cứu về các lớp cung cấp cái gì
• MSDN - http://msdn.microsoft.com/en-us/library/gg145045%28v=vs.100%29.aspx
• Bên cạnh các giải thích còn có các ví dụ hướng dẫn sử dụng
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
• Có thể dùng các alias cho các tên namespace dài
Bitmap bm = new Bitmap (20, 20); // Không cần viết tên lớp bao gồm cả namespace
System.Drawing Bitmap bm = new System.Drawing Bitmap (20, 20);
Cách 1 :
Cách 2 :
using WF = System.Windows.Forms;
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
• 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
• Mỗi Project được biên dịch thành một tập tin assembly ( exe
hoặc dll )
• Hai đơn vị biên dịch khác nhau có thể chứa cùng namespace
• Hai project khác nhau phải chứa hai namespace khác nhau
Trang 19Cấu trúc chương trình C#
Solution
namespace A { } namespace B { } namespace A { }
class X { } class Y { } class Z { }
Trang 20• Namespace là cấu trúc thời gian biên dịch ( compile-time )
• Assembly là cấu trúc thời gian chạy ( run-time )
• Có thể chứa các kiểu dữ liệu từ các namespace khác nhau
Trang 21Assembly được tạo ra ntn ?
• Mỗi biên dịch tạo ra hoặc một assembly hoặc một module
• Các module khác có thể được thêm vào sử dụng trình assembly linker
có manifest
module
.netmodule không có manifest
executable library
Trang 22Chươ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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
Trang 23• 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
• Nên sử dụng Visual Studio 2010 Command Prompt để biên dịch
Trang 24Console WriteLine( "The square of {0} is
{1}" , n, SquareLibrary Square square(n));
public static double square(double n) {
return n * n;
} } }
Square.cs
csc /t:library /out:Square.dll Square.cscsc /r:Square.dll /out:Square.exe Program.cs
Trang 25Các thành phần của một chương trình C#
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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.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 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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
• Mỗi câu lệnh trong C# đượ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 nghéo { }
Trang 29Chương trình đầu tiên
// nhap mot so vao tu ban phim
Console Write( "Please enter a number:" );
n = int Parse( Console ReadLine());
// in ra binh phuong cua so do
Console WriteLine( "The square of {0} is
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua 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 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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
Khai báo một lớp bằng tên lớp theo sau từ
khoá class
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 đó
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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
Trong C#, một chương trình luôn bắt đầu bằng hàm Main() :
• 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 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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
Khai báo biến :
• có thể khai báo bất cứ đâu trong chương trình
Các tên biến, tên hàm, tên lớp gọi chung là các định danh và nên tuân theo qui tắc đặt tên :
C# phân biệt chữ hoa, chữ thường cho các định danh
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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
Xuất dữ liệu ra màn hình sử dụng lớp System.Console :
• Write - in chuỗi văn bản chỉ định ra
Trang 35Chươ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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
Nhậ dữ liệu từ bàn phím sử dụng lớp System.Console :
• 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ố
• Ở đâ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 36Chươ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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Square.cs
Khi gọi một hàm, hàm này phải
thuộc về một lớp nào đó :
• Lời gọi hàm phải tuân theo qui định
của lời gọi hàm (Xem slide 10)
Trang 37Chươ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
class Square
{ public static double square( double n) {
return n * n; // tinh binh phuong cua n
} } }
Trang 38Biến, kiểu dữ liệu, Hằng
Trang 39Bộ 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 40• 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 41Định danh
• Đị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 :
• Ký hiệu @ được sử dụng để chỉ một từ khoá là định danh
• if - từ khoá
• @if - định danh if
•
someNamesum_of3_10percent
@while𝛑
\u03c0b\u0061ck
Trang 42Từ khoá
Có tất cả 77 từ khoá
Trang 43Quy 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 44Hệ thống kiểu
• Tất cả các kiểu dữ liệu đều thừa kế từ System Object
Types
bool
char
sbyte short int long
byte ushort uint ulong
float double
Trang 45Kiể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
Trang 46Stack 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)
• 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 47Kiểu dữ liệu cơ bản
sbyte byte System.SByteSystem.Byte số nguyên có dấu 8 bit
số nguyên ko dấu 8 bit short
ushort System.UInt16System.Int16 số nguyên có dấu 16 bit
số nguyên ko dấu 16 bit int
uint System.UInt32System.Int32 số nguyên có dấu 32 bit
số nguyên ko dấu 32 bit long
ulong System.UInt64System.Int64 số nguyên có dấu 64 bit
số nguyên ko dấu 64 bit float
double decimal
System.Single System.Double System.Decimal
số thực 32 bit
số thực 64 bit
số thực 128 bit
bool char System.BooleanSystem.Char ký tự Unicodetrue, falseCá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