SlideShare ist ein Scribd-Unternehmen logo
1 von 5
Downloaden Sie, um offline zu lesen
Những điểm mới trong C# 3.0
1. Tự động hiện thực các thuộc tính
(Auto implemented properties)

Một việc làm khá nhàm chán mà các lập trình viên hay phải làm sau khi tạo lớp là viết
những accessor (còn gọi là setter, getter trong Java) hay có thể hiểu là các property của đối
tượng. Trong C# cũng cung cấp sẵn chức năng tự động tạo ra các accessor từ các field (có
thể hiểu là biến toàn cục trong lớp) có sẵn thông qua menu Refactor> Encapsulate Field…

Tuy nhiên có lẽ điều này vẫn chưa đủ, vì thế trong phiên bản 3.0 đã có một cải tiến mới
giúp giảm bớt thời gian, thao tác bằng cách rút ngắn mã lệnh cần phải viết cho công đoạn
này.

Ví dụ ta tạo một lớp SinhVien với một số thuộc tính tượng trưng theo phương pháp thông
thường của C# như sau:

C# 2.0:
Code:
01        class Student
02        {
03            private int id;
04
05            public int ID
06            {
07                get { return id; }
08                set { id = value; }
09            }
10
11            private string name;
12
13            public string Name
14            {
15                get { return name; }
16                set { name = value; }
17            }
18
19            private DateTime birthDay;
20
21            public DateTime BirthDay
22            {
23                get { return birthDay; }
24                set { birthDay = value; }
25            }
26        }


Có thể thấy là chỉ với 3 field ta đã tốn khá nhiều dòng để tạo ra các property tương ứng cho
lớp SinhVien này. Bây giờ ta thử tạo lớp SinhVien với cấu trúc tương tự trong C# 3.0:
C# 3.0:
Code:
1         class Student
2         {
3             public int ID { get; set; }
4             public string Name { get; set; }
5             public DateTime BirthDay { get; set; }
6         }


Một sự khác biệt đơn giản giữa hai đoạn mã của cùng một ngôn ngữ nhưng với hai phiên
bản khác nhau giúp cho công việc viết mã trở nên dễ dàng hơn. Bạn có thể tiết kiệm được
khá nhiều mã lệnh cần phải viết cho một lớp đồng thời giúp cho chúng dễ đọc hơn.

Trình biên dịch sẽ tự động tạo ra các biến private vô danh để lưu giữ giá trị của mỗi
property này.

Trong trường hợp muốn thuộc tính chỉ cho phép đọc (read-only) bạn có thể thêm từ khóa
private vào trước set ví dụ như với thuộc tính ID sau:
view source
Code:
1         class Student
2             {
3                 public int ID { get; private set; }
4                 public string Name { get; set; }
5                 public DateTime BirthDay { get; set; }
6             }


2. Khởi tạo đối tượng
(Object initializers)

Thông thường khi tạo một lớp ta phải overload một số hàm khởi tạo để sử dụng theo từng
trường hợp khác nhau. Mỗi overload xác định những tham số nào cần gán cho các thuộc
tính của đối tượng, công đoạn cũng khá nhàm chán và có thể phải cần đến số lượng dòng
lệnh khá lớn. Để giải quyết vấn đề này, C# 3.0 cung cấp cho ta một cách viết mới cho phép
gán giá trị trực tiếp cho các field hoặc property cần thiết của đối tượng được tạo chỉ trong
một dòng lệnh.

Ví dụ với lớp SinhVien ở trên, bạn không tạo ra một hàm khởi tạo cụ thể nào cả và sử dụng
hàm khởi tạo mặc định để tạo ra một đối tượng SinhVien với các thông tin ban đầu.

C# 2.0:
view source
Code:
1         SinhVien sv = new SinhVien();
2         sv.MaSo = 1;
3         sv.HoTen = "Yin Yang";
4         sv.NgaySinh = new DateTime(2000, 1, 1);
Trong C# 3.0 bạn cần một dòng duy nhất để làm điều này:

C# 3.0:
Code:
1       Student sv = new Student{ ID = 1, Name = "Yin Yang", BirthDay = new
DateTime(2000, 1, 1) };


