thể trùng lặp:
C# parameters by reference and .net garbage collectionphần tử mảng Đi qua bởi ref
Tôi đã nghĩ đến việc sử dụng đối số ref để hạn chế kiểm tra giới hạn của một mảng. Ví dụ mã của trao đổi hai yếu tố là:
class Test {
int[] array;
private void qSort() {
...blah...
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
}
trong đó có 4 quyền truy cập vào các mảng thay thế sẽ là:
class Test {
int[] array;
private void qSort() {
...blah...
Swap(ref array[a], ref array[b]);
}
static void Swap(ref int a,ref int b) {
int temp = a;
a=b;
GC.Collect(); // suppose this happens
b=temp;
}
}
mà về mặt lý thuyết chỉ có 2 truy cập vào các mảng
Điều làm tôi bối rối là tôi không biết chính xác điều gì xảy ra khi tôi chuyển một phần tử mảng bằng ref. Nếu Garbage Collector khởi động, trong khi thực thi mã trong hàm Swap, sẽ có thể di chuyển mảng? hoặc mảng được ghim trong suốt thời gian của cuộc gọi?
Hãy nhớ rằng mã trên là một trường hợp thử nghiệm đơn giản. Tôi muốn sử dụng nó trong các tình huống phức tạp hơn nhiều
Edit: Theo BrokenGlass chỉ ra, điều này được trả lời bởi Eric Lippert đây C# parameters by reference and .net garbage collection
Mảng sẽ không được ghim và GCollector thể di chuyển nó và sẽ cập nhật accordinly ref nào đến một phần tử của nó, mà nằm trên stack
Đừng cố gắng tối ưu hóa sớm, * đặc biệt là * nếu bạn không có kiến thức sâu về cách thức hoạt động của máy móc. Trường hợp tại điểm: phiên bản thứ hai của bạn (với 'ref') sẽ thực sự * nhiều * chậm hơn lần đầu tiên do boxing (thử nó trong vòng lặp và xem). – Jon
@ Jon, tôi đồng ý rằng có lẽ không có điểm trong việc này vì lý do hiệu suất, nhưng nó cải thiện khả năng đọc ... Và BTW, không có boxing trong trường hợp đó –
Panos, thêm GC.Collect() để nhấn mạnh điểm , quay lại nếu bạn không thích. –