2011-08-22 29 views
6

Tôi đã trải qua mã nguồn cho Array.cs khi tôi đọc rằng Array.Copy() không đảm bảo rằng một bản sao sẽ thành công và không còn có thể làm hỏng bản gốc (Sửa lỗi nếu tôi sai ở đây). Để tạo sự an tâm, ConstrainedCopy() dường như cũng đạt được như vậy.Array.Copy and Array.ConstrainedCopy - C#

Câu hỏi của tôi là:
1> Tại sao mọi người sử dụng Array.Copy() nếu dường như không đảm bảo chuyển dữ liệu thành công và có thể làm tổn thương bản gốc? Infact, tất cả các lớp sưu tập dường như sử dụng Array.Copy() để tăng kích thước cá thể của chúng. Tại sao không sử dụng ConstrainedCopy() tại đây

2> Chi phí sử dụng ConstrainedCopy() là bao nhiêu? Tôi giả định rằng sẽ có nhiều logic hơn được thêm vào ConstrainedCopy()?

Trả lời

4

ConstraintedCopy() không đảm bảo thành công. Dòng đầu tiên của MSDN Documents nêu rõ:

Sao chép một loạt các phần tử từ một mảng bắt đầu từ chỉ mục nguồn đã chỉ định và dán chúng vào một mảng khác bắt đầu từ chỉ mục đích được chỉ định. Đảm bảo rằng tất cả các thay đổi được hoàn tác nếu bản sao không thành công hoàn toàn.

Cụ thể hơn dòng thứ hai:

bảo lãnh rằng tất cả các thay đổi được hoàn tác nếu bản sao không thành công hoàn toàn.

Một ngoại lệ vẫn có thể bị ném trong trường hợp rất khắc nghiệt.Tuy nhiên, những trường hợp này là ngoại lệ và bạn không cần phải lo lắng về chúng trong hầu hết các trường hợp.

Tóm lại, chỉ cần gắn với Array.Copy().

+1

Bạn có thể giải thích những trường hợp cực đoan nào có thể gây ra ngoại lệ không? Nếu không, chúng tôi sẽ không biết liệu kịch bản của chúng tôi có phải là nơi chúng tôi cần phải lo lắng hay không. – Gabe

+0

Touche, điều gì đó giống như hết hạn bộ nhớ có thể gây ra sự thất bại của bản sao, hầu hết các trường hợp này nằm ngoài phạm vi của phương pháp sao chép và thường là dấu hiệu của một vấn đề lớn hơn. – BentOnCoding

+3

Hầu hết các ngoại lệ có thể được ném từ phương thức 'Sao chép' đều xảy ra trước khi bắt đầu sao chép, vì vậy bạn không cần' ConstrainedCopy' để lưu bạn khỏi một chỉ mục nằm ngoài phạm vi hoặc không khớp. Các ngoại lệ duy nhất có thể tôi có thể nghĩ rằng điều đó có thể xảy ra giữa bản sao là 'InvalidCastException' và' ThreadAbortException'. – Gabe

15
Object[] objArray = { "Anakin", "Skywalker", 666 }; 
String[] stringArray = new String[3]; 
  1. Array.Copy(objArray, stringArray , 3);

    này ném một ngoại lệ cast không hợp lệ. Ngay cả sau khi ngoại lệ được ném (nếu bạn nuốt nó), hai phần tử đầu tiên của objArray được sao chép vào stringArray.

  2. Array.ConstrainedCopy(objArray, 0, stringArray, 0, 3);

    này ném một System.ArrayTypeMismatchException và sẽ không sao chép bất kỳ yếu tố để các mảng đích (stringArray).