Để mã nguồn dễ đọc, bạn có thể định dạng lại như sau:
view source
Code:
1         Student sv = new Student
2         {
3             ID = 1,
4             Name = "Yin Yang",
5             BirthDay = new DateTime(2000, 1, 1)
6         };


3. Khởi tạo tập hợp
(Collection initializers)

Đối với khởi tạo một tập hợp và thêm vào một số phần tử, bạn có thể khởi tạo nó như một
mảng. Giả sử ta cần một tập hợp có định kiểu để lưu danh sách các SinhVien.
Code:
    List<Student> list = new List<Student>();


Theo cách thông thường ta phải dùng phương thức Add() để thêm từng đối tượng kiểu
SinhVien vào danh sách. Trong C# 3.0 ta có thể làm điều này ngay trong lúc khởi tạo tập
hợp:
view source
Code:
1         List<Student> list = new List<Student>{
2             new Student{ID=1,Name="Yin"},
3             new Student{ID=2,Name="Yang"},
4             new Student{ID=3,Name="Zen"}
5         };


4. Biến cục bộ có kiểu ngầm định
(Implicitly typed local variables)

Trong C# 3.0 chúng ta có thể khai báo các biến cục bộ với kiểu không xác định thông qua
từ khóa var. Khi được biên dịch, trình biên dịch sẽ tự động xác định kiểu của biến đó thông
qua giá trị mà ta gán cho nó lúc khởi tạo.

Ví dụ:

var i = 100;

var s = “C# 3.0″;

Hai dòng lệnh trên tương đương với các dòng lệnh sau:

int i = 100;
string s = “C# 3.0″;

Bạn có thể gán cho biến khai báo bằng từ khóa var mọi giá trị mà bạn muốn, từ kiểu
nguyên thủy, kiểu mảng cho đến những kiểu đối tượng phức tạp. Tuy nhiên cần lưu ý là, khi
khai báo một biến với từ khóa var, bạn bắt buộc phải gán giá trị cho nó để trình biên dịch có
thể xác định được biến đó thuộc kiểu gì. Bởi vì var không phải là một kiểu mà chỉ đơn giản
là một từ khóa dùng để khai báo biến. Nếu cố làm điều này, bạn sẽ nhận được lỗi biên dịch
“Implicitly-typed local variables must be initialized”. Cũng thế, việc gán null cho một biến
được khai báo với var là không hợp lệ.

Vậy thì từ khóa var này có lợi ích gì? Chắc hẳn bạn sẽ tự tìm được câu trả lời sau một quá
trình làm việc với nó. Trường hợp đơn giản như khi bạn khai báo một tập hợp có kiểu là
List<int> và sau đó dùng foreach để duyệt qua nó, sau đó bạn lại thay đổi kiểu của tập hợp
này sang List<double>. Khi đó nếu dùng var bạn không cần phải sửa kiểu biến trong cú
pháp lặp nữa. Hơn nữa, mặc dù được khai báo với từ khóa var, bạn vẫn đảm bảo mã lệnh
của mình được tối ưu vì không phải qua bước ép kiểu hoặc boxing nào, và vẫn sử dụng được
chức năng IntelliSense của Visual Studio.
Code:
    foreach (var sv in list)

    {

    Console.WriteLine(sv.Name+”t”+sv.BirthDay.ToShortDateString());

    }


Bạn có thể gặp một số trường hợp khác tương tự như vậy. Để thấy rõ hơn công dụng của từ
khóa var, bạn hãy đọc tiếp phần sau.
5. Kiểu dữ liệu nặc danh
(Anonymous types)

Dựa trên khái niệm “Tuple” (một bộ dữ liệu), C# 3.0 cho phép tạo ra một kiểu đối tượng
tạm thời mà không cần định nghĩa trước và khai báo một lớp mới.

Cách sử dụng tương tự như việc tạo một đối tượng thông thường trong C# 3.0 ngoài việc
không cần đến tên lớp. Ở đây ta sẽ thấy được vai trò không thể thiếu của từ khóa var được
giới thiệu ở phần trên.
Code:
    var school = new

    {

    ID = “HUI”,

    Name = “ĐH CN”,

    Address = “Tp.HCM”

    };


Sau khi tạo ra đối tượng school này, ta có thể sử dụng nó tương tự như với các đối tượng
thông thường với 3 property vừa được định nghĩa trong quá trình khởi tạo là ID, Name và
Address.
Console.WriteLine(“Address: ” + school.Address);

