Unsafe code trong C#
C# cho phép sử dụng các biến con trỏ trong một hàm của khối code khi nó được đánh dấu bởi unsafe modifier. Khái niệm unsafe code hoặc unmanaged code trong C# là một khối code mà sử dụng một biến con trỏ . Cách compile unsafe code trong Visual Studio 2010 Để biên dịch và chạy ...
C# cho phép sử dụng các biến con trỏ trong một hàm của khối code khi nó được đánh dấu bởi unsafe modifier. Khái niệm unsafe code hoặc unmanaged code trong C# là một khối code mà sử dụng một biến con trỏ.
Cách compile unsafe code trong Visual Studio 2010
Để biên dịch và chạy các chương trình trong chế độ /unsafe, bạn chỉ cần click chuột phải vào Project, sau đó chọn Properties --> Build --> Allow unsafe code rồi nhấn tổ hợp phím Ctrl + S để lưu các thay đổi như trong hình:
Con trỏ (Pointer) trong C#
Một con trỏ là một biến mà có giá trị là địa chỉ của biến khác, ví dụ: địa chỉ trực tiếp của vị trí bộ nhớ. Tương tự như bất kỳ biến hoặc hằng khác trong C#, bạn phải khai báo một con trỏ trước khi bạn có thể sử dụng nó để lưu giữ bất kỳ địa chỉ biến nào.
Form chung của một khai báo con trỏ trong C# là:
type *var-name;
Dưới đây là các khai báo con trỏ hợp lệ trong C#:
int *ip; /* con trỏ tới một số nguyên */ double *dp; /* con trỏ tới một số double */ float *fp; /* con trỏ tới một số float */ char *ch /* con trỏ tới một ký tự */
Ví dụ sau minh họa sự sử dụng của con trỏ, sử dụng unsafe modifier trong C#:
using System; namespace VietJackCsharp { class TestCsharp { static unsafe void Main(string[] args) { Console.WriteLine("Con tro trong C#"); Console.WriteLine("--------------------------------"); int var = 20; int* p = &var; Console.WriteLine("Du lieu: {0} ", var); Console.WriteLine("Dia chi: {0}", (int)p); Console.ReadKey(); } } }
Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.
Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:
Thay cho việc khai báo toàn bộ phương thức ở dạng unsafe, bạn cũng có thể khai báo một phần code dạng unsafe.
Thu hồi giá trị dữ liệu bởi sử dụng con trỏ trong C#
Bạn có thể thu hồi dữ liệu đã được lưu giữ tại vị trí được tham chiếu bởi biến con trỏ, sử dụng phương thức ToString() trong C#. Đây là ví dụ minh họa:
using System; namespace VietJackCsharp { class TestCsharp { static void Main(string[] args) { Console.WriteLine("Con tro trong C#"); Console.WriteLine(""); Console.WriteLine("--------------------------------"); unsafe { int var = 20; int* p = &var; Console.WriteLine("Du lieu: {0} ", var); Console.WriteLine("Du lieu: {0} ", p->ToString()); Console.WriteLine("Dia chi: {0} ", (int)p); } Console.ReadKey(); } } }
Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:
Truyền Con trỏ như là các Tham số tới phương thức trong C#
Bạn có thể truyền một biến con trỏ tới một phương thức dưới dạng các tham số. Đây là ví dụ minh họa:
using System; namespace VietJackCsharp { class TestCsharp { public unsafe void swap(int* p, int* q) { int temp = *p; *p = *q; *q = temp; } public unsafe static void Main() { Console.WriteLine(""); Console.WriteLine("Truyen con tro nhu la tham so"); Console.WriteLine("-----------------------------------"); TestCsharp p = new TestCsharp(); int var1 = 10; int var2 = 20; int* x = &var1; int* y = &var2; Console.WriteLine("Truoc khi trao doi: var1 = {0}, var2 = {1}", var1, var2); p.swap(x, y); Console.WriteLine("Sau khi trao doi: var1 = {0}, var2 = {1}", var1, var2); Console.ReadKey(); } } }
Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:
Truy cập các phần tử mảng bởi sử dụng một con trỏ trong C#
Trong C#, một tên mảng và một con trỏ tới cùng kiểu dữ liệu ở dạng dữ liệu mảng, là không cùng kiểu biến. Ví dụ, int *p và int[] p, là không cùng kiểu. Bạn có thể lượng gia biến con trỏ p bởi vì nó không là cố định trong bộ nhớ, nhưng một địa chỉ mảng là cố định trong bộ nhớ, và bạn không thể lượng gia nó.
Vì thế, nếu bạn cần truy cập một dữ liệu mảng bởi sử dụng một biến con trỏ, như khi chúng ta đã làm trong C hoặc C++ (bạn có thể kiểm tra: ), bạn cần cố định con trỏ đó bởi sử dụng từ khóa fixed trong C#.
Sau đây là ví dụ minh họa:
using System; namespace VietJackCsharp { class TestCsharp { public unsafe static void Main() { Console.WriteLine(""); Console.WriteLine("Truy cap cac phan tu mang boi su dung con tro"); Console.WriteLine("-----------------------------------"); int[] list = {10, 100, 200}; fixed (int* ptr = list) /* mang dia chi trong con tro */ for (int i = 0; i < 3; i++) { Console.WriteLine("Dia chi cua list[{0}]={1}", i, (int)(ptr + i)); Console.WriteLine("Gia tri cua list[{0}]={1}", i, *(ptr + i)); } Console.ReadKey(); } } }
Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:
Mọi người cho thể tham gia khóa học thứ 6 của vietjackteam (đang tuyển sinh) vào đầu tháng 03/2018 do anh Nguyễn Thanh Tuyền, admin vietjack.com trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : .Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Số lượng các công việc Java hoặc .NET luôn gấp ít nhất 3 lần Android hoặc iOS trên thị trường tuyển dụng.
Mọi người có thể xem demo nội dung khóa học tại địa chỉ
Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Trong tháng 4/2018, VietJack khuyến mại giá SỐC chỉ còn 150k cho khóa học, liên hệ facebook admin fb.com/tuyen.vietjack để thanh toán chuyển khoản hoặc thẻ điện thoại, khóa học bằng Tiếng Việt với gần 100 video, các bạn có thể chủ động bất cứ lúc nào, và xem mãi mãi. Thông tin khóa học tại
Loạt bài hướng dẫn học C# cơ bản và nâng cao của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint.com
Follow fanpage của team hoặc facebook cá nhân Nguyễn Thanh Tuyền để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.
Bài học C# phổ biến khác tại vietjack.com: