2012-06-07 42 views
7

Trong C tôi có thể làmCó tương đương với tĩnh của C trong C# không?

void foo() { 
    static int c = 0; 
    printf("%d,", c); 
    C++; 
} 

foo(); 
foo(); 
foo(); 
foo(); 

nó nên in 0,1,2,3

Có tương đương trong C#?

+0

Nhưng tôi muốn làm chính xác cách thức ở trên mã C. Có thể? – Jack

+1

không, bạn không thể có biến tĩnh cục bộ trong C#. Có một biến lớp là gần như bạn có thể nhận được – shf301

Trả lời

3

Cái gì như:

class C 
{ 
    private static int c = 0; 
    public void foo() 
    { 
     Console.WriteLine(c); 
     c++; 
    } 
} 
+0

ooh đánh bại tôi để đấm .... –

+0

Chỉ "loại", 'c' hiển thị cho tất cả các phương thức. –

+0

@pst Tôi không nghĩ rằng có một cách để scoping biến tĩnh trong C# mà không sử dụng một mô hình bên trong/bên ngoài. –

2

Không có hình cầu trong C#, tuy nhiên, bạn có thể tạo trường tĩnh trong lớp của mình.

public class Foo{ 
    private static int c = 0; 
    void Bar(){ 
     Console.WriteLine(c++); 
    } 
} 
+0

Chỉ "loại", 'c' được hiển thị cho tất cả các phương pháp. –

+0

'WriteLine()' accpets 'object' kiểu dữ liệu. Bạn không cần phải chuyển đổi nó thành chuỗi. Chỉ làm: 'Console.WriteLine (C++);' –

+1

Tôi nghĩ "thành viên" hoặc "trường" là từ bạn đang tìm kiếm, không phải "hằng số", vì a) đây không phải là cố định, và b) đúng hằng số được khai báo với 'const' thay vì' static', như trong 'private static const int Zero = 0'. – Ruben

2

Bạn không thể làm điều đó ở một mức độ phương pháp. Gần nhất bạn có thể làm ở cấp độ phương pháp là một cái gì đó như thế này, và điều này không thực sự là gần gũi. Đặc biệt, nó chỉ hoạt động nếu bạn có một tham chiếu đến điều tra viên. Nếu người khác gọi phương thức này, họ sẽ không thấy thay đổi của bạn.

class Program { 
     static IEnumerable<int> Foo() { 
      int c = 0; 
      while (true) { 
       c++; 
       yield return c; 
      } 
     } 
     static void Main(string[] args) { 
      var x = Foo().GetEnumerator(); 
      Console.WriteLine(x.Current); //0    
      x.MoveNext(); 
      Console.WriteLine(x.Current); //1 
      x.MoveNext(); 
      Console.WriteLine(x.Current); //2 
      Console.ReadLine(); 
     } 
    } 

Điều thú vị là VB.NET hỗ trợ biến cục bộ tĩnh: http://weblogs.asp.net/psteele/pages/7717.aspx. Khi trang này lưu ý, bản thân .NET không hỗ trợ điều này, nhưng trình biên dịch VB.NET giả mạo nó bằng cách thêm một biến mức lớp tĩnh.

+1

Yikes! Cũng lưu ý rằng điều này không thực sự rất toàn cầu/tĩnh, vì bạn sẽ cần phải theo dõi các điều tra viên 'x' tất cả các thời gian. Một trường tĩnh gần hơn với một biến tĩnh trong C, ngoài tầm nhìn, mà là rộng hơn trong C# cho một trường tĩnh hơn cho một biến tĩnh trong C. – Ruben

+0

Tôi biết điều đó :). Tôi không biết toàn bộ lý do tại sao OP muốn làm một cái gì đó như thế này, vì vậy tôi bao gồm điều này chỉ là một cái gì đó mà anh * có thể * muốn xem xét. Tôi đoán tôi nên xóa trước khi tôi nhận được downvoted nhiều hơn nữa. :) – aquinas

+1

Nếu đi xuống con đường này tôi muốn sử dụng một đóng cửa "bình thường", nhưng một cách tiếp cận thú vị ... và vì điều này không nói "sử dụng một thành viên tĩnh", tốt, +1! –

3

Không không có cách nào để đạt được các hành vi tương tự như biến chức năng c tĩnh ...

3

Trong khi một số người đã đề nghị như staticviên biến, đây là không giống nhau do tầm nhìn. Là một thay thế đến câu trả lời của Aquinas, nếu măng xông được chấp nhận, thì đây có thể được thực hiện:

(Lưu ý rằng Foo là aa tài sản và không phải là một phương pháp c là "mỗi trường hợp ".)

class F { 
    public readonly Action Foo; 
    public F() { 
     int c = 0; // closured 
     Foo =() => { 
      Console.WriteLine(c); 
      c++; 
     }; 
    } 
} 

var f = new F(); 
f.Foo(); // 0 
f.Foo(); // 1 

Tuy nhiên, C# có không trực tiếp tương đương với một biến static trong C.

Mã hóa vui vẻ.

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