2008-10-01 40 views
6

Trong VB.Net, tôi có thể khai báo một biến trong một hàm như tĩnh, như thế này:C chức năng # với dữ liệu tĩnh

Function EncodeForXml(ByVal data As String) As String 
    Static badAmpersand As Regex = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)") 

    data = badAmpersand.Replace(data, "&") 

    ''// more processing 

    return data 
End Function 

Lưu ý rằng tôi cần phải sử dụng từ khóa Static, chứ không phải là Shared, đó là cách bình thường để thể hiện điều này trong VB.Net. Làm thế nào tôi có thể làm điều này trong C#? Tôi không thể tìm thấy nó tương đương.

Trả lời

13

Ha! Khi đăng câu hỏi, tôi đã tìm thấy câu trả lời! Thay vì googling cho C# tôi nên có được tìm kiếm chi tiết về cách VB.Net thực hiện nó, và gõ lên câu hỏi được thực hiện rõ ràng với tôi. Sau khi áp dụng cái nhìn sâu sắc rằng, tôi thấy điều này:
http://weblogs.asp.net/psteele/articles/7717.aspx

Điều đó giải thích rằng nó không thực sự hỗ trợ bởi CLR, và trình biên dịch VB tạo ra một tĩnh (chia sẻ) biến "under the hood" trong lớp học của phương pháp. Để làm điều tương tự trong C#, tôi phải tự tạo biến.

Hơn thế nữa, nó sử dụng lớp Monitor để đảm bảo rằng thành viên tĩnh cũng an toàn với luồng. Tốt đẹp.

Lưu ý: Tôi sẽ sớm thấy điều này trong C#. Chiến thuật chung tôi đã quan sát thấy từ MS là nó không giống như VB.Net và C# để có được quá xa nhau tính năng khôn ngoan. Nếu một ngôn ngữ có một tính năng không được hỗ trợ bởi một ngôn ngữ khác, nó có xu hướng trở thành ưu tiên cho nhóm ngôn ngữ cho phiên bản tiếp theo.

+0

Và để suy nghĩ, tôi sẽ dắt blog của riêng tôi (mà tôi đề cập đến điều này một vài tháng trước đây) ... Nhưng bạn đã lưu tôi gặp rắc rối, và mục nhập đó rõ ràng hơn rất nhiều so với bản thân tôi. Cảm ơn các liên kết! –

+0

Bạn cũng có thể kiểm tra mã IL/C# được tạo ra từ VB bằng cách sử dụng phản xạ, tôi nhận thấy rằng đôi khi trước đây. Nó cũng rất thú vị để xem những gì một số thủ thuật VB có thể thực hiện trong C# – faulty

4

Không có sự tương đương nào trong C#.

Bạn sẽ cần sử dụng biến cấp lớp.

Đây là một trong số ít những điều mà VB có mà tôi muốn C# có.

6

Cá nhân tôi rất vui vì C# không có điều này. Về mặt logic, các phương thức không có trạng thái: các kiểu và các cá thể làm. C# làm cho mô hình logic đó rõ ràng hơn, IMO.

+0

Đồng ý rằng việc sử dụng điều này để tiết kiệm nhà nước với một phương pháp là một ý tưởng tồi. Lưu ý rằng trong trường hợp này, mục đích là đảm bảo việc tạo/biên dịch regex chỉ xảy ra một lần. Bạn có thể nói đây là một hình thức của nhà nước, nhưng tôi nghĩ ở đây nó thực sự về hiệu suất, không giữ dữ liệu giữa các cuộc gọi phương thức. –

+0

Trong trường hợp đó, tốt là một trường chỉ đọc tĩnh. Đó là một phần của trạng thái bất biến liên quan đến loại, được khởi tạo khi loại được khởi tạo. Làm cho cảm giác như là một tĩnh với tôi :) –

+0

Tôi lấy nó bạn đã không làm việc với đóng cửa được nêu ra. Họ theo nghĩa đen là trạng thái có thể thay đổi được lưu trữ trong một phương pháp. –

1

Bạn phải khai báo này vào mức độ lớp:

private static readonly RegEx badAmpersand = new RegEx("..."); 
+0

Điều đó sẽ làm việc trong trường hợp này, nhưng theo nghĩa chung nó phức tạp hơn vì có thể có các vấn đề tương tranh trong một ứng dụng đa luồng. Thành viên VB.Net tĩnh được cho là an toàn thread. –

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