2010-07-13 38 views
7

Cách tôi hiểu, có biến thành viên được khai báo là static trong một lớp không tĩnh khiến biến thành viên trở thành duy nhất không có vấn đề số lượng phiên bản của lớp đó.điểm khai báo phương thức tĩnh trong lớp không tĩnh là gì?

Bây giờ, điều gì xảy ra với phương pháp tĩnh được khai báo trong lớp không tĩnh? Và (Quan trọng nhất là), điểm nào khai báo một phương thức tĩnh trong một lớp không tĩnh?

Cảm ơn bạn đã trợ giúp

+3

Tôi sẽ không sử dụng từ 'duy nhất' ở đây. Nó là _shared_ giữa tất cả các trường hợp. –

+0

@ Henk Holterman: cảm ơn vì đã sửa tôi. – Richard77

Trả lời

4

Phương thức lớp chỉ hoạt động với các tham số của nó, không gọi bất kỳ phương thức thể hiện nào và không hoạt động với bất kỳ thành viên thể hiện nào, có thể được khai báo là tĩnh. Trên thực tế, nó phải được khai báo là tĩnh, cho hiệu suất tốt hơn, vì phương thức tĩnh không yêu cầu con trỏ "this".

Hãy xem xét chức năng nhỏ thuộc về lớp học, thực hiện một số phép tính với các tham số của nó và trả về giá trị được tính toán. Hàm này phải tĩnh.

+1

Tôi muốn đánh giá kiểm tra độ chính xác tĩnh cao hơn hiệu suất. Bằng cách khai báo một phương thức tĩnh, bạn cho trình biên dịch biết rằng nó không thể sử dụng bất kỳ thông tin cụ thể nào cho các cá thể cụ thể, do đó, nó sẽ ném lỗi hoặc cảnh báo khi lập trình cố gắng thực hiện điều đó, ví dụ: cố gắng gọi nó như là một phương pháp thể hiện. – reinierpost

21

Nếu phương pháp có liên quan đến loại nhưng không phải trường hợp thì có thể là tĩnh.

DateTime.ParseInt32.Parse là các ví dụ.

+10

Và có một hướng dẫn rằng "nếu nó có thể tĩnh hơn làm cho nó tĩnh". –

+2

Liên quan đến bình luận của Henk Holterman: http://stackoverflow.com/questions/790281 –

2

Ví dụ: bạn có một lớp ví dụ: Bank_Account mà bạn muốn tính số đối tượng được tạo cho lớp đó.
Vì vậy, bạn có một trường tĩnh là count. Sau đó, khi bạn khởi tạo bất kỳ đối tượng nào của lớp Bank_Account thì bạn cần tăng trường lưu trữ số đối tượng được tạo cho lớp này, phương thức tăng biến tĩnh này là tĩnh vì nó giống nhau cho tất cả các đối tượng được tạo cho lớp này.

+0

Tại sao câu trả lời này bị bỏ qua ??? :-(Nó cũng nói câu trả lời của 'ck' là gì nhưng nó là ví dụ của phương pháp như vậy !! – Himadri

+1

Tôi không hiểu một downvote hoặc là: có vẻ với tôi đây là một điểm quan trọng.Nếu bạn có dữ liệu về tất cả các cá thể hoặc bất kỳ cá thể nào, thay vì về một cá thể cụ thể, thì nó phải là tĩnh. Ví dụ, hôm qua tôi đã tạo một lớp mà tôi cần gán mỗi cá thể một id duy nhất. – Jay

1

ck cho biết, đây có thể là phương pháp liên quan đến loại. Điều quan trọng cần nhớ là đây sẽ là một hàm tiện ích, sẽ không thể truy cập vào bất kỳ biến thành viên nào trong kiểu/lớp, vì nó có thể được gọi trực tiếp mà không có bất kỳ cá thể nào của lớp. Nếu bạn cố gắng định nghĩa một phương thức tĩnh để truy cập một biến thành viên (hoặc phương thức không tĩnh), bạn sẽ thực sự gặp lỗi trình biên dịch.

5

Thật hữu ích khi tạo các phương thức gốc không phải là thành viên của bất kỳ đối tượng nào nhưng cần truy cập vào nội bộ của đối tượng để khởi tạo nó.

5

Bạn cần phương pháp tĩnh trong các lớp không tĩnh f.e. đối với mẫu nhà máy (nếu lớp là nhà máy cho chính nó, như được chỉ ra bởi Jaco Pretorius):

MyClass newInstance = MyClass.Create(); 

Hoặc nếu bạn muốn tạo phương pháp trợ giúp. F.e. bạn có thể viết một FTP-Class được hoàn toàn làm việc, với Connect(), SendCommand(), ReceiveAnswer(), Disconnect() vv, nhưng bạn muốn cho phép người dùng dễ dàng tải lên một tập tin, mà không cần phải thực hiện toàn bộ thủ tục:

MyFTPClass.UploadFile("username", "password", "pathToFile"); 
+1

Tôi là người giả tạo - câu đầu tiên của bạn chỉ đúng nếu lớp đó là một nhà máy, khi tôi sử dụng mẫu nhà máy, tôi thường tạo ra các lớp nhà máy riêng biệt, vì nó làm cho việc kiểm thử dễ dàng hơn một chút. –

3

Sẽ không thể triển khai mẫu Singleton mà không thể khai báo một phương thức tĩnh (và biến thành viên riêng) trên một lớp không tĩnh.

Xem Singleton

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