2011-11-25 43 views

Trả lời

10

C++ kế thừa nhiều tính năng C, vì vậy bạn luôn có thể làm điều gì đó không an toàn nếu muốn. Chỉ có điều đó nếu bạn sử dụng C++ một cách tự nhiên, thì bạn sẽ thường nhận được sự an toàn kiểu. Chỉ là không có gì sẽ ngăn bạn lại nếu bạn chọn rời khỏi căn cứ an toàn.

C# thi hành hệ thống kiểu mạnh hơn và hạn chế sử dụng cấu trúc kiểu C (đáng chú ý nhất là số học con trỏ) để đánh dấu các vùng "không an toàn", vì vậy bạn có quyền kiểm soát tốt hơn (=  ) t.


digression: Nó có thể là đáng giá để phản ánh một chút về những gì có nghĩa là "an toàn". Ngôn ngữ được gọi là an toàn nếu chúng tôi có thể xác minh rằng một đoạn mã cụ thể là chính xác. Trong ngôn ngữ được nhập tĩnh, về cơ bản, hãy kiểm tra kiểu loại: Nếu chúng tôi có biểu thức a + b, thì chúng tôi chỉ kiểm tra các loại: int cộng int bằng int, tiền phạt; struct plus union không có ý nghĩa, biên dịch lỗi.

Người đàn ông lẻ ra trong thiết lập này là toán tử tham chiếu *: Khi chúng ta thấy *p, chúng ta có thể kiểm tra xem p là một con trỏ, nhưng điều đó là chưa đủ để chứng minh rằng biểu thức là đúng! Độ chính xác của mã không chỉ phụ thuộc vào loại loại của p, mà còn dựa trên giá trị của nó. Đây là trung tâm của sự không an toàn của C và C++.

Dưới đây là hai ví dụ để minh họa:

// Example #1 
void print_two(const char * fmt) 
{ 
    double d = 1.5; 
    unsigned int n = 111; 
    printf(fmt, d, n); 
} 

// Example #2 
unsigned int get_int(const char * p) 
{ 
    return *(unsigned int *)(p - 3); 
} 

Trong ví dụ # 1, tính chính xác của mã phụ thuộc vào thời gian chạy cung cấp giá trị của chuỗi được trỏ đến bởi fmt. Trong ví dụ # 2, chúng tôi có những điều sau đây:

unsigned int n = 5; 
double d = 1.5; 
const char * s = "Hello world"; 

get_int((char*)(&n) + 3); // Fine 
get_int((char*)(&d) + 3); // Undefined Behaviour! 
get_int(s + 5);   // Undefined Behaviour! 

Một lần nữa, chỉ cần nhìn vào mã của get_int(), chúng tôi không thể nói cho dù chương trình sẽ được chính xác hay không. Nó phụ thuộc vào cách chức năng được sử dụng.

Ngôn ngữ an toàn sẽ không cho phép bạn viết các chức năng như vậy.

4

Nếu bạn không sử dụng /unsafe, hoạt động hơi loại không an toàn duy nhất trong C# là soạn thảo - nhưng nó sẽ ném một ngoại lệ tại thời điểm bạn thực hiện diễn viên. Trong C++ reinterpret_cast et al có thể giúp bạn gặp nhiều rắc rối hơn như vi phạm truy cập tại dereference con trỏ thực tế.

0

Câu trả lời ngắn gọn là vì họ đã viết theo cách đó.

Cách thức đơn giản của nó là .net không cho phép các biến không định dạng và nó sẽ chỉ cho phép các thao tác được xác định cho loại được đề cập.

Để cụ thể hơn bạn cần phải đọc lên trong CTS (Type Hệ thống Common)

Đó là ngôn ngữ khác nhau, nhưng vẫn có giá trị

Trình biên dịch C là một đồng lõa.

Trình biên dịch Net là một cảnh sát .....