Trong c# có 3 cách gọi hàm đó là gọi bằng giá trị (call by value), gọi bằng tham chiếu (call by Reference) và dùng tham số out.
6. Gọi bằng giá trị (call by value)
Trong C#, gọi bằng giá trị tức là tham số truyền vào là bản sao của giá trị gốc, vì vậy dù cho bên trong thân hàm có thay đổi giá trị của tham số truyền vào thì sau khi kết thúc gọi hàm thì giá trị gốc vẫn không thay đổi.
Kết quả chương trình
Hình 7.3. Kết quả gọi hàm bằng giá trị
b. Gọi bằng tham chiếu (call by Reference)
C # cung cấp một từ khóa ref để truyền đối số dưới dạng tham chiếu. Tức là tham số truyền vào bằng địa chỉ ô nhớ của biến gốc vì vậy bên trong thân hàm thay đổi giá trị tham số truyền vào thì giá trị gốc cũng thay đổi theo..
Hình 7.4. Kết quả gọi hàm bằng tham chiếu
c.Tham số out
Tham số out giống như kiểu tham chiếu, ngoại trừ việc nó không yêu cầu biến khởi tạo trước khi truyền.
Ví dụ:
Kết quả chương trình
Hình 7.5. Kết quả gọi hàm bằng tham số out
Bảng 7.1. Phân biệt giữ ref và out
ref out
Giá trị phải được khởi tạo trước Giá trị không được khởi tạo trước và bên trong thân hàm không đọc được nó cho đến khi nó được gán giá trị Bên trong thân hàm có thể đọc vào
thay đổi giá trị nó
Hàm phải gán giá trị cho biến out trước khi trả giá trị về
Câu hỏi ôn tập và bài tập
BÀI 8: THIẾT KẾ LỚP ĐỐI TƯỢNG
Mã bài: 20.8 Giới thiệu:
Lớp đối tượng được dùng để lưu trữ danh sách những thuộc tính và phương thức của đối tượng phân biệt trong một dự án lập trình.
Mục tiêu:
- Lập danh sách các lớp đối tượng ứng với từng chương trình cụ thể. - Thiết kế các lớp đối tượng cho bài tập của nhóm.
- Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm.
Nội dung chính:
7. Định nghĩa lớp đối tượng
Lập trình hướng đối tượng (Object-oriented programming – OOP), là kỹ thuật lập trình mà điều cốt yếu cần trừu tượng hóa các vấn đề thành các đối tượng (đối tượng có dữ liệu và các ứng xử). Kỹ thuật OOP có 4 tính chất
Tính trừu tượng (abstraction) mô tả một cách tổng quát hóa mà không
chi tiết thông tin (triển khai với interface, abstract)
Tính đóng gói (encapsulation) dữ liệu đối tượng cố gắng như nằm trong
một hộp đen, các thành phần khác bên ngoài đối tượng không trực tiếp tác động đến dữ liệu
Tính đa hình (polymorphism) đối tượng ứng xử khác nhau tùy trường
hợp cụ thể
Tính kế thừa (inheritance) đặc tính của lớp được kế thừa từ một lớp khác
Trong lập trình hướng đối tượng, lớp (class) là một kiểu dữ liệu nó định nghĩa một tập hợp các biến (thuộc tính) và phương thức (gọi chúng là các member – thành viên lớp). Từ lớp đó sinh ra các đối tượng (object), các đối tượng này còn gọi là instance of a class (bản triển khai của class), mỗi đối tượng có giá trị dữ liệu cụ thể (lưu trong thành viên biến). Các phương thức (method) – định nghĩa các ứng xử của đối tượng – dựa theo dữ liệu của chúng.
Một lớp là một nhóm đối tượng có các thuộc tính chung. Nó là một mẫu hoặc thiết kế từ đó các đối tượng được tạo ra.
Một thực thể có trạng thái và hành vi được gọi là đối tượng. Ví dụ như máy pha cà phê, xe đạp, xe máy, cái quạt...
Một đối tượng có ba đặc điểm:
Trạng thái: Đại diện cho dữ liệu (giá trị) của một đối tượng.
Hành vi: Đại diện cho hành vi (chức năng) của một đối tượng như gửi tiền, rút tiền, ...
Danh tính: Danh tính của một đối tượng thường được cài đặt thông qua một ID duy nhất. ID này được ẩn đối với user bên ngoài. Tuy nhiên nó được sử dụng trong nội bộ máy ảo JVM để định danh từng đối tượng. Ví dụ: Bút chì là một đối tượng. Tên của nó là A, màu trắng, ... được gọi là trạng thái. Nó được sử dụng để viết, viết được gọi là hành vi.
Đối tượng(Object) là một thể hiện của một lớp(Class). Lớp là một mẫu hoặc
thiết kế từ đó các đối tượng được tạo ra. Vì vậy, đối tượng là các thể hiện (kết quả) của một lớp.
Ví dụ: Một lớp mô tả chung về nhân viên, đặt tên là nhanvien, thì bên trong nó
có thể định nghĩa các thành viên dữ liệu (biến) như: manv, tennv, ngaysinh, gioitinh ... Cũng có thể định nghĩa các thành viên hàm (phương thức) để mô tả ứng xử của nó như: khoitao(), them() ...
Khi có định nghĩa lớp nhanvien, bạn có thể tạo ra đối tượng cụ thể của nó mà mỗi đối tượng có những dữ liệu khác nhau như Nhân viên A, Nhân viên B ...
2. Khai báo lớp đối tượng
Để tạo được lớp đối tượng trong ngôn ngữ lập trình C# trên phần mềm ứng dụng lập trình Visual Studio chúng ta cần thực hiện các việc sau:
Hình 8.1. Màn hình để chọn thêm một lớp mới vào Project
Hình 8.2. Màn hình đặt tên cho lớp đối tượng
Cú pháp, ví dụ khai báo lớp
Khi giải quyết các vấn đề thực tiễn, các vấn đề cần giải quyết bạn cần tìm cách trừu tượng hóa nó thành vấn đề tổng quát, như nó có các đặc tính gì, ứng xử của nó ra sao ... Từ đó mới có thể định nghĩa ra lớp để hiện thực hóa vấn đề trừu tượng được.
Cú pháp cơ bản như sau:
<Access Modifiers> class Class_Name
{
// khai báo các thành viên dữ liệu (thuộc tính – biêấn)
// khai báo các thành viên hàm (phưởng thức)
}
Trong đó Access Modifiers có thể là các từ khóa sau:
Bảng 8.1. Bảng mô tả các từ khóa định nghĩa lớp
Từ khóa Giải thích
Public Truy xuất mọi nơi
Protected Truy xuất trong nội bộ lớp hoặc trong các lớp con
Internal Truy xuất trong nội bộ chương trình (Assembly)
protected internal Truy xuất nội trong chương trình (assembly) và
trong các lớp con
private (mặc định) Chỉ được truy xuất trong nội bộ lớp
Ví dụ: Khai báo một lớp có tên là Box gồm các thuộc tính: chiều dài, chiều rộng, chiều cao.
Khai báo và khởi tạo thành viên thuộc tính (biến) tương tự cách khai báo biến thông thường nhưng có sử dụng thêm Access Modifiers để quy định cấp độ truy cập.
Câu hỏi ôn tập và bài tập
1. Tạo lớp đối tượng sinh viên bao gồm các thông tin: masv (mã sinh viên), tennv (tên sinh viên), ngaysinh (ngày sinh), diachi (địa chỉ)
2. Tạo lớp đối tượng đồng hồ bao gồm các thông tin: thoigian, gio, phut, giay. 3. Tạo lớp đối tượng sản phẩm bao gồm các thông tin: masp (mã sản phẩm), tensp (tên sản phẩm), gia (giá), ngaynhap (ngày nhập), ngayxuat (ngày xuất).
BÀI 9 : ĐỊNH NGHĨA CÁC THUỘC TÍNH, PHƯƠNG THỨC HÀNH ĐỘNG CHO LỚP ĐỐI TƯỢNG
Mã bài: 20.9 Giới thiệu:
Việc xác định thuộc tính của lớp đối tượng cũng như chuẩn bị sẵn các phương thức hoạt động cho lớp đối tượng giúp cho việc sử dụng và lập trình dễ dàng hơn rất nhiều.
Mục tiêu:
- Định nghĩa được các thuộc tính cho lớp đối tượng.
- Định nghĩa được các phương thức hành động cho lớp đối tượng - Vận dụng các thuộc tính, phương thức của lớp đối tượng trong đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm.
Nội dung chính:
8. Định nghĩa các thuộc tính cho lớp đối tượng
Ví dụ:
- Định nghĩa lớp đối tượng Box gồm các thuộc tính chieudai, chieurong, chieucao.
- Kiểu dữ liệu cho mỗi thuộc tính tùy theo mục đích sử dụng mà chọn kiểu dữ liệu.
Trong màn hình lập trình trên để khai báo và sử dụng lớp đối tượng Box trong chương trình Main ta sử dụng câu lệnh sau:
Từ khóa this
Từ khóa this dùng trong các phương thức của lớp, nó tham chiếu đến đối tượng hiện tại sinh ra từ lớp. Sử dụng this để tường minh, tránh sự không rõ ràng khi truy cập thuộc tính, phương thức hoặc để lấy đối tượng lớp làm tham số cho các thành phần khác ...
Ví dụ, hàm setchieucao, có thể viết: public void setchieucao(int chieucao) {
this.chieucao = chieucao ;
}
Nếu viết thiếu this thì là chieucao = chieucao , làm cho khó hiểu không biết là gán chieucao từ tham số hàm cho chieucao là dữ liệu của lớp.
2. Định nghĩa các phương thức hành động cho lớp đối tượng
Phương thức khởi tạo – Constructor
Phương thức khởi tạo là phương thức của lớp, nó được thi hành ngay khi đối tượng được tạo (bởi toán tử new), phương thức khởi tạo có tên trùng với tên của lớp, không có kiểu trả về.
Nếu khai báo vào khởi tạo giống như ở trên chương trình sẽ báo lỗi vì khi tạo đối tượng Box mới cần gán các giá trị ban đầu cho đối tượng: chiều dài, chiều rộng, chiều cao.
Lúc này có thể sử như sau:
Kết quả tương tự như ví dụ trên, việc sử dụng hàm khởi tạo đảm bảo dữ liệu của đối tượng bắt buộc phải khởi tạo ngay khi đối tượng đó được tạo – tránh việc sử dụng đối tượng mà dữ liệu không chính xác.
Phương thức Destructor trong C#
Một destructor trong C#, là một hàm thành viên đặc biệt của một lớp, được thực thi bất cứ khi nào một đối tượng của lớp đó thoát ra khởi phạm vi. Một destructor có tên giống tên lớp với một dẫu ngã (~) ở trước và nó có thể: không trả về một giá trị hoặc không nhận bất kỳ tham số nào.
Destructor trong C# có thể rất hữu ích để giải phóng tài nguyên bộ nhớ trước khi thoát khỏi chương trình. Destructor không thể bị kế thừa hoặc nạp chồng.
Chương trình được viết trong Program.cs
Kết quả thực hiện chương trình
Hình 9.1. Kết quả gọi class Box và truyền tham số
Kỹ thuật quá tải phương thức (Method Overloading) là cách thức triển khai khái niệm tính đa hình của lập trình hướng đối tượng. Quá tải phương thức là các phương thức có cùng tên nhưng tham số khác nhau (hàm có thể trả về kiểu dữ liệu khác nhau)
Tính đa hình (polymorphism) là cách ứng xử của đối tượng - ứng xử này là
khác nhau tùy thuộc vào tình huống cụ thể. Public static void WriteLine();
public static void WriteLine(bool value);
public static void WriteLine(decimal value);
public static void WriteLine(int value); ...
Điều này giúp cho bạn khi bạn gọi Console.Writeline(a), tùy thuộc vào kiểu dữ liệu của a mà một hàm WriteLine tương ứng được thi hành.
Ví dụ:
public class OverloadingExample {
public static int Sum(int a, int b)
{
return a + b;
}
public static double Sum(double a, double b)
{
return a + b;
}
}
Lớp trên có hàm Sum quá tải, tùy thuộc vào kiểu tham số mà hàm Sum cụ thể được gọi.
double a = 1;
double b = 2;
var c = OverloadingExample.Sum(a, b); // c = 3 có kiêỉu double int a = 1;
int b = 2;
var c = OverloadingExample.Sum(a, b); // c = 3 nhưng có kiêỉu int
Chú ý: Khai báo hai hàm cùng tên, giống nhau hoàn toàn về tham số chỉ khác kiểu trả về sẽ gây lỗi.
Tính đóng gói lập trình hướng đối tượng
Tính đóng gói mục đích hạn chế tối đa việc can thiệp trực tiếp vào dữ liệu, hoặc thi hành các tác vụ nội bổ của đối tượng. Nói cách khác, một đối tượng là hộp đen đối với các thành phần bên ngoài, nó chỉ cho phép bên ngoài tương tác với nó ở một số phương thức, thuộc tính, trường dữ liệu nhất định – hạn chế.
C# triển khai tính đóng gói này chính là sử dụng các Access Modifiers: public
private protected internal khi khai báo lớp, phương thức, thuộc tính, trường dữ liệu (biến).
Ví dụ:
class Student
{
private string Name;
}
Khi sử dụng
var s = new Student();
s.Name = “ABC”;
Biên dịch sẽ lỗi error CS0122: ‘Student.Name’ is inaccessible due to its protection level. Vì trường Name là private không thể truy cập bằng code bên ngoài lớp như trên. Nhưng nếu thay bằng public thì không lỗi.
Khi lập trình cố gắng tối đa ẩn thông tin ra bên ngoài lớp càng nhiều càng tốt để đảm bảo tính đóng gói của kỹ thuật lập trình OOP, nó giúp cho code dễ bảo trì và giám sát lỗi.
Câu hỏi ôn tập và bài tập
1. Lớp đối tượng sinh viên bao gồm các thông tin: masv (mã sinh viên), tennv (tên sinh viên), ngaysinh (ngày sinh), diachi (địa chỉ), diemtoan (điểm toán), diemvan (điểm văn). Viết các phương thức phù hợp cho lớp để gán thông tin, tính điểm trung bình.
2. Lớp đối tượng đồng hồ bao gồm các thông tin: thoigian, gio, phut, giay. Viết phương thức đổi ra giây của dữ liệu được nhập vào
3. Lớp đối tượng sản phẩm bao gồm các thông tin: masp (mã sản phẩm), tensp (tên sản phẩm), gia (giá), ngaynhap (ngày nhập), ngayxuat (ngày xuất). Viết phương thức kiểm tra dữ liệu nhập: ngày xuất phải sau ngày nhập.
BÀI 10: SỬ DỤNG FORM, MENUSTRIP
Mã bài: 20.10 Giới thiệu:
Form và Menustrip là 2 đối tượng cơ bản và cần thiết khi lập trình ứng dụng bằng Windows Form. Bản thân Form được tạo đầu tiên khi chương trình được chạy, Menustrip là điều khiển có mặt ở hầu hết các chương trình ứng dụng thực tế.
Mục tiêu:
- Hiểu và vận dụng Form cho đồ án - Hiểu và vận dụng MenuStrip cho đồ án
- Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm.
Nội dung chính: 9. Form
Form : đối tượng cửa sổ của chương trình chứa các đối tượng khác
Hình 10.1. Lựa chọn tạo mới 1 project
Hình 10.2. Màn hình lựa chọn khi tạo mới project
Hình 10.3. Màn hình quản lý các điều khiển trong Form
Chọn nơi lưu Chọn ứng dựng Windows Forms Chọn ngôn ngữ Thuộc tích của điều khiển Quản lý dự án
Form – biểu mẫu chính Các điều khiển
Để ẩn/hiện các đối tượng trên màn hình làm việc vào View ToolBox/ Properties/…
Hình 10.4. Lựa chọn hiển thị cho các cửa sổ con
Danh mục các điều khiển
10.Thuộc tính của Form
Bảng 10.1. Bảng mô tả thuộc tính Form
Thuộc tính Mô tả
Name Đặt tên form
AcceptButton
Giá trị thuộc tính này nhận là tên của một button trên form. Khi đó thay vì nhấp chuột vào button để thực thi thì người dùng có thể ấn phím Enter trên bàn phím
Backcolor Thiết lập màu nền của form
BackgroundImage Thiết lập hình nền cho form
BackgroundImageLayou t
Thiết lập việc hiển thị hình vừa thêm trong thuộc tính BackgroundImage sẽ hiển thị trên form ở dạng: bình thường (None), giữa (Center), …
CancelButton
Giá trị thuộc tính này nhận là tên của một button trên form. Khi đó thay vì nhấp chuột vào button để thực thi thì người dùng có thể ấn phím Escape trên bàn phím
ControlBox
Mang giá trị true hoặc false. Nếu thiết lập thuộc tính là false thì sẽ loại bỏ các nút minimize và nút maximize trên form
Cusor Thiết lập hình dạng con trỏ khi di chuyển
con trỏ vào form
Enable
Mang giá trị true hoặc false; Nếu thiết lập thuộc tính là false thì điều khiển trong form sẽ không cho phép người dùng thao tác.
Font Thiết lập văn bản hiển thị trên điều khiển
ForeColor Thiết lập màu mặc định cho chuỗi của các
điều khiển trên form
FormBorderStyle Thiết lập đường viền của form và hành vi
của form khi chạy chương trình
HelpButton
Mang giá trị true hoặc false; Nếu thiết lập thuộc tính là true thì trên thanh titlebar sẽ hiện 1 nút có dấu ? (nút này chỉ hiện khi hai thuộc tính MinimizeBox và MaximizeBox được thiết lập là false)
Icon Biểu tượng hiển thị bên trái trên thanh
titlebar của form
thuộc tính là true cho phép các sự kiện bàn phím của form có hiệu lực
Location
Khi thuộc tính StartPosition được thiết lập là Manual, thì thuộc tính Location có tác dụng thiết lập vị trí hiển thị của form trên màn hình
MaximizeBox
Mang giá trị true hoặc false: nếu thiết lập thuộc tính là false thì nút maximize form trên thanh titlebar sẽ mất đi
MaximumSize Thiết lập kích thước lớn nhất của form
(chiều rộng x chiều cao)
MinimizeBox
Mang giá trị true hoặc false: nếu thiết lập thuộc tính là false thì nút minimize form trên thanh titlebar sẽ mất đi
MinimumSize Thiết lập kích thước nhỏ nhất của form
(chiều rộng x chiều cao)
Opacity Thiết lập độ trong suốt cho form
Size Kích thước form
StartPosition Vị trí hiển thị của form trên màn hình