Sakura
Thú CƯng :
Số bài viết : 1124 Điểm : 1688 Được cảm ơn : 35 Ngày sinh : 03/11/1990 Tham gia ngày : 16/03/2010 Tuổi : 33 Đến từ : Bình Dương Ngề nghiệp : IT Student
| Tiêu đề: Checked vs Unchecked 8/10/2010, 09:36 | |
| Khi ta xử lý trên các KDL như int, byte, thì mặc định .NET không hỗ trợ việc kiểm tra tràn số. Ví dụ kiểu int chứa khoảng hơn 2 tỷ. nhưng khi ta tính toán ra, mà nó vượt quá con số này (4 tỷ chẳng hạn) thì điều gì xảy ra? --> tràn số (chứ ko báo lỗi).Vậy làm sao để bắt .NET kiểm tra dùm mình, đó là dùng cơ chế checked, khi 1 đoạn mã nằm trong khối checked này, thì các kết quả tính toán của nó sẽ được kiểm tra hợp lệ trong vùng chứa cho phép. Nếu có việc tràn số (overflow) xảy ra thì tự động .NET sẽ báo (phát, quăng, ném gì đó) ra cho chúng ta 1 ngoại lệ. Và để chương trình của chúng ta ko bị “đơ” thì phải dùng try…catch để “túm” lấy nó.Ví dụ: Khi ta không dùng checked để kiểm tra phép toán này: - Code:
-
using System;
class MainClass { public static void Main() { //int: -2,147,483,648 den 2,147,483,647 int a = int.MaxValue; int b = int.MaxValue;
int c = a + b; Console.WriteLine("a + b = " + c); Console.ReadLine(); } } Nó ra -2 --> sai Giờ ta thử dùng checked để kiểm tra xem: - Code:
-
using System;
class MainClass { public static void Main() { //int: -2,147,483,648 den 2,147,483,647 int a = int.MaxValue; int b = int.MaxValue; int c; checked { c = a + b; } Console.WriteLine("a + b = " + c); Console.ReadLine(); } } Hoặc có thể dùng: - Code:
-
using System;
class MainClass { public static void Main() { //int: -2,147,483,648 den 2,147,483,647 int a = int.MaxValue; int b = int.MaxValue; int c; c = checked((a + b)); Console.WriteLine("a + b = " + c); Console.ReadLine(); } } Trình biên dịch ném ra 1 ngoại lệ, chương trình của chúng ta dừng, báo lỗi như sau: - Code:
-
Arithmetic operation resulted in an overflow. Bây giờ ta dùng try..catch để bắt lấy ngoại lệ này: - Code:
-
using System;
class MainClass { public static void Main() { //int: -2,147,483,648 den 2,147,483,647 int a = int.MaxValue; int b = int.MaxValue; int c = 0;
try { c = checked((a + b)); } catch (OverflowException e) { Console.WriteLine("Co Loi: " + e.Message); } finally { Console.WriteLine("Ket Thuc!"); } Console.WriteLine("a + b = " + c); Console.ReadLine(); } } Vẫn chạy và báo: - Code:
-
Co Loi: Arithmetic operation resulted in an overflow. Ket Thuc! a + b = 0; Tuy nhiên, nếu ta không muốn làm việc kiểm tra tràn số này cũng được thui, mặc định, .NET đã làm việc này, tuy nhiên, ta cũng có thể dùng từ khóa unchecked để bỏ qua việc kiểm tra, khi đó, khỏi cần try..catch lỗi này làm gì. - Code:
-
using System;
class MainClass { public static void Main() { //int: -2,147,483,648 den 2,147,483,647 int a = int.MaxValue; int b = int.MaxValue; int c;
c = unchecked(a + b);
Console.WriteLine("a + b = " + c); Console.ReadLine(); } } Và chúng ta lại quay lại kết quả ban đầu nhận đc (-2). Chút kiến thức sơ xài về phần này, các bạn có thể tham khảo và bổ sung thêm! |
|
phamay
Member Năng Động
Thú CƯng :
Số bài viết : 137 Điểm : 222 Được cảm ơn : 5 Ngày sinh : 20/10/1990 Tham gia ngày : 21/03/2010 Tuổi : 34 Đến từ : Đăk Lăk Ngề nghiệp : Sờ tu đen Chăm ngôn : IT
| Tiêu đề: Re: Checked vs Unchecked 8/10/2010, 11:44 | |
| sao thay giong giong java the nhi ? Nhu vay neu ko dung try catch de bat loi thi trong khi chay chuong trinh se xuat ra thong bao loi phai khong ? |
|
Sakura
Thú CƯng :
Số bài viết : 1124 Điểm : 1688 Được cảm ơn : 35 Ngày sinh : 03/11/1990 Tham gia ngày : 16/03/2010 Tuổi : 33 Đến từ : Bình Dương Ngề nghiệp : IT Student
| Tiêu đề: Re: Checked vs Unchecked 8/10/2010, 16:28 | |
| - phamay đã viết:
- sao thay giong giong java the nhi ? Nhu vay neu ko dung try catch de bat loi thi trong khi chay chuong trinh se xuat ra thong bao loi phai khong ?
Đúng vậy! Khi ta chấp nhận checked thì phải có try...catch để túm nó. nếu ko thì đừng nên dùng, vì dùng vào càng mang họa hơn là mang lợi đó! |
|
bubupro.gdty
Member Năng Động
Thú CƯng :
Số bài viết : 118 Điểm : 123 Được cảm ơn : 0 Ngày sinh : 01/04/1990 Tham gia ngày : 02/04/2010 Tuổi : 34 Đến từ : Gia Lai Ngề nghiệp : student Chăm ngôn : to be or not to be
| Tiêu đề: Re: Checked vs Unchecked 8/10/2010, 21:33 | |
| thank's ku Hoàng nhìu nha |
|
lovelonelyman
Member Năng Động
Số bài viết : 134 Điểm : 180 Được cảm ơn : 9 Ngày sinh : 15/07/1990 Tham gia ngày : 30/04/2010 Tuổi : 34 Đến từ : Thai Binh
| Tiêu đề: Re: Checked vs Unchecked 9/10/2010, 07:38 | |
| Thanks H nhìu nhe, cái này hay đó. phải nghien cứu thêm thì mới hỉu hết dc |
|
Sponsored content
| Tiêu đề: Re: Checked vs Unchecked | |
| |
|