2010-04-26 25 views
13

Tôi đã có một cuộc phỏng vấn hôm nay và mọi thứ đã diễn ra rất tốt, nhưng sau đó một người phỏng vấn đã hỏi tôi một câu hỏi Nơi biến tĩnh hoạt động trong C# - Ở cấp ứng dụng hoặc ở cấp độ trang.Biến tĩnh hoạt động ở đâu trong trang ASP.NET?

Tôi không rõ ràng lắm về câu trả lời này vì tôi chỉ biết rằng các biến tĩnh được lưu trữ trên heap và tôi không biết gì về điều liên quan đến web. Sau đó, ông đã cố gắng làm cho tôi rõ ràng hơn bằng cách đưa ra một ví dụ rằng trong một trang tôi đang sử dụng biến tĩnh và ba người dùng đang truy cập vào trang một người dùng cập nhật giá trị của biến tĩnh, Giá trị nào sẽ hiển thị cho phần còn lại hai người dùng một bản sao cũ hoặc bản cập nhật sẽ được phản ánh.

+7

Suy nghĩ ngẫu nhiên, gửi email cho họ về cách bạn trả lời câu hỏi này ngay bây giờ với kiến ​​thức bạn đã đạt được. Một trong những khả năng quan trọng nhất của một nhà phát triển là biết khi nào phải thừa nhận thiếu kiến ​​thức và sau đó có thể vượt qua điều đó với kiến ​​thức mới. –

Trả lời

20

Trừ khi đó là [ThreadStatic], biến tĩnh sẽ chỉ có một giá trị cho mỗi AppDomain.

Trong ASP.Net, mỗi ứng dụng có AppDomain riêng của nó, vì vậy các biến tĩnh sẽ được chia sẻ bởi tất cả các yêu cầu trong ứng dụng. Đây là những gì người phỏng vấn nhận được - sử dụng các biến số static trong các ứng dụng ASP.Net là một lỗi phổ biến có thể dẫn đến các lỗi tham nhũng bí ẩn khi nhiều yêu cầu xảy ra cùng một lúc.

+0

AppDomain là gì và mục đích của nó là gì –

+0

http://msdn.microsoft.com/en-us/library/dah4cwez%28v=VS.100%29.aspx – SLaks

+0

@Slacks: Vì vậy, bạn muốn nói ThreadStatic là thực mối quan tâm của người phỏng vấn. Anh ta muốn biết điều tương tự về các biến tĩnh. Trong trường hợp này, câu trả lời của bạn là gì. Tất cả người dùng có nhận được giá trị cập nhật nếu sử dụng threadstatic không? –

4

Sau khi một trang thay đổi giá trị, các trang khác sẽ nhận được giá trị được cập nhật.

Điều này có thể hoặc không thể là điều bạn muốn. Đây là lý do tại sao các biến tĩnh là nguy hiểm trong lập trình web. Trong một ứng dụng Winforms ví dụ, một biến tĩnh hoạt động tốt để lưu trữ các giá trị toàn cầu cho quá trình này, vì có khả năng chỉ là một tiến trình đang chạy. Bạn nhận được hành vi mong đợi.

Tuy nhiên, trong ứng dụng web, mã của bạn có thể được bắt đầu bằng nhiều chủ đề trong cùng một AppDomain. Các nhà phát triển đôi khi ngạc nhiên khi giá trị được chia sẻ.

Nếu bạn muốn các giá trị khác (bạn thường làm), bạn có thể buộc điều này bằng cách sử dụng thuộc tính ThreadStatic. Yêu cầu web khác nhau là trong các chủ đề khác nhau, do đó, họ sẽ vẫn không biết gì về nhau. Tôi không bao giờ sử dụng điều này vì tôi không tin tưởng vào bộ sưu tập rác để loại bỏ giá trị trước cuộc gọi trang tiếp theo, có thể sử dụng lại cùng một chuỗi. Tương tự như vậy, tôi sẽ không tin các biến tĩnh cho các giá trị chia sẻ có chủ ý giữa các luồng asp.net; sử dụng server variable.

+0

@ Patrick, vì vậy nó có nghĩa là biến tĩnh sẽ sử dụng bộ nhớ chia sẻ như tôi mong đợi nhưng do nhiều luồng vì nhiều người dùng truy cập cùng một trang mà họ có thể nhận được các giá trị khác nhau tùy thuộc vào thời điểm người dùng truy cập? –

+0

Điều đó là chính xác. Bây giờ nó * có thể là * mà bạn muốn điều này. Tôi nghĩ rằng nó thường xuyên được thực hiện một cách tình cờ. –

+0

Vì vậy, điều này có nghĩa là Slack là đúng vào thời điểm này liên quan đến những gì không sử dụng thứ gì để sử dụng. –

2

Biến tĩnh trong C# với ASP.NET hoạt động ở cấp ứng dụng.

Theo như giá trị mà chúng sẽ nhận được, nó phụ thuộc vào việc chúng có truy cập biến trước hoặc sau khi trang cập nhật biến tĩnh. Nếu họ nhận được giá trị trước khi biến tĩnh được thay đổi, họ sẽ thấy giá trị cũ. Nếu họ nhận được giá trị sau khi biến tĩnh được thay đổi, họ sẽ nhận được giá trị mới. Các biến tĩnh có thể gặp rắc rối trong ASP.NET, tôi đề nghị chúng chỉ được sử dụng cho các giá trị không đổi hoặc cho các lớp chỉ đọc, không thay đổi.

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