2011-12-14 22 views
11

Đó là, trong C, chúng ta có thể định nghĩa một hàm như:Liệu có tồn tại một từ khóa trong C# có thể làm cho các biến cục bộ tồn tại trên nhiều cuộc gọi không?

func(){ 
    static int foo = 1; 
    foo++; 
    return foo; 
} 

và nó sẽ trở lại một số cao hơn mỗi khi nó được gọi. Có từ khóa tương đương trong C# không?

+0

C được phát minh khi đề không tồn tại được nêu ra. Vì vậy, là Visual Basic, họ đã phải thực hiện nó trong vb.net. Số lượng mã nó cần để tạo ra để làm cho nó thread và ngoại lệ an toàn là khá lớn. –

+0

Câu hỏi rất hay –

Trả lời

17

Không, không có gì trong C#. Tất cả trạng thái mà bạn muốn tồn tại trên nhiều cuộc gọi phương thức phải nằm trong các trường, ví dụ hoặc tĩnh.

Ngoại trừ ... nếu bạn nắm bắt biến trong biểu thức lambda hoặc đại loại như thế. Ví dụ:

public Func<int> GetCounter() 
{ 
    int count = 0; 

    return() => count++; 
} 

Bây giờ bạn có thể sử dụng:

Func<int> counter = GetCounter(); 
Console.WriteLine(counter()); // Prints 0 
Console.WriteLine(counter()); // Prints 1 
Console.WriteLine(counter()); // Prints 2 
Console.WriteLine(counter()); // Prints 3 

Bây giờ tất nhiên bạn chỉ gọi GetCounter() một lần, nhưng mà "biến địa phương" chắc chắn là sống trên cũng vượt ra ngoài đời bạn có thể có dự kiến ​​...

Điều đó có thể hoặc không thể sử dụng cho bạn - điều đó phụ thuộc vào những gì bạn đang làm. Nhưng hầu hết thời gian nó thực sự có ý nghĩa đối với một đối tượng để có trạng thái của nó trong các lĩnh vực bình thường.

+1

Có sử dụng một đóng để mô phỏng một biến cục bộ tĩnh tạo thành mã độc không? – sq33G

+0

@ sq33G: Nó phụ thuộc vào chính xác cách bạn đang sử dụng nó, tôi nghĩ ... –

1

Bạn sẽ phải tạo một biến thành viên tĩnh hoặc thể hiện của lớp phương pháp này là trong.

0
public class Foo 
{ 
    static int _bar = 1; 

    public int Bar() 
    { 
     return ++_bar; 
    } 
} 
Các vấn đề liên quan