Nếu một biến lớp học hoặc struct-type cho thấy một lĩnh vực giá trị gia loại, và loại giá trị cho thấy nội dung của nó như các lĩnh vực, hoạt động trên các lĩnh vực này có thể được thực hiện một cách hiệu quả như toán hạng vào loại biến xung quanh.NẾU kiểu giá trị được tiếp xúc như một tài sản, sau đó là tốt nhất người ta có thể làm thường là một cái gì đó như:
var temp = t.Location;
temp.X += 4;
t.Location = temp;
Không khủng khiếp tao nhã, nhưng tương đối rõ ràng và không quá khủng khiếp không hiệu quả. Một thay thế sẽ được để có bể phơi bày một phương pháp AdjustLocation
, một cái gì đó như:
delegate void ActByRef<T1>(ref T1 p1);
void ActOnLocation(ActByRef<Point> proc)
{ proc(ref _Location); }
và có lẽ cũng
delegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
void ActOnLocation<PT1>(ActByRef<Point, PT1>, ref PT1 param1)
{ proc(ref _Location, ref param1); }
Những phương pháp này giả định rằng Location
sở hữu sử dụng một lĩnh vực sao lưu tên _Location
. Mã sau đó có thể làm điều gì đó như:
// Add 5 to X
myTank.ActOnLocation((ref Point loc) => loc.X += 5);
hoặc
// Add YSpeed to Y
myTank.ActOnLocation((ref Point loc, ref int param) => loc.Y += param, ref YSpeed);
Lưu ý rằng trong trường hợp thứ hai, không phải YSpeed
, cũng không this
, cũng không phải bất kỳ biến địa phương khác, không được sử dụng trong lambda; thay vào đó, YSpeed
được chuyển thành thông số ref
. Do đó, ngay cả khi mã trên chạy hàng triệu lần, hệ thống sẽ chỉ phải tạo một đại biểu mà sau đó có thể được sử dụng lại mỗi lần.
Nếu cấu trúc lớn, phương pháp trên có thể nhanh hơn phương pháp sử dụng biến tạm thời. Trong khi chi phí có thể lớn hơn chi phí sao chép một cấu trúc nhỏ, chi phí trên không phụ thuộc vào kích thước cấu trúc. Người ta có thể sử dụng hiệu quả các cấu trúc có kích thước vài kilobyte nếu sử dụng các cấu trúc như trên để tránh phải tạo các bản sao tạm thời.
Tôi sẽ đề nghị 'Tank.Offset (int x, int y)' làm phương án thay thế và giữ hình chữ nhật của bạn riêng tư. Mã bù đắp của bạn sẽ thay đổi vị trí của xe tăng. – FlyingStreudel
Phong trào có vẻ giống như một cái gì đó bạn thực hiện trên xe tăng, do đó một phương pháp. Thay vì thay đổi vị trí tương đối bằng cách thao tác trực tiếp một thuộc tính/trường. – Marc
Tôi đồng ý với hai ý kiến trên. Nhưng nếu bạn _really_ muốn đi xung quanh nó mà không sử dụng các phương thức, bạn _could_ tạo các thuộc tính 'X' và' Y' riêng biệt, bản đồ xung quanh hình chữ nhật 'Vị trí 'chưa hoàn chỉnh, vì vậy bạn có' myTank.X + = 10'. –