PHẦN I: Giới thiệu VC#• Mở đầu • Biến, toán tử, biểu thức • Viết phương thức và áp dụng phạm vi • Các câu lệnh lựa chọn • Phát biểu lặp • Quản lý lỗi và ngoại lệ... Viết chương trình đầu
Trang 2Tài liệu tham khảo
• Nguyễn Thiên Bằng, Phạm Ngọc
Thạch, Hoàng Đức Hải Từng bước
học lập trình Visual C#.net Nhà xuất
bản lao động xã hội
• Phương Lan, Phạm Hữu Khang Kỹ
thuật lập trình ứng dụng C#.net toàn tập Tập 1,2,3 Nhà xuất bản lao
động xã hội.2002
• E-books
Trang 3Nội dung môn học
Trang 4PHẦN I: Giới thiệu VC#
• Mở đầu
• Biến, toán tử, biểu thức
• Viết phương thức và áp dụng phạm vi
• Các câu lệnh lựa chọn
• Phát biểu lặp
• Quản lý lỗi và ngoại lệ
Trang 5PHẦN II: Ngôn ngữ C#
• Đối tượng và lớp
• Tham chiếu và tham trị
• Các kiểu giá trị với bảng liệt kê vàcấu trúc
Trang 6PHẦN III: Tạo Component
• Truy xuất các thuộc tính
• Bộ chỉ mục
• Ủy nhiệm hàm và sự kiên
• Nạp chồng toán tử
Trang 9Chương 1: Mở đầu
Nguyễn Hồng Phương
Trang 10Nội dung chương 1
• Khởi động Microsoft Visual Studio
Trang 11Khởi động Microsoft Visual Studio NET
• VS.NET là môi trường lập trình cung cấp rất nhiều công cụ cần thiết cho việc xây dựng các dự án lớn và nhỏ
• Cài đặt:
– Cài IIS
– Bộ VS.NET 2003 (3 đĩa CD)1→3→1→2 – Bộ VS.NET 2005 (4 đĩa CD)
– Cài bộ MSDN
Trang 12Khởi động Microsoft Visual Studio NET
Trang 13Khởi động Microsoft Visual Studio NET
Trang 14Viết ứng dụng dòng lệnh với C#
Trang 15Viết ứng dụng dòng lệnh với C#
Trang 16Các tập tin trong khung cửa
• TextHello.sln: tập tin giải pháp cấp trên
cùng Nó gồm 1 hoặc nhiều tập tin dự án.
• TextHello.csproj: tập tin dự án của C# Nó gồm 1 hoặc nhiều tập tin nguồn (viết cùng
1 ngôn ngữ).
• Class1.cs: tập tin nguồn của C#.
• AssemblyInfo.cs:tập tin nguồn khác, dùng thêm một số thuộc tính vào chương trình.
• App.ico: icon xuất hiện trên thanh tác vụ
Trang 17Viết chương trình đầu tiên
• Tập tin Class.cs định nghĩa một lớp
có tên Class1 chứa một phương thức Main
• Chú ý: C# là ngôn ngữ phân biệt
kiểu chữ
• Ta sẽ viết dòng chữ “Hello BK” ra
màn hình Console
Trang 18Viết chương trình đầu tiên
Trang 19Viết chương trình đầu tiên
Trang 20Viết chương trình đầu tiên
Trang 21Sử dụng không gian tên
(Namespace)
• Tranh chấp tên xảy ra khi:
– Chương trình lớn, chứa nhiều mã nguồn
– Sử dụng thư viện do tổ chức khác viết
• Chương trình sẽ rắc rối và khó bảo trì
• Hướng giải quyết ?
– Thêm tiền tố ứng với modul con
– Sử dụng không gian tên
Trang 22Sử dụng không gian tên
(Namespace)
• Ví dụ: Thay vì tạo ra một lớp có tên
TextHelloGreeting , ta tạo lớp Greeting trong
không gian tên TextHello :
Trang 23Sử dụng không gian tên
(Namespace)
• Tham khảo đến lớp Greeting : TextHello.Greeting
• Nên định nghĩa các lớp trong các không gian tên.
• VS.net sử dụng tên dự án làm không gian tên cấp ngoài cùng
• net Framework SDK cũng tuân theo quy định này
Ví dụ: lớp Console thuộc không gian tên System Viết tên tham khảo đầy đủ: System.Console Nếu
đã chỉ thị using System ở đầu tập tin thì không cần
viết Sysem nữa.
Trang 24Tạo tài liệu dùng XML và các ghi chú
• Viết chương trình thường phải đi kèm tài
liệu
• Tình trạng không đồng bộ giữa tập tin nguồn
và tập tin tài liệu
• Bộ khung net đặc tả một bộ các tên thẻ
nhúng trực tiếp vào trong ghi chú mã nguồn
• Nó cũng cung cấp tùy chọn biên dịch dòng lệnh /doc để sinh tài liệu mã nguồn dạng
XML
Trang 25Tạo tài liệu dùng XML và các ghi chú
• Trong cửa sổ Solution Explorer, chọn
Class1.cs, chọn Properties, đổi tên file
Class1.cs thành Greeting.cs
Trang 26Tạo tài liệu dùng XML và các ghi chú
Trong file Greeting.cs gõ vào:
Trang 27Tạo ứng dụng Windows Forms
• Tạo một form có chứa một ô text box, một nhãn và một nút nhấn.
• Nhập tên vào ô văn bản Khi nút được
nhấn, lời chào sẽ được hiển thị trên nhãn.
• Tiến hành:
– Chọn New Project từ trình đơn File
– Chọn Visual C# và template là Windows
Application
– Nhập tên dự án là WinFormHello
Trang 28Tạo ứng dụng Windows Forms
Trang 29Tạo ứng dụng Windows Forms
• Kéo thả các điều khiển lên trên form.
• Đặt tên lần lượt là:txtName, lblHello và
Trang 30Tạo ứng dụng Windows Forms
• Chạy chương trình, kết quả là:
Trang 31Chương 2:
Biến, toán tử và biểu thức
Nguyễn Hồng Phương Khoa CNTT - ĐHBKHN
Trang 33Định danh
• Là tên để nhận ra các phần tử trong các chương trình
• Tuân theo nguyên tắc cú pháp:
Trang 34Từ khóa
• C# có sẵn 76 từ khóa của chính nó
• Ví dụ: abtract, class, using,
namespace, break, continue, as, do, event, is, in, new, true, if, else, float, char, finally, protected, return,
string, default, for, while,…
• Trong cửa sổ mã nguồn, mặc định từ khóa có màu xanh da trời
Trang 35Sử dụng biến
• Biến là nơi lưu trữ giá trị tạm thời.
• Tên biến phải là duy nhất.
• Đặt tên biến:
– Không dùng dấu gạch dưới (_)
– Không nên tạo tên biến chỉ khác nhau bởi chữ hoa và chữ thường
– Tên nên bắt đầu bằng ký tự chữ thường
– Nên đặt tên theo các chuẩn khuyến cáo
• Khai báo biến: chỉ ra kiểu giá trị mà nó sẽ giữ và khai báo tường minh Phát biểu
lệnh khai báo: int age;
Trang 36Các kiểu dữ liệu cơ sở
thước (bit)
b = 0.42
Trang 37Các kiểu dữ liệu cơ sở
thước (bit)
Trang 38Toán tử số học
• Các phép toán: +, -, *, /, %
• Sử dụng các phép toán này trên các giá trị char, int, long, float, double, decimal
• Không dùng cho kiểu bool và string
• Ngoại lệ: dấu + dùng để nối các
chuỗi
Trang 39Độ ưu tiên của toán tử
• Là thứ tự mà toán tử của biểu thức được đánh giá
• Ví dụ: 6+5*3
• Có thể sử dụng dấu ngoặc đơn để
quyết định độ ưu tiên
Trang 40• Một toán tử logic là một toán tử có kết
quả đúng (true) hoặc sai (false).
• Kiểu dữ liệu bool
• Chú ý: các toán tử làm việc trên một toán hạng được gọi là toán tử một ngôi, làm
việc trên 2 toán hạng được gọi là 2 ngôi.
Trang 41Các toán tử logic boolean
Trang 42Các toán tử logic
• Toán tử AND, ký hiệu &&
• Toán tử OR, ký hiệu ||
• Toán tử NOT, ký hiệu !
• Mục đích các toán tử này là kết hợp các biểu thức logic lại thành biểu
thức lớn hơn
Trang 45Toán tử gán kép
var= var + num var *=num
var= var - num var -=num
var= var * num var *=num
var= var / num var /=num
Các tóan tử này có độ
ưu tiên và tính kết hợp phải giống toán tử gán đơn giản
Trang 46Tăng và giảm giá trị của biến
• Tăng 1 đơn vị cho biến:
Trang 47Chương 3:
Viết phương thức và
áp dụng phạm vi
Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN
Trang 48Khai báo phương thức
• Phương thức là một trình tự các câu lệnh được đặt tên
• Tên của phương thức nên là một định danh có nghĩa
• Hầu hết các phương thức đều nhận
dữ liệu truyền vào (đầu vào) và trả
về kết quả (đầu ra)
Trang 49Khai báo phương thức
• <Kiểu trả về>: int, string, void,….
• <tên phương thức>:dùng để gọi phương thức
• <ds tham số>: kiểu và tên tham số, ngăn cách nhau bởi dấu phẩy (nếu có nhiều)
• <thân phương thức>: các dòng mã và trả
Trang 50Gọi phương thức
• Sử dụng tên của phương thức để gọi
• Truyền đủ tham số cho nó (nếu
Trang 52Phạm vi (Scope)
• Biến khai báo bên trong phương thức thì có phạm vi trong phương thức đó
• Chúng được gọi là biến cục bộ,
không thể dùng để chia sẻ thông tin giữa các phương thức
• Biến khai báo bên trong thân của 1 lớp thì có phạm vi là lớp đó
• Những biến khai báo bên trong lớp
thì được gọi là trường hay thuộc tính
Trang 53Phạm vi (Scope)
• Có thể sử dụng các thuộc tính trong các phương thức
• Chú ý: Trong phương thức, ta phải
khai báo biến trước khi sử dụng còn trong lớp, ta có thể khai báo biến sau các phương thức
Trang 54Định danh chồng(Overload Identifier)
• Hai định danh mà có cùng tên thì ta bảo rằng chúng bị nạp chồng
• Nếu khai báo >=2 biến cùng tên
trong một phạm vi thì sẽ bị báo lỗi
Trang 55Định danh chồng(Overload Identifier)
Trang 56Chương 4:
Các câu lệnh lựa chọn
Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN
Trang 60Câu lệnh switch
• Chỉ sử dụng lệnh này trên các kiểu
cơ bản int và string
• Các nhãn sau từ khóa case là biểu thức hằng
• Các nhãn này phải là duy nhất
• Phải lặp lại cùng cú pháp cho các giátrị riêng lẻ để thực thi cùng các câu lệnh
• Câu lệnh break là bắt buộc, kể cả
trong phần default
Trang 61Chương 5:
Phát biểu lặp
Nguyễn Hồng Phương
Khoa CNTT, ĐHBKHN
Trang 62• Biểu thức điều kiện được đánh giá Nếu
đúng, câu lệnh sẽ được thực thi Cứ tiếp tục như vậy đến khi biểu thức điều kiện
không còn đúng thì dừng vòng lặp.
• Lưu ý: không có sự chuyển đổi từ dạng số nguyên sang đúng/sai như trong C/C++
Trang 63• Có thể bỏ qua bất kỳ phần nào trong
3 phần phát biểu của for
• Nếu biến khai báo trong phần khởi
tạo của for thì nó sẽ mất sau khi
vòng for kết thúc
Trang 64Phát biểu do
• Cú pháp:
do
statement while(<biểu thức điều kiện>)
Trang 65break và continue
• Dùng break nhảy khỏi thân vòng lặp
• Continue buộc chương trình ngay tức thời đánh giá lại biểu thức đúng/sai
Trang 67Vấn đề nảy sinh
• Các đoạn mã chương trình có thể
phát sinh các lỗi
• Làm thế nào? Dùng biến toàn cục
nhận các giá trị lỗi khác nhau từ các phương thức khác nhau → không
hiệu quả
• → sử dụng các ngoại lệ
Trang 68Đón bắt ngoại lệ
• Ý tưởng: Phân cách mã thực thi và mã xử
lý lỗi → không nhập nhằng với nhau nữa.
• Hai bước:
– Viết mã chương trình bên trong khối try
– Viết một hoặc nhiều bộ xử lý catch ngay sau khối try.
try{
statement;
} catch(ObjectException obj){
process Exception }
Trang 70Nếu không có bộ xử lý catchMethod 1
Method 2
Method n
Trang 75Checked và unchecked
Trang 76Checked và unchecked
Trang 77Checked và unchecked
Trang 78Checked và unchecked
Trang 79Các biểu thức checked và unchecked
Trang 82Chương 7
Nguyễn Hồng Phương
Khoa CNTT, ĐHBKHN
Trang 83Khái niệm chung
• Sự phân loại (Classification): Sắp xếp
thông tin một cách có hệ thống vào trong một thực thể, một sự vật, hiện tượng.
• Đóng gói (Encapsulation): đặt một sự vật, hiện tượng vào trong gói Đóng gói liên
quan đến:
– Kết hợp dữ liệu và phương thức bên trong một lớp (hỗ trợ phân loại).
– Điều khiển khả năng truy cập dữ liệu và
phương thức bên trong 1 lớp.
Trang 84}
Trang 85Điều khiển khả năng truy cập
• Bên trong vs bên ngoài lớp
• Từ khóa public, private
• Một phương thức/trường là private
nếu nó chỉ có thể truy cập được từ
bên trong phương thức đó
• Một phương thức/trường là public
nếu nó có thể truy cập được từ cả
bên trong và bên ngoài của phương thức đó
Trang 86Điều khiển khả năng truy cập
• Ví dụ:
class Circle {
private double radius;
public double Area() {
return 3.1415*radius*radius;
} }
• Nếu không nói gì thì mặc định là private
Trang 88Phương thức khởi tạo (Constructor)
Trang 90Xử lý trường hợp thứ hai
• Rõ ràng chỉ có các kiểu cơ bản là có thể có các giá trị thực sự, còn kiểu của c là một lớp.
• Ta dùng từ khóa new và gọi phương thức khởi tạo:
Circle c=new Circle();
Trang 91Phương thức khởi tạo
• Phương thức khởi tạo (khởi dựng) làmột phương thức đặc biệt có tên
trùng với tên của lớp
• Nó khởi tạo các trường của một đối tượng mới
• Nếu ta không viết phương thức này cho lớp của chúng ta, trình biên dịch
sẽ tự động “viết hộ” 1 cái
Trang 92Ví dụ phương thức khởi tạo
class Circle
{
private double radius;
public Circle() {
Trang 93• Các trường mà ta không khởi tạo
trong phương thức khởi tạo vẫn được khởi đầu giá trị là 0, false hay null
• Gọi phương thức của lớp: c.Area()
• Một số khuyến cáo khi đặt tên:
– Các định danh toàn cục nên bắt đầu
bằng một kí tự hoa.
– Các định danh không phải toàn cục nên bắt đầu bằng một kí tự thường.
Trang 94Nạp chồng phương thức khởi tạo
• Phương thức khởi tạo cũng là phương thức.
• Nó có thể được nạp chồng.
• Ví dụ:
class Circle {
private double radius;
public Circle(){
radius = 0.0;
} public Circle(double r){
Trang 95y=0;
} public Point(int initialX, int initialY) {
x=initialX;
y=initialY;
} public double distanceTo(Point other) {
int xDiff=x-other.x ; int yDiff=y-other.y ; return Math.Sqrt (xDiff*xDiff+yDiff*yDiff);
Trang 96Ví dụ: File Point.cs
class Application{
static void Entrance(){
Point origin=new Point();
Point bottomRight =new Point (600,800);
double distance=origin.distanceTo (bottomRight); Console.WriteLine ("Distance is :{0}",distance); }
static void Main(string[] args){
try{
Entrance();
} catch (Exception caught){
Console.WriteLine(caught.Message);
} }
}
}
Trang 99• Ta có thể dùng từ khóa static để tạo trường chia sẻ giữa các đối tượng
• Để khai báo một trường là tĩnh mà
giá trị của nó không thay đổi, ta
dùng từ khóa const Ví dụ:
class Math{
public static double Sqrt(double d){…}
public const double PI = 3.141593;
}
Trang 100Chương 8
Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN
Trang 101Kiểu giá trị vs kiểu tham chiếu
• Các kiểu cơ bản như int gọi là kiểu
giá trị vì một biến kiểu int giữ một
giá trị nguyên → kiểu trực tiếp
• Kiểu lớp như Circle gọi là kiểu tham chiếu vì một biến Circle không giữ
giá trị Circle mà nó tham chiếu tới
một đối tượng Circle → kiểu gián
tiếp
• “Kiểu giá trị giữ giá trị, kiểu tham
chiếu giữ tham chiếu”
Trang 102Kiểu giá trị vs kiểu tham chiếu
Trang 103param.Number = 42;
} }
Trang 106Console.WriteLine(caught.Message); }
} }
}
Trang 107Sử dụng tham số ref và out
static void Value(int param){
Trang 108Tham số ref
• Đặt trước một tham số từ khóa ref thìtham số trở thành bí danh cho đối sốthực sự
• Thao tác được thực hiện trên tham sốcũng sẽ được thực hiện trên đối số
• Khi truyền một đối số cho một tham
số thì trước đối số này ta cũng phải đặt từ khóa ref
Trang 110Chú ý:
• Phải gán giá trị cho một biến trước hi dùng
nó làm đối số ref truyền vào cho tham số ref Ví dụ sau báo lỗi:
static void Value(ref int param){
param++;
}
static void Main(){
int arg; // không khởi gán giá trị
Value(ref arg);
Console.WriteLine(arg);
}
Trang 111Tham số out
• Từ khóa out cũng giống từ khóa ref
• Nếu ta đặt từ khóa out trước một
tham số thì tham số này sẽ trở thành
bí danh cho đối số
• Khi truyền đối số cũng phải đặt từ
khóa out trước đối số
• Sự khác nhau là, một phương thức
không phải gán giá trị cho tham số
ref nhưng phải gán một giá trị cho
tham số out
Trang 112Tham số out (tiếp)
Lỗi vì phương thức Value không gán giá trị cho
Trang 113Tham số out (tiếp)
static void Value(out int param){
param = 42;
}
static void Main(){
int arg; // chưa được khởi gán
Value(out arg);
Console.WriteLine(arg);// in ra 42
}
Trang 114Stack và Heap
• Bộ nhớ máy tính được chia thành
một số đoạn Hai đoạn quan trọng:
– Stack: khi gọi phương thức, bộ nhớ
được yêu cầu cho các tham số và các
biến cục bộ Khi phương thức kết thúc, vùng nhớ được giải phóng.
– Heap: Khi tạo một đối tượng sử dụng từ khóa new và lời gọi phương thức khởi
dựng Nó sẽ được giải phóng một cách
tự động khi kết thúc.
Trang 115Circle c
@
42
Trang 116Lớp System.Object
• Lớp Object trong không gian tên
System là kiểu tham chiếu quan
trọng
namespace System {
class Object {
……
} }
Trang 118Lớp System.Object
• Khái niệm kế thừa, chúng ta sẽ học trong chương 12
• Một biến kiểu Object có thể tham
chiếu tới một thể hiện của bất kỳ lớp
Trang 119Cơ chế bao (boxing)
• Biến kiểu object có thể tham chiếu
tới bất kỳ đối tượng của kiểu tham
chiếu hoặc tham chiếu tới bản sao của kiểu giá trị
int i 42
int i = 42;
object o = i;
Trang 120Không bao (Unboxing)
• Một biến kiểu đối tượng có thể tham chiếu tới một bản sao của một giá trị
đã được bao
object o = 42;
int i = o; // Lỗi biên dịch
STACK HEAP Unboxing
42 object o = 42;
int i = (int) o;
Trang 121Chương 9
Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN
Trang 122Kiểu liệt kê
• Dùng từ khóa enum để tạo kiểu liệt
kê Toàn bộ giá trị của nó được giới hạn trong tập tên ký hiệu
• Ví dụ: khai báo kiểu enum có tên là
Season, giá trị chữ giới hạn trong các tên ký hiệu Spring , Summer, Fall,
Winter:
enum Season {Spring, Summer, Fall, Winter}
Trang 123Kiểu liệt kê
• Các tên ký hiệu phải nằm trong cặp ngoặc nhọn, phân cách nhau bằng
Trang 124• Được phép cho nhiều hơn một liệt kê chữ có cùng giá trị Ví dụ:
enum Season {Spring, Summer, Autumn = Fall, Winter}
• Chọn kiểu cơ sở cho kiểu liệt kê:
– Các liệt kê chữ có các giá trị kiểu int
Kiểu cơ sở mặc định là kiểu int.
– Ta có thể chọn kiểu cơ sở khác cho kiểu liệt kê, ví dụ:
enum Season:short {Spring, Summer, Fall, Winter}
Kiểu liệt kê
• Các kiểu cơ sở là 1 trong 8 kiểu
sau:byte, sbyte, short, ushort, int, uint, long,