2011-11-18 28 views
6

Vì .NET không sử dụng kiểu C null s để kết thúc chuỗi, làm cách nào để giữ chuỗi được phân bổ nhưng thay đổi độ dài của chuỗi bằng cách sử dụng mã không an toàn?Mã không an toàn để thay đổi độ dài (do đột biến!) Của đối tượng String?

Khi tôi hiểu .NET sử dụng tiêu đề 20 byte cho mỗi chuỗi, có lẽ đây là nơi độ dài của chuỗi được lưu trữ, có cách nào để sửa đổi trực tiếp độ dài này không? Vì vậy, NET sẽ giữ cho chuỗi trong bộ nhớ nhưng khi tôi gọi .Length nó sẽ trả lại .Length Tôi muốn.

nếu điều này là có thể, cũng sẽ rất thú vị khi nghe tất cả các khả năng tác dụng phụ điên này

CẬP NHẬT

Tôi đang cố gắng thực hiện điều này mà không sử dụng phản ánh.

+2

Lưu ý rằng Net chuỗi là null-chấm dứt. – SLaks

+1

Bạn cần làm gì để làm điều đó? – Jacob

+0

@jacob một số thử nghiệm ác về quản lý bộ nhớ :) Cố gắng phân bổ một phần lớn bộ nhớ và tái sử dụng nó liên tục mà không cần tránh sự phân mảnh LOH. –

Trả lời

4

Từ Strings UNDOCUMENTED

public static unsafe void SetLength(string s, int length) 
{ 
    fixed(char *p = s) 
    { 
     int *pi = (int *)p; 
     if (length<0 || length > pi[-2]) 
      throw(new ArgumentOutOfRangeException("length")); 
     pi[-1] = length; 
     p[length] = '\0'; 
    } 
} 
+2

Lưu ý rằng lớp chuỗi đã thay đổi đáng kể trong .Net 4; nó bây giờ chỉ có hai trường. – SLaks

+0

Wow, chính xác những gì tôi đang tìm kiếm, tôi sẽ kiểm tra điều này ngay bây giờ –

+0

Có bài viết nào xung quanh bản cập nhật .NET 4.0 liên quan đến cập nhật 'System.String' không? –

0

Bạn có thể sử dụng Phản chiếu để đặt trường m_StringLength.

+0

Xin lỗi quên nói rằng tôi đang cố gắng để mã này không an toàn trực tiếp và không phải với sự phản ánh, cập nhật các câu hỏi. –

Các vấn đề liên quan