2011-11-15 24 views
7

Xin lỗi vì tính chất không được học hỏi của câu hỏi này. Nếu có một câu trả lời đơn giản, chỉ cần một liên kết đến một lời giải thích sẽ khiến tôi hạnh phúc hơn.Tại sao các phương pháp tĩnh cần được đưa vào lớp học?

Sau 6 tháng lập trình, tôi thấy các lớp tĩnh có phần hữu ích để lưu trữ các thường trình áp dụng cho nhiều lớp khác nhau. Dưới đây là một ví dụ đơn giản về cách tôi sử dụng lớp tĩnh, đó là một lớp cho phân tích văn bản vào những việc khác nhau

public static class TextProcessor 
{ 
    public static string[] GetWords(string sentence) 
    { 
     return sentence.Split(' '); 
    } 

    public static int CountLetters(string sentence) 
    { 
     return sentence.Length; 
    } 

    public static int CountWords(string sentence) 
    { 
     return GetWords(sentence).Length; 
    } 
} 

Và tôi sử dụng này theo những cách hiển nhiên như

class Program 
{ 
    static void Main(string[] args) 
    { 
     string mysentence = "hello there stackoverflow."; 
     Console.WriteLine("mysentence has {0} words in it, fascinating huh??", TextProcessor.CountWords(mysentence)); 

     Console.ReadLine(); 
    } 
} 

Câu hỏi của tôi là: Tại sao nó cần thiết để bọc các phương thức tĩnh này trong một lớp tĩnh? Dường như không phục vụ mục đích nào. Có cách nào tôi có thể có những phương pháp này trên của riêng mình không được bọc trong một lớp học? Tôi biết đóng gói là có lợi nhưng tôi không nhìn thấy việc sử dụng cho các phương pháp tĩnh bọc trong lớp tĩnh. Có điều gì đó tôi thiếu phong cách hay không? Tôi hoàn toàn sủa một cái cây ngớ ngẩn? Tôi có nghĩ quá nhiều không?

+0

Câu hỏi hay, nhưng tôi nghi ngờ nó chỉ là một nhàm chán "bởi vì Java đã làm nó." – Jacob

+0

Cuối cùng nó tóm tắt cách ngôn ngữ được thiết kế như thế nào. Tất cả các phương pháp phải ở trong một lớp học. Tại sao? Có lẽ vì mục đích nhất quán. –

+0

việc kiểm tra này [bài] [1] [1]: http://stackoverflow.com/questions/7933540/c-sharp-static-class-why-use – xgencoder

Trả lời

6

Trong C#, mọi phương thức phải được khai báo bên trong một lớp. Đó chỉ là cách ngôn ngữ được chỉ định.

Một lớp tĩnh thực sự là hơn akin to a module hơn một lớp, vì vậy tôi nghĩ rằng bạn quá nên có thể một trong hai:

  • định nghĩa một hàm bên ngoài một lớp hoặc;
  • nhập khẩu một module giống như cách bạn nhập một không gian tên (với using)

VB.NET, F # và Nemerle thực sự cho phép bạn khai báo các module và nhập chúng; những gì cho phép bạn sử dụng phương pháp của họ không đủ điều kiện.

Đây là Nemerle hợp lệ:

using System.Console; // import static methods in the Console class 
class Hello { 
    static Main() : void { 
    WriteLine("Hello, world!"); // unqualified access! 
    } 
} 

Ngoài ra, hãy nhìn vào extension methods, họ có thể cho phép bạn "giải quyết" này theo một cách khác. Các phương pháp trong số TextProcessor của bạn là beggingstring phương pháp mở rộng.

+1

Tuyệt vời, Nemerle vẻ thú vị. Mô-đun sẽ là tuyệt vời trong C#. –

-3

Phương thức tĩnh là một phương thức được gọi trong một cá thể đơn của lớp được tạo tại thời gian chạy.

1

Sẽ hơi khó xử khi có phương pháp chỉ lơ lửng trong một không gian tên ngẫu nhiên.

Tôi nghi ngờ câu trả lời là cung cấp "phạm vi". Chỉ vì một phương thức là tĩnh, không có nghĩa là nó không có phạm vi. Nó vẫn có thể truy cập các phương thức riêng tư tĩnh khác hoặc các biến thành viên - và lớp này cung cấp một "nhà" cho những thứ này để sống.

Các lớp tĩnh có thể được gọi lần đầu tiên một phương thức tĩnh được sử dụng, do đó, điều này cung cấp khả năng thiết lập nội dung khi cần thiết.

Thiết kế của tổ chức nhiều hơn bất kỳ điều gì do hạn chế về kỹ thuật.

+2

"Sẽ hơi khó xử khi có phương pháp chỉ lơ lửng trong một không gian tên ngẫu nhiên." - * Hầu hết * ngôn ngữ cho phép bạn làm điều đó. – jjnguy

+0

Hầu hết các ngôn ngữ hướng đối tượng? –

+0

Tôi thấy tôi thấy. Vì vậy, trong một ngôn ngữ "lai" như C++ bạn có thể có quyền truy cập vào các chức năng bên ngoài một lớp nhưng trong một ngôn ngữ OO cứng nhắc như C# bạn phải đóng gói mọi thứ bên trong một lớp? .. có ý nghĩa. Làm cho rất nhiều mã boilerplate hơn là cần thiết tôi nghĩ. –

-1

đã có nhiều chủ đề về chủ đề này có đủ thông tin ...bạn có thể tìm thấy một số here..

2

This post by eric lippert đưa ra một giải thích khá chi tiết. Tôi không chắc chắn nếu anh chàng này "eric" biết những gì anh ta nói về hay không ;-)

+0

lol. Cảm ơn. Có, tôi chắc chắn Eric là một dunce ^^ –

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