Làm thế nào để gọi một đại diện cho Vứt bỏ () trên các đối tượng StringBuilder

Một cách sử dụng điển hình cho kiểu StringBuilder như sau:

    chương trình lớp học

{

chuỗi tĩnh UseStringBuilder ( chuỗi token)

{

StringBuilder sb = new StringBuilder ();

int i = 10;

trong khi (i–> 0)

{

sb.Append (token + ‘\ n’ );

}

kết quả chuỗi = sb.ToString ();

kết quả trả lại ;

}

 

static void Main ( string [] args)

{

Console .WriteLine (UseStringBuilder ( “đầu tiên” ));

Console .WriteLine (UseStringBuilder ( “thứ hai” ));

}

}

Vấn đề với mã này là khi sb đi ra khỏi phạm vi nó là đánh dấu cho bộ sưu tập rác, nhưng bộ nhớ lưu trữ trong nó vẫn còn cho đến khi bộ thu gom rác rò rỉ của nó finalizer. Đó có thể là số tiền rất nhiều bộ nhớ không sử dụng và do đó có thể chi phí cho bạn một số bộ sưu tập rác không cần thiết bởi CLR. Với hành vi này nó sẽ chỉ nhìn tự nhiên để gọi một cái gì đó như Vứt bỏ để chăm sóc bộ đệm bộ nhớ được sử dụng trong StringBuilder.

Thật không may không có phương pháp Dispose cho lớp này, hoặc bất kỳ phương pháp để gợi ý giải phóng bộ nhớ không sử dụng này một cách xác định. Thủ thuật để loại bỏ bộ nhớ này mà không cần gọi đến finalizer là đặt Chiều dài thành 0. Mã hiệu quả sẽ trở thành:

    chương trình lớp học

{

chuỗi tĩnh UseStringBuilder ( chuỗi token)

{

StringBuilder sb = new StringBuilder ();

int i = 10;

trong khi (i–> 0)

{

sb.Append (token + ‘\ n’ );

}

kết quả chuỗi = sb.ToString ();

sb.Length = 0;        / / Đây là Dispose tương đương

kết quả trả lại ;

}

 

static void Main ( string [] args)

{

Console .WriteLine (UseStringBuilder ( “đầu tiên” ));

// không cần phải gọi System.GC.Collect () cho đối tượng StringBuilder chưa được phản hồi

Console .WriteLine (UseStringBuilder ( “thứ hai” ));

}

}

thông qua Decebal Mihailescu

Cập nhật: sử dụng thủ thuật này một cách thận trọng. Không có gì đảm bảo rằng các hiện thực trong tương lai của thời gian chạy sẽ hoạt động như mô tả (chỉ được kiểm tra trên. NET 2.0, 3.0 và 3.5). Chỉ áp dụng nếu bạn đang làm việc với dây lớn và có vấn đề với bộ nhớ / hiệu suất. Nếu không, bạn sẽ chỉ phức tạp mã của bạn.
Cảm ơn Jeff Dean đã chỉ ra điều đó.

Leave a Reply

Your email address will not be published. Required fields are marked *