Console.WriteLine(“Type Name: “+ school.GetType().Name);

Kết quả xuất ra như sau:

Address: Tp.HCM

Type Name: <>f__AnonymousType0`3

Có thể thấy là trình biên dịch tự động tạo ra một class mới với tên theo quy định của nó.
Trong trường hợp bạn tạo ra 2 đối tượng kiểu nặc danh với các thuộc tính giống hệt nhau,
trình biên dịch cũng vẫn chỉ tạo ra duy nhất một class mới. Xem ví dụ sau để hiểu thêm
điều này:
view source
Code:
01         var school1 = new
02         {
03             ID = "HUI",
04             Name = "ĐH CN",
05             Address = "Tp.HCM"
06         };
07         var school2 = new
08         {
09             ID = "HUI",
10             Name = "ĐH CN",
11             Address = "Tp.HCM"
12         };
13
14         Console.WriteLine("Type Name: "+ school1.GetType().Name);
15         Console.WriteLine("Type Name: " + school2.GetType().Name);


Kết quả:

Type Name: <>f__AnonymousType0`3

Type Name: <>f__AnonymousType0`3

6. Kết luận

Những phần được trình bày trên không phải là tất cả những điểm mới về cú pháp trong C#
3.0. Còn những kĩ thuật như Extension Method, Lambd Expression, Expression Tree, Partial
Method,… sẽ được giới thiệu trong mỗi bài viết riêng để truyền tải được phần nào công dụng
và cách thức sử dụng chúng. Tuy nhiên với những chức năng mới trên trong C# 3.0, chắc
hẳn bạn cũng có thể nhận thấy chúng tiện lợi và hiệu quả cho công việc lập trình thế nào.

Weitere ähnliche Inhalte

Was ist angesagt?

Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09aPplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pix Nhox
 
Pplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09aPplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09a
Pix Nhox
 
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09aPplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pix Nhox
 
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Thanh Minh Hoang
 
Giáo trình vb.net
Giáo trình vb.netGiáo trình vb.net
Giáo trình vb.net
Hung Pham
 

Was ist angesagt? (19)

Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịchHướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
 
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịchPhân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
 
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09aPplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
 
Decrypt các MSIL methods một cách thử công - Bài dịch
Decrypt các MSIL methods một cách thử công - Bài dịchDecrypt các MSIL methods một cách thử công - Bài dịch
Decrypt các MSIL methods một cách thử công - Bài dịch
 
Chuong 4
Chuong 4Chuong 4
Chuong 4
 
Cs lab04 win-form assignment
Cs lab04   win-form assignmentCs lab04   win-form assignment
Cs lab04 win-form assignment
 
Pplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09aPplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09a
 
Bai tap thuc hanh
Bai tap thuc hanhBai tap thuc hanh
Bai tap thuc hanh
 
Kiem tra javascript
Kiem tra javascriptKiem tra javascript
Kiem tra javascript
 
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09aPplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
 
C# cơ bản hay
C# cơ bản hayC# cơ bản hay
C# cơ bản hay
 
C# coban
C# cobanC# coban
C# coban
 
Bai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileBai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaile
 
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
 
Vb6 16 (8)
Vb6 16 (8)Vb6 16 (8)
Vb6 16 (8)
 
Giáo trình vb.net
Giáo trình vb.netGiáo trình vb.net
Giáo trình vb.net
 
Câu hỏi trắc nghiệm PHP
Câu hỏi trắc nghiệm PHPCâu hỏi trắc nghiệm PHP
Câu hỏi trắc nghiệm PHP
 
Chuong 5
Chuong 5Chuong 5
Chuong 5
 
Bài 2: Biến và toán tử - Giáo trình FPT
Bài 2: Biến và toán tử - Giáo trình FPTBài 2: Biến và toán tử - Giáo trình FPT
Bài 2: Biến và toán tử - Giáo trình FPT
 

Andere mochten auch

One piece 673 [sugoi scans]
One piece 673 [sugoi scans]One piece 673 [sugoi scans]
One piece 673 [sugoi scans]
Ruy Dantas
 
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng YênGiáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Trần Thiên Đại
 
Naruto cap 598 [sugoi scans]
Naruto cap 598 [sugoi scans]Naruto cap 598 [sugoi scans]
Naruto cap 598 [sugoi scans]
Ruy Dantas
 
Bleach cap 497 [sugoi scans]
Bleach cap 497 [sugoi scans]Bleach cap 497 [sugoi scans]
Bleach cap 497 [sugoi scans]
Ruy Dantas
 
Reborn capitulo 364
Reborn capitulo 364Reborn capitulo 364
Reborn capitulo 364
Ruy Dantas
 
Soul eater not capitulo 3
Soul eater not capitulo 3Soul eater not capitulo 3
Soul eater not capitulo 3
Ruy Dantas
 
Soul eater not 07
Soul eater not 07Soul eater not 07
Soul eater not 07
Ruy Dantas
 
Bleach cap 498 [sugoi scans]
Bleach cap 498 [sugoi scans]Bleach cap 498 [sugoi scans]
Bleach cap 498 [sugoi scans]
Ruy Dantas
 
Naruto cap 599 [sugoi scans]
Naruto cap 599 [sugoi scans]Naruto cap 599 [sugoi scans]
Naruto cap 599 [sugoi scans]
Ruy Dantas
 

Andere mochten auch (20)

One piece 673 [sugoi scans]
One piece 673 [sugoi scans]One piece 673 [sugoi scans]
One piece 673 [sugoi scans]
 
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng YênGiáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
 
Naruto cap 598 [sugoi scans]
Naruto cap 598 [sugoi scans]Naruto cap 598 [sugoi scans]
Naruto cap 598 [sugoi scans]
 
Bleach cap 497 [sugoi scans]
Bleach cap 497 [sugoi scans]Bleach cap 497 [sugoi scans]
Bleach cap 497 [sugoi scans]
 
Diana 7ºb
Diana   7ºbDiana   7ºb
Diana 7ºb
 
One piece 656
One piece 656One piece 656
One piece 656
 
Reborn capitulo 364
Reborn capitulo 364Reborn capitulo 364
Reborn capitulo 364
 
Soul eater not capitulo 3
Soul eater not capitulo 3Soul eater not capitulo 3
Soul eater not capitulo 3
 
One piece 637
One piece 637One piece 637
One piece 637
 
Presentacion cooperativa delux229
Presentacion cooperativa delux229 Presentacion cooperativa delux229
Presentacion cooperativa delux229
 
One piece 642
One piece 642One piece 642
One piece 642
 
One piece 629
One piece 629One piece 629
One piece 629
 
Soul eater not 07
Soul eater not 07Soul eater not 07
Soul eater not 07
 
One piece 657
One piece 657One piece 657
One piece 657
 
One piece 633
One piece 633One piece 633
One piece 633
 
Presentacion zhongtong
Presentacion zhongtongPresentacion zhongtong
Presentacion zhongtong
 
Bleach cap 498 [sugoi scans]
Bleach cap 498 [sugoi scans]Bleach cap 498 [sugoi scans]
Bleach cap 498 [sugoi scans]
 
Naruto cap 599 [sugoi scans]
Naruto cap 599 [sugoi scans]Naruto cap 599 [sugoi scans]
Naruto cap 599 [sugoi scans]
 
One piece 658
One piece 658One piece 658
One piece 658
 
One piece 659
One piece 659One piece 659
One piece 659
 

Ähnlich wie Những điểm mới trong c# 3.0

Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1
Hiển Phùng
 
Phan 2 chuong 9 (cau truc)
Phan 2   chuong 9 (cau truc)Phan 2   chuong 9 (cau truc)
Phan 2 chuong 9 (cau truc)
Trần Văn Nam
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
Huy Nguyễn
 

Ähnlich wie Những điểm mới trong c# 3.0 (20)

Pdfc fast food-mastercode.vn
Pdfc fast food-mastercode.vnPdfc fast food-mastercode.vn
Pdfc fast food-mastercode.vn
 
Giáo trình c#
Giáo trình c#Giáo trình c#
Giáo trình c#
 
Kiem tra Javasrctip
Kiem tra JavasrctipKiem tra Javasrctip
Kiem tra Javasrctip
 
Bài tập javascript
Bài tập javascriptBài tập javascript
Bài tập javascript
 
Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1
 
Phan 2 chuong 9 (cau truc)
Phan 2   chuong 9 (cau truc)Phan 2   chuong 9 (cau truc)
Phan 2 chuong 9 (cau truc)
 
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...
Bài 2: Lập trình hướng đối tượng & Collection - Lập trình winform - Giáo trìn...
 
Bai tap java_script-html-2016
Bai tap java_script-html-2016Bai tap java_script-html-2016
Bai tap java_script-html-2016
 
Book
BookBook
Book
 
Book
BookBook
Book
 
C fast food
C fast foodC fast food
C fast food
 
Bai 18
Bai 18Bai 18
Bai 18
 
Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++
 
Lab lap trinhmang_v3
Lab lap trinhmang_v3Lab lap trinhmang_v3
Lab lap trinhmang_v3
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
Chuong3 c
Chuong3 c Chuong3 c
Chuong3 c
 
Chuong8 (2)
Chuong8 (2)Chuong8 (2)
Chuong8 (2)
 
ngon-ngu-lap-trinh-python_C1_cac_khai_niem_(PI).pptx
ngon-ngu-lap-trinh-python_C1_cac_khai_niem_(PI).pptxngon-ngu-lap-trinh-python_C1_cac_khai_niem_(PI).pptx
ngon-ngu-lap-trinh-python_C1_cac_khai_niem_(PI).pptx
 
Linq net
Linq net Linq net
Linq net
 

Mehr von Trần Thiên Đại

Nền tảng lập trình java (Core java)
Nền tảng lập trình java (Core java)Nền tảng lập trình java (Core java)
Nền tảng lập trình java (Core java)
Trần Thiên Đại
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất Nghệ
Trần Thiên Đại
 
Lập trình hướng đối tượng với C++
Lập trình hướng đối tượng với C++Lập trình hướng đối tượng với C++
Lập trình hướng đối tượng với C++
Trần Thiên Đại
 

Mehr von Trần Thiên Đại (6)

Lập trình java
Lập trình javaLập trình java
Lập trình java
 
Nền tảng lập trình java (Core java)
Nền tảng lập trình java (Core java)Nền tảng lập trình java (Core java)
Nền tảng lập trình java (Core java)
 
Các giải pháp lập trình C#
Các giải pháp lập trình C#Các giải pháp lập trình C#
Các giải pháp lập trình C#
 
Ngôn ngữ lập trình C#
Ngôn ngữ lập trình C#Ngôn ngữ lập trình C#
Ngôn ngữ lập trình C#
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất Nghệ
 
Lập trình hướng đối tượng với C++
Lập trình hướng đối tượng với C++Lập trình hướng đối tượng với C++
Lập trình hướng đối tượng với C++
 

Những điểm mới trong c# 3.0

  • 1. Những điểm mới trong C# 3.0 1. Tự động hiện thực các thuộc tính (Auto implemented properties) Một việc làm khá nhàm chán mà các lập trình viên hay phải làm sau khi tạo lớp là viết những accessor (còn gọi là setter, getter trong Java) hay có thể hiểu là các property của đối tượng. Trong C# cũng cung cấp sẵn chức năng tự động tạo ra các accessor từ các field (có thể hiểu là biến toàn cục trong lớp) có sẵn thông qua menu Refactor> Encapsulate Field… Tuy nhiên có lẽ điều này vẫn chưa đủ, vì thế trong phiên bản 3.0 đã có một cải tiến mới giúp giảm bớt thời gian, thao tác bằng cách rút ngắn mã lệnh cần phải viết cho công đoạn này. Ví dụ ta tạo một lớp SinhVien với một số thuộc tính tượng trưng theo phương pháp thông thường của C# như sau: C# 2.0: Code: 01 class Student 02 { 03 private int id; 04 05 public int ID 06 { 07 get { return id; } 08 set { id = value; } 09 } 10 11 private string name; 12 13 public string Name 14 { 15 get { return name; } 16 set { name = value; } 17 } 18 19 private DateTime birthDay; 20 21 public DateTime BirthDay 22 { 23 get { return birthDay; } 24 set { birthDay = value; } 25 } 26 } Có thể thấy là chỉ với 3 field ta đã tốn khá nhiều dòng để tạo ra các property tương ứng cho lớp SinhVien này. Bây giờ ta thử tạo lớp SinhVien với cấu trúc tương tự trong C# 3.0:
  • 2. C# 3.0: Code: 1 class Student 2 { 3 public int ID { get; set; } 4 public string Name { get; set; } 5 public DateTime BirthDay { get; set; } 6 } Một sự khác biệt đơn giản giữa hai đoạn mã của cùng một ngôn ngữ nhưng với hai phiên bản khác nhau giúp cho công việc viết mã trở nên dễ dàng hơn. Bạn có thể tiết kiệm được khá nhiều mã lệnh cần phải viết cho một lớp đồng thời giúp cho chúng dễ đọc hơn. Trình biên dịch sẽ tự động tạo ra các biến private vô danh để lưu giữ giá trị của mỗi property này. Trong trường hợp muốn thuộc tính chỉ cho phép đọc (read-only) bạn có thể thêm từ khóa private vào trước set ví dụ như với thuộc tính ID sau: view source Code: 1 class Student 2 { 3 public int ID { get; private set; } 4 public string Name { get; set; } 5 public DateTime BirthDay { get; set; } 6 } 2. Khởi tạo đối tượng (Object initializers) Thông thường khi tạo một lớp ta phải overload một số hàm khởi tạo để sử dụng theo từng trường hợp khác nhau. Mỗi overload xác định những tham số nào cần gán cho các thuộc tính của đối tượng, công đoạn cũng khá nhàm chán và có thể phải cần đến số lượng dòng lệnh khá lớn. Để giải quyết vấn đề này, C# 3.0 cung cấp cho ta một cách viết mới cho phép gán giá trị trực tiếp cho các field hoặc property cần thiết của đối tượng được tạo chỉ trong một dòng lệnh. Ví dụ với lớp SinhVien ở trên, bạn không tạo ra một hàm khởi tạo cụ thể nào cả và sử dụng hàm khởi tạo mặc định để tạo ra một đối tượng SinhVien với các thông tin ban đầu. C# 2.0: view source Code: 1 SinhVien sv = new SinhVien(); 2 sv.MaSo = 1; 3 sv.HoTen = "Yin Yang"; 4 sv.NgaySinh = new DateTime(2000, 1, 1);
  • 3. Trong C# 3.0 bạn cần một dòng duy nhất để làm điều này: C# 3.0: Code: 1 Student sv = new Student{ ID = 1, Name = "Yin Yang", BirthDay = new DateTime(2000, 1, 1) }; Để mã nguồn dễ đọc, bạn có thể định dạng lại như sau: view source Code: 1 Student sv = new Student 2 { 3 ID = 1, 4 Name = "Yin Yang", 5 BirthDay = new DateTime(2000, 1, 1) 6 }; 3. Khởi tạo tập hợp (Collection initializers) Đối với khởi tạo một tập hợp và thêm vào một số phần tử, bạn có thể khởi tạo nó như một mảng. Giả sử ta cần một tập hợp có định kiểu để lưu danh sách các SinhVien. Code: List<Student> list = new List<Student>(); Theo cách thông thường ta phải dùng phương thức Add() để thêm từng đối tượng kiểu SinhVien vào danh sách. Trong C# 3.0 ta có thể làm điều này ngay trong lúc khởi tạo tập hợp: view source Code: 1 List<Student> list = new List<Student>{ 2 new Student{ID=1,Name="Yin"}, 3 new Student{ID=2,Name="Yang"}, 4 new Student{ID=3,Name="Zen"} 5 }; 4. Biến cục bộ có kiểu ngầm định (Implicitly typed local variables) Trong C# 3.0 chúng ta có thể khai báo các biến cục bộ với kiểu không xác định thông qua từ khóa var. Khi được biên dịch, trình biên dịch sẽ tự động xác định kiểu của biến đó thông qua giá trị mà ta gán cho nó lúc khởi tạo. Ví dụ: var i = 100; var s = “C# 3.0″; Hai dòng lệnh trên tương đương với các dòng lệnh sau: int i = 100;
  • 4. string s = “C# 3.0″; Bạn có thể gán cho biến khai báo bằng từ khóa var mọi giá trị mà bạn muốn, từ kiểu nguyên thủy, kiểu mảng cho đến những kiểu đối tượng phức tạp. Tuy nhiên cần lưu ý là, khi khai báo một biến với từ khóa var, bạn bắt buộc phải gán giá trị cho nó để trình biên dịch có thể xác định được biến đó thuộc kiểu gì. Bởi vì var không phải là một kiểu mà chỉ đơn giản là một từ khóa dùng để khai báo biến. Nếu cố làm điều này, bạn sẽ nhận được lỗi biên dịch “Implicitly-typed local variables must be initialized”. Cũng thế, việc gán null cho một biến được khai báo với var là không hợp lệ. Vậy thì từ khóa var này có lợi ích gì? Chắc hẳn bạn sẽ tự tìm được câu trả lời sau một quá trình làm việc với nó. Trường hợp đơn giản như khi bạn khai báo một tập hợp có kiểu là List<int> và sau đó dùng foreach để duyệt qua nó, sau đó bạn lại thay đổi kiểu của tập hợp này sang List<double>. Khi đó nếu dùng var bạn không cần phải sửa kiểu biến trong cú pháp lặp nữa. Hơn nữa, mặc dù được khai báo với từ khóa var, bạn vẫn đảm bảo mã lệnh của mình được tối ưu vì không phải qua bước ép kiểu hoặc boxing nào, và vẫn sử dụng được chức năng IntelliSense của Visual Studio. Code: foreach (var sv in list) { Console.WriteLine(sv.Name+”t”+sv.BirthDay.ToShortDateString()); } Bạn có thể gặp một số trường hợp khác tương tự như vậy. Để thấy rõ hơn công dụng của từ khóa var, bạn hãy đọc tiếp phần sau. 5. Kiểu dữ liệu nặc danh (Anonymous types) Dựa trên khái niệm “Tuple” (một bộ dữ liệu), C# 3.0 cho phép tạo ra một kiểu đối tượng tạm thời mà không cần định nghĩa trước và khai báo một lớp mới. Cách sử dụng tương tự như việc tạo một đối tượng thông thường trong C# 3.0 ngoài việc không cần đến tên lớp. Ở đây ta sẽ thấy được vai trò không thể thiếu của từ khóa var được giới thiệu ở phần trên. Code: var school = new { ID = “HUI”, Name = “ĐH CN”, Address = “Tp.HCM” }; Sau khi tạo ra đối tượng school này, ta có thể sử dụng nó tương tự như với các đối tượng thông thường với 3 property vừa được định nghĩa trong quá trình khởi tạo là ID, Name và Address.
  • 5. Console.WriteLine(“Address: ” + school.Address); Console.WriteLine(“Type Name: “+ school.GetType().Name); Kết quả xuất ra như sau: Address: Tp.HCM Type Name: <>f__AnonymousType0`3 Có thể thấy là trình biên dịch tự động tạo ra một class mới với tên theo quy định của nó. Trong trường hợp bạn tạo ra 2 đối tượng kiểu nặc danh với các thuộc tính giống hệt nhau, trình biên dịch cũng vẫn chỉ tạo ra duy nhất một class mới. Xem ví dụ sau để hiểu thêm điều này: view source Code: 01 var school1 = new 02 { 03 ID = "HUI", 04 Name = "ĐH CN", 05 Address = "Tp.HCM" 06 }; 07 var school2 = new 08 { 09 ID = "HUI", 10 Name = "ĐH CN", 11 Address = "Tp.HCM" 12 }; 13 14 Console.WriteLine("Type Name: "+ school1.GetType().Name); 15 Console.WriteLine("Type Name: " + school2.GetType().Name); Kết quả: Type Name: <>f__AnonymousType0`3 Type Name: <>f__AnonymousType0`3 6. Kết luận Những phần được trình bày trên không phải là tất cả những điểm mới về cú pháp trong C# 3.0. Còn những kĩ thuật như Extension Method, Lambd Expression, Expression Tree, Partial Method,… sẽ được giới thiệu trong mỗi bài viết riêng để truyền tải được phần nào công dụng và cách thức sử dụng chúng. Tuy nhiên với những chức năng mới trên trong C# 3.0, chắc hẳn bạn cũng có thể nhận thấy chúng tiện lợi và hiệu quả cho công việc lập trình thế nào.