2009-06-24 22 views
10

Xin lỗi vì những gì có lẽ là một câu hỏi ngớ ngẩn nhưng nó bugging tôi ...Tại sao không phải là các phương thức Array được xây dựng thành một cá thể Array?

int[] i = {3, 2, 1}; 
//why 
Array.Sort(i); 
//instead of 
i.Sort(); 

char c = 'c'; 
//why 
char.IsLetter(c); 
//instead of 
c.Isletter(); 
+1

Wow, rất nhiều câu trả lời sai. – VVS

+2

Bạn đã nhận đúng? Đăng nó. –

+2

Câu hỏi này khá giống với http://stackoverflow.com/questions/389257/why-is-dotnets-char-islower-a-static-method. –

Trả lời

4

Cảm ơn Pedro d'Aquino đã xác định các câu hỏi khác cung cấp câu trả lời.

Điểm cơ bản là các phương thức thể hiện trên cấu trúc không phải là an toàn luồng nhưng phương pháp tĩnh là.

Xem những câu hỏi này:

+1

Cộng đồng wiki'd vì đây không phải là công việc của riêng tôi. –

1

Bạn có thể làm điều đó cho chính mình nếu bạn sử dụng .NET 3.0, sử dụng phương pháp khuyến nông:

public static class Extensions 
{ 
public static bool IsLetter(this chr) 
{ 
return char.IsLetter(chr); 
} 
} 

sau đó gọi nó giống như: c.IsLetter()

Hoặc làm theo cách bạn muốn. Cùng một lúc phân loại

1

Đó là một quyết định triển khai. Tôi không biết tất cả những gì đang diễn ra trong đầu của các nhà thiết kế khuôn khổ, nhưng tôi tin rằng một lý do là cho phép sắp xếp các loại tùy chỉnh với nỗ lực ít nhất.

Bất kỳ lớp nào triển khai iComparable đều có thể được đưa vào mảng và sắp xếp. Nếu nó là một phương thức của mảng, thì tôi sẽ phải viết một kiểu mảng mới cho kiểu tùy chỉnh của tôi.

Ngoài ra, như những người khác đã lưu ý, các kiểu nguyên thủy yêu cầu thiết kế này của một mảng.

+0

Tôi không đồng ý với lý do của bạn nếu Phân loại là một phương pháp thể hiện. Nó vẫn có thể làm việc theo cách mà phương thức tĩnh thực hiện, mà không cần phải viết một kiểu mảng tùy chỉnh. –

+0

loại cho mỗi đối tượng phụ mà phương pháp thể hiện đó sẽ sử dụng? –

+0

@Jeff Yates, nhưng nếu bạn muốn thay đổi việc thực hiện sắp xếp, bạn KHÔNG cần cahange lớp Array, nhưng bạn có thể thêm phương thức tĩnh vào bất cứ nơi nào khác. Nhưng vì khả năng LINQ trong các ngôn ngữ .net, có các phương thức mở rộng, trông giống như các phương thức mẫu, nhưng là các phương thức tĩnh. Tôi nghĩ là nó khá thỏa hiệp. – TcKs

2

Đây là các tiện ích tiện ích không cần phải thuộc các lớp này. Điều này củng cố Single Responsibility Principle

(chỉnh sửa) Tôi đã bối rối với Java

(About static members):

thành viên lớp tĩnh có thể được sử dụng để dữ liệu riêng biệt và hành vi đó là không phụ thuộc vào bất kỳ đối tượng danh tính: dữ liệu và chức năng không thay đổi bất kể điều gì xảy ra với đối tượng . Các lớp tĩnh có thể được sử dụng khi không có dữ liệu hoặc hành vi trong lớp phụ thuộc vào đối tượng danh tính.

thread-safe point of view cũng là một lý do chính đáng.

+0

Cảm ơn - dường như với tôi một mảng có thể tự sắp xếp - nếu tôi muốn viết mã trong C++ tôi sẽ :) – paul

+0

@bruno tốt, nhưng "isLetter" phụ thuộc vào nhận dạng của đối tượng, phải không? Ý tôi là, 'A'.isLetter() chắc chắn khác với' 4'.isLetter(). –

+0

@Pedro, tại đây, "dữ liệu và chức năng không thay đổi bất kể điều gì xảy ra với đối tượng". Đối với "c.isLetter()" tồn tại, nó sẽ phải lưu một giá trị bool phụ trong cấu trúc char. Việc thực hiện sẽ khác ... –

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