2012-02-23 35 views
37

Tôi thực sự nhầm lẫn với ý nghĩa thực sự của từ khóa tĩnh trong C#. Tôi đã đi qua các bài viết khác nhau trên internet nhưng không ai trong số họ thực sự giúp tôi hiểu ý nghĩa của nó và các nguồn khác không đáng tin cậy. Tôi biết Stack Overflow có một số tâm trí tuyệt vời có thể giúp tôi hiểu ý nghĩa thực sự của tĩnh nhưTừ khóa tĩnh trong C#

  • Khi chúng được khởi tạo.
  • tĩnh phương pháp, tài sản, lớp học và nhà thầu
  • tĩnh vs readonly vs liên tục
+6

http://www.codeproject.com/Articles/15269/Static-Keyword-Demystified – ken2k

+3

Đây có phải là một câu hỏi bài tập về nhà? –

+5

Bạn đã đọc tài liệu MSDN trên ['static'] (http://msdn.microsoft.com/en-us/library/98f28cdx.aspx) chưa? Bạn không hiểu gì – Oded

Trả lời

68

Nói tóm lại, tĩnh một cách hiệu quả có nghĩa là "kết hợp với một loại thay vì bất kỳ một thể hiện của loại". Vì vậy, có một đặt các biến tĩnh cho một loại (trong một AppDomain) cho dù bạn có 0 trường hợp hay một triệu; bạn không cần một cá thể để truy cập thành viên tĩnh, v.v.

chính xác điểm khởi tạo biến tĩnh phụ thuộc vào việc có một hàm dựng tĩnh hay không, nhưng rất rộng rãi là "một lần, thường là trước đây bất cứ điều gì đáng kể xảy ra trong lớp ". (Xem this blog post cho một mô tả chi tiết hơn.)

Trong khi readonly lĩnh vực có thể là tĩnh hoặc dụ (tức là liên quan đến các loại hoặc liên quan đến một thể hiện của các loại), const giá trị là luôn ngầm tĩnh (họ tái biên dịch hằng số thời gian, vì vậy nó sẽ không có ý nghĩa để có một bản sao cho mỗi ví dụ).

Đôi khi bạn có thể thấy static được mô tả là "chia sẻ giữa tất cả các trường của một loại" - Cá nhân tôi không thích rằng mô tả, vì nó cho thấy rằng phải có ít nhất một trường hợp ... trong khi trên thực tế, bạn don không cần bất kỳ trường hợp nào để sử dụng thành viên tĩnh. Tôi thích nghĩ về chúng hoàn toàn tách biệt hơn là "chia sẻ" giữa các trường hợp.

+6

làm thế nào gọn gàng và chi tiết :) upvote của tôi! –

+0

Cảm ơn :) điều này đã giúp tôi hiểu "tĩnh" – Karthik

+0

Liên kết tới bài đăng trên blog của bạn bị hỏng, theo bài đăng này http://stackoverflow.com/a/665696/1668069 chia sẻ appdomain heap, có đúng là lớp tĩnh luôn có 1 ví dụ trong heap mà họ chia sẻ trên appdomains, đó là sự thật? – Mathematics

11

tôi có thể giới thiệu bài viết này, có vẻ như khá mô tả: Static Keyword Demystified

Tôi cũng muốn giới thiệu một C# Lập trình bài viết Hướng dẫn chính thức trong đó bao gồm những ứng dụng khác nhau của từ khóa tĩnh. Bạn có thể đi từ đó vì có rất nhiều liên kết đến bài viết MSDN khác nhau .: Static Classes and Static Class Members (C# Programming Guide)

+0

@ Jan Kratochvil Tham chiếu tốt! – SIslam

6

Từ tài liệu:

Trường tĩnh initializers biến của một lớp tương ứng với một chuỗi các bài tập được thực thi theo thứ tự văn bản trong số mà chúng xuất hiện trong tuyên bố lớp học

Thành viên tĩnh được truy cập trực tiếp vào lớp đầu tiên và được thực thi theo thứ tự văn bản.

Static phương pháp, thuộc tính là một phần của lớp và không phải là trường hợp.

Static không liên quan gì đến readonly hoặc constant.Static là cách như thành viên được đánh dấu, readonlyconstant là cách như một thành viên được lưu trữ/quản lý.

8

Một chút về hằng số (const) và readonly:

  • không đổi hoặc const có thể thay đổi mà không thể được sửa đổi, và đó giá trị được biết đến tại thời gian biên dịch.
  • chỉ đọc rất giống với hằng số, điều này cũng không thể sửa đổi được, sự khác biệt là một trường chỉ đọc có thể được sửa đổi/khởi tạo một lần trong hàm tạo. Sau đó chỉ đọc là giống như hằng số.

Sử dụng ví dụ:

constant: 
const int a=10; // value cannot be modified, value is known at compile time 

Nhưng phải làm gì khi chúng ta muốn lĩnh vực liên tục whos giá trị không được biết đến tại thời gian biên dịch?

e.g const PersonClass a=new PersonClass("name"); // error 

Câu trả lời là một lĩnh vực readonly:

readonly: 
readonly PersonClass a=new PersonClass("name"); // all correct