2013-05-23 23 views
16

Tôi đoán đây là một câu hỏi về thiết kế khung. Gần đây tôi đã tự hỏi tại sao hầu hết các phương thức trong System.Array là tĩnh. Phản ứng ruột của tôi luôn luôn là sử dụng ví dụ: IndexOf (đối tượng) trên cá thể Array, không phải là System.Array.IndexOf (mảng, đối tượng). Có một nguyên tắc chính đằng sau quyết định, cho dù để thực hiện một phương pháp tĩnh hay không?Tại sao hầu hết các phương pháp của System.Array là tĩnh?

Tôi tìm thấy câu hỏi này: When is it best to use Static Functions in ASP.NET

Nhưng nó đã không đáp ứng với tôi: -/

+2

(Tôi đã xóa thẻ ASP.NET, vì thiết kế của 'Array' không liên quan đến ASP.NET) –

+0

Tôi sẽ quy định hầu hết trong số chúng là tĩnh vì chúng chỉ dành cho mảng và phương pháp mở rộng phát minh vào thời điểm đó. – Romoku

+1

@Romoku chúng vẫn có thể là các phương pháp thể hiện, mặc dù –

Trả lời

1

Thời gian nhất mà bạn có kế thừa của System.Array đang sử dụng một mảng không gian duy nhất. như:

int[] a1 = new int[2]; 

Khi bạn xác định int[] này mặc nhiên có nguồn gốc từ System.Array loại như @Sergey Rybalkin nói. Trong trường hợp này, phương thức IndexOf chắc chắn sẽ được thực hiện tốt nhất như một phương thức thể hiện chứ không phải là phương thức tĩnh.

Nhưng có một loại khác được kế thừa từ System.Array như mảng nhiều chiều. Trong trường hợp này (đa chiều), phương thức IndexOf không có ý nghĩa.

thử nghiệm này:

int[,] arr = new int[2, 2]; 

arr[0, 0] = 3; arr[1, 0] = 4; 
arr[0, 1] = 5; arr[1, 1] = 6; 

Array.IndexOf(arr, 4); 

cuối cùng giống như ném một RankException với thông điệp "Only single dimension arrays are supported here."

Có lẽ, và có lẽ hầu hết, vì lý do đó phương pháp này được thực hiện như tĩnh.

...

Về nhận xét Is there a main principle behind the decision, whether to make a method static or not?

Có, và nguyên tắc là khá đơn giản. Phương thức instance thể hiện một hành động hoặc hành vi của một đối tượng. Phương thức tĩnh là một hàm của hệ thống có liên quan đến logic với lớp, hoặc trong một số trường hợp một phương thức mà bạn muốn gọi mà không cần tạo một cá thể của lớp.

Hãy suy nghĩ trong các lớp System.Math làm thế nào lộn xộn sẽ là nếu bạn cần toán học mỗi khi bạn muốn gọi một phương thức như Sqrt hoặc Pow?

Ví dụ cuối cùng tôi sẽ cung cấp cho bạn là lớp System.Text.RegularExpressions.Regex. Lớp này có phương thức Match được triển khai dưới dạng ví dụ và quá tải được thực hiện dưới dạng tĩnh.

Mỗi loại được sử dụng trong ngữ cảnh khác nhau. Ví dụ được sử dụng khi bạn sử dụng cùng một mẫu nhiều lần. Tĩnh khi bạn sử dụng mẫu một thời gian duy nhất trong mã của bạn.

+4

"Nếu câu trả lời là khai sáng xin đánh dấu ..."? :-P Không có .. Đánh dấu là câu trả lời đúng * nếu đây là câu trả lời đúng *. – Patrick

+0

Tôi không nghĩ rằng các ví dụ bổ sung của bạn khá phù hợp. Sẽ không có điểm trong việc tạo ra các hàm như các phương thức 'Sqrt' hoặc' Pow' của 'System.Math' vì các hàm đó * không yêu cầu một cá thể' System.Math' *. Mặt khác, làm cho chúng thể hiện các phương thức của các kiểu số khác nhau, chẳng hạn như 'double', vv sẽ có thể hiểu được. Đối với các biểu thức chính quy, phương thức tĩnh không * thực hiện tốt hơn * cho các lời gọi IMO độc đáo; nó chỉ giúp rút ngắn mã. –

+0

@O. R. Mapper bạn phương pháp thể hiện đúng thực hiện tốt hơn. Tôi đã chỉnh sửa văn bản. –

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