2009-05-08 34 views
13

Trong C#, có cách nào để đặt biến tĩnh trong một phương thức như VB.Net không?Biến tĩnh trong C#

Static myCollection As Collection 

Trả lời

20

Tại sao C# không hỗ trợ phương thức tĩnh biến?

Hỏi: Trong C++, có thể viết biến số phương thức tĩnh và có biến số chỉ có thể truy cập từ bên trong phương thức. C# không cung cấp tính năng này. Tại sao?

A: Có hai lý do C# không có tính năng này.

Thứ nhất, nó có thể để có được gần tác dụng tương tự bằng việc có một lớp cấp tĩnh, và thêm phương pháp tĩnh học sẽ yêu cầu tăng phức tạp.

Thứ hai, tĩnh học cấp độ phương pháp là hơi khét tiếng gây ra vấn đề khi mã được gọi là lặp đi lặp lại hoặc từ nhiều chủ đề, và kể từ khi định nghĩa là trong phương pháp, đó là khó khăn hơn để tìm ra định nghĩa.

- msdn c# faq

+3

> "khét tiếng gây ra vấn đề khi mã được gọi là nhiều lần hoặc từ nhiều chủ đề" - Hài hước, bởi vì việc thực hiện VB.Net được coi là thread-an toàn. –

+11

An toàn chủ đề và thực hiện những gì bạn mong đợi là hai điều khác nhau ... –

+2

Làm cách nào để nhận được Kiểm tra là câu trả lời hay nhất. Câu trả lời đơn giản là KHÔNG. Người ta nói, nhưng vẫn là không. Câu trả lời được cung cấp ở đây là một trích dẫn từ Eric Gunnerson là cảnh báo của Mircosoft. Nó rất hữu ích đơn giản như vậy. BTW, Java đã có khả năng này từ ít nhất 1.2 và C++ miễn là tôi có thể nhớ. Bạn sẽ nghĩ rằng một ngôn ngữ trộn lẫn C++, Java và VB sẽ hỗ trợ cho những thứ mà cả ba đều có điểm chung.Nếu ba ngôn ngữ hỗ trợ điều này phải có một lý do chính đáng, và bỏ nó với hai lý do đó là què và họ rõ ràng đang che giấu điều gì đó. –

3

Điều gần nhất với VB.NET Static là tạo trường trong loại hiện tại. Khác với C# không có tương đương.

1

Không, CLR không hỗ trợ điều này, và VB.NET nghỉ tới các thủ thuật biên dịch để cho phép nó. Ugh.

+3

Nếu bạn không thích thủ thuật trình biên dịch, bạn có sử dụng từ khóa "lợi nhuận" trong C# không? –

+0

Làm thế nào nó là một thủ thuật biên dịch? Nó chỉ là một biến thành viên có khả năng hiển thị giảm. –

+0

Tôi cũng không bao giờ sử dụng lợi nhuận. Tôi muốn phương pháp biến tĩnh mặc dù – rotard

4

Không có không nhưng làm thế nào là khác nhau này sau đó có một biến tĩnh ở cấp lớp học?

Actually if you look cách chia sẻ được triển khai, đây là mẹo lừa biên dịch tạo ra trường tĩnh trên lớp.

+1

Đúng, nó giống y như ở cấp lớp. Nó chỉ được phép khai báo ở mức phương thức bởi vì từ khóa tĩnh của VB cũ có nghĩa là giá trị của một địa phương sẽ vẫn tồn tại sau hàm trả về của hàm/sub. – x0n

+0

Nó khác biệt vì "trình biên dịch lừa" của VB cũng sử dụng lớp giám sát để đảm bảo luồng của nó an toàn, và vì nó được đưa vào phương thức để truy cập ở nơi khác sẽ thất bại (ngữ nghĩa tốt hơn). –

+0

Chỉ phạm vi của nó vì tên phương thức được sử dụng để đặt tên biến. Và tôi sẽ giả sử nếu bạn muốn nó threadsafe trong C# bạn cũng muốn thực hiện một màn hình. Tôi muốn thấy C# thực hiện một chủ đề an toàn tĩnh mà kết thúc tốt đẹp truy cập vào biến như họ làm trong VB, nhưng không phải lo lắng về phạm vi một phương pháp. – JoshBerke

-5

Tôi khá chắc chắn rằng C# tương đương là const: do đó:

 
public const Collection myCollection = new Collection(); 

Tôi không quá quen thuộc với VB.NET, vì vậy tôi có thể tắt cơ sở, nhưng điều đó sẽ cho phép bạn thiết lập một biến không thể thay đổi.

+1

biến tĩnh không phải là hằng số. Một biến tĩnh là một biến mà mỗi cá thể của lớp chia sẻ cùng một cá thể biến. Biến này có thể thay đổi và thay đổi giá trị trong một lớp sẽ thay đổi giá trị trong tất cả các phiên bản khác của lớp đó. – NerdFury

+0

Chỉnh sửa nhẹ. Một biến tĩnh trong C# được chia sẻ. Trong VB, biến tĩnh chỉ được chia sẻ nếu hàm chứa được chia sẻ. –