Checked vs Unchecked


Diễn đàn chia sẻ kiến thức, kinh nghiệm về IT và cuộc sống!
 
Trang ChínhGalleryTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập
Top posters
Sakura (1124)
 
hotboy (705)
 
Già Làng (373)
 
con_ca_nho90 (289)
 
that_true (154)
 
theanhkkt (143)
 
phamay (137)
 
lovelonelyman (134)
 
o0ovioletstaro0o (128)
 
stevenhung (122)
 
Âm - Dương lịch
Clock
Logo
11TH02 Pro!
Liên kết
Tin tức 60s
Tin công nghệ
Thời sự 24h
Game Moblie

Share | 
 

 Checked vs Unchecked

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
Sakura


avatar

Thú CƯng :
Nam Scorpio

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 : 27
Đến từ : Bình Dương
Ngề nghiệp : IT Student

Bài gửiTiê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!



_________________________________________________
Khách viếng thăm muốn liên hệ với mình thì xem thông tin phía dưới nha:
Email: [You must be registered and logged in to see this link.]
Nick Yahoo: Edward_Thien
Về Đầu Trang Go down
Xem lý lịch thành viên
phamay

Member Năng Động


Member Năng Động
avatar

Thú CƯng :
Nam Libra

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 : 27
Đến từ : Đăk Lăk
Ngề nghiệp : Sờ tu đen
Chăm ngôn : IT

Bài gửiTiê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 ?
Về Đầu Trang Go down
Xem lý lịch thành viên dodinhvinh90@yahoo.com
Sakura


avatar

Thú CƯng :
Nam Scorpio

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 : 27
Đến từ : Bình Dương
Ngề nghiệp : IT Student

Bài gửiTiê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 đó!

_________________________________________________
Khách viếng thăm muốn liên hệ với mình thì xem thông tin phía dưới nha:
Email: [You must be registered and logged in to see this link.]
Nick Yahoo: Edward_Thien
Về Đầu Trang Go down
Xem lý lịch thành viên
bubupro.gdty

Member Năng Động


Member Năng Động
avatar

Thú CƯng :
Nữ Aries

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 : 28
Đến từ : Gia Lai
Ngề nghiệp : student
Chăm ngôn : to be or not to be

Bài gửiTiêu đề: Re: Checked vs Unchecked   8/10/2010, 21:33

thank's ku Hoàng nhìu nha Very Happy
Về Đầu Trang Go down
Xem lý lịch thành viên
lovelonelyman

Member Năng Động


Member Năng Động
avatar

Nam Cancer

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 : 27
Đến từ : Thai Binh

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
Sponsored content




Bài gửiTiêu đề: Re: Checked vs Unchecked   

Về Đầu Trang Go down
 

Checked vs Unchecked

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
IT World! :: HỌC TẬP :: HỌC KỲ V :: Nhập môn .Net-