2012-03-08 74 views
8

Tôi đang cố gắng hiểu các cân nhắc thiết kế của nhóm đã tạo phương thức Environment.GetCommandLineArgs.Environment.GetCommandLineArgs - tại sao nó là một phương pháp? Tại sao không phải là tài sản?

Nó có thể là thuộc tính tĩnh, rất giống như System.Web.HttpContext.Current. Sau khi tất cả, giá trị trả về sẽ không thay đổi khi có sẵn. Vì vậy, nó giống như một tài sản của quá trình chạy hiện tại.

Tôi biết rằng bất kỳ thuộc tính nào trong .NET là đường cú pháp cho phương thức getter/setter. Nhưng đó là lý do chính xác để sử dụng một thuộc tính chứ không phải là một phương thức getter rõ ràng.

Hoặc có thể có điều gì đó tôi thiếu ở đây?

Bạn nghĩ sao?

+1

Nhóm BCL tôn trọng sự khác biệt ngữ nghĩa giữa các thuộc tính và phương pháp. Các thuộc tính chỉ được sử dụng khi lập trình viên có thể/nên xem xét một cuộc gọi đến chúng tương đương với việc truy cập một trường. Trong trường hợp này, 'GetCommandLineArgs' không hoạt động theo cách đó, vì vậy nó là một phương thức. Hãy suy nghĩ về nó như là lấy hoặc tính toán giá trị một lần nữa mỗi lần. –

Trả lời

4

Tôi nghi ngờ đó là vì nó tạo bản sao của mảng mỗi khi bạn gọi nó. Ví dụ: xem xét chương trình này:

using System; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     string[] argsCopy = Environment.GetCommandLineArgs(); 
     args[0] = "x"; 

     // 0 is the command in this case 
     argsCopy[1] = "y"; 

     string[] argsCopy2 = Environment.GetCommandLineArgs(); 
     Console.WriteLine(argsCopy2[1]); 
    } 
} 

Nếu bạn chạy điều này bằng "bản gốc thử nghiệm", nó vẫn sẽ in ra "gốc".

Vì vậy, khi bạn nói:

Sau khi tất cả, giá trị trả về không nên thay đổi một lần có sẵn.

Thực ra, nó sẽ trả về một giá trị khác (tham chiếu mảng mới) trên mọi cuộc gọi, chính xác vì mảng là luôn có thể tắt được.

+0

Hmmmm .. điểm tốt. Tôi đoán bạn nói đúng, nó phải là một bản sao ** của mảng ban đầu, do đó một mảng mới cho mỗi cuộc gọi. –

+0

Đó là lý do tại sao tôi nghĩ ['IReadOnlyList '] (http://msdn.microsoft.com/en-us/library/hh192385%28v=vs.110%29.aspx) nên có trong Khung một thời gian dài trước và sử dụng rất nhiều thay vì mảng. – svick

+0

@svick: Tuyệt đối - nhưng sẽ rất khó để làm điều đó trước khi Generics ... –

0

Từ sự hiểu biết của tôi, các phương pháp được sử dụng cho các hành động (làm điều gì đó). Vì vậy, gọi một phương thức sẽ có nghĩa là bạn sẽ trải qua một số phần lớn logic (ger), như một phép tính hoặc một cuộc gọi đến một kho lưu trữ cơ sở dữ liệu. Và các thuộc tính cơ bản chỉ để nhận hoặc thiết lập các biến. Nếu bạn muốn tên của một người bạn sẽ có một tài sản 'Tên' và gọi nó là người.Name và không person.Name(). Nhưng nếu bạn muốn tuổi của người đó và bạn chỉ có sinh con, bạn có thể có phương pháp GetAge() với logic cơ bản để tính tuổi. Có lẽ tôi hoàn toàn sai ở đây nhưng hiểu biết của tôi là các phương thức được sử dụng cho các khối mã và logic lớn hơn trong khi các thuộc tính được sử dụng để (nhiều hơn) chỉ đơn giản là thiết lập và nhận các giá trị.

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