2012-03-30 30 views
5

Tôi đã thực hiện trên việc duy trì trang web (ASP.NET VB) và trên một trang cụ thể tôi nhận thấy các mã dưới đâyBiến chia sẻ công khai được chia sẻ giữa người dùng?

Inherits System.Web.UI.Page 

Public Shared UserNumber As String 

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 

    UserNumber = Session("UserNumber") 

    ... 

End Sub 

Câu hỏi của tôi là liệu UserNumber biến có thể được truy cập hoặc thay đổi bởi bất kỳ khác người dùng so với người dùng hiện tại?

Rất cám ơn

+0

Có; dưới dạng biến 'Được chia sẻ', nó có thể truy cập được đối với tất cả các phiên bản ... do đó, tất cả người dùng của ứng dụng chạy trên cùng một quy trình. –

Trả lời

9

Biến số Shared giống với biến số static trong C#.

Đây có thể được chia sẻ trên tất cả các trường hợp, do đó người dùng khác nhau sẽ chia sẻ cùng một biến.

Nhìn vào tên biến, tôi sẽ giả định bạn sẽ cần phải loại bỏ điều này Shared


Bạn đang áp dụng một giá trị biến Session đến Shared String trên Page_Init.

Do đó, mỗi lần người dùng tải trang, biến phiên của họ sẽ ghi đè giá trị hiện tại.


Nếu bạn không sử dụng biến này bên ngoài của lớp này, sau đó tôi sẽ khuyên bạn nên thay đổi nó để:

Protected UserNumber As String 
+0

Vì vậy, nếu mã chỉ đơn giản là thay đổi thành Public UserNumber Là chuỗi biến này chỉ có thể truy cập được cho người dùng hiện tại? – BugLover

+0

+1 Không thể tự mình làm tốt hơn;) – musefan

+0

@BugLover Đây là chính xác – Curt

4

EDIT câu trả lời đầu tiên của tôi là không chính xác. Đang thử lại ...

Về mặt kỹ thuật, như @Curt chỉ ra, biến số Shared được chia sẻ trên các phiên bản của lớp.

Tuy nhiên, với mã như vậy, ít có khả năng giá trị sẽ được chia sẻ giữa những người dùng vì nó được đặt thành bản sao cục bộ của giá trị trong phiên của họ trong Page_Init. Có một "điều kiện chủng tộc" có thể có sau khi biến được chia sẻ UserNumber đã được khởi tạo trong Page_Init và người dùng khác gửi yêu cầu cập nhật giá trị của biến đó từ phiên của họ, người dùng đầu tiên sẽ thấy người dùng thứ hai giá trị. tức là người dùng có thể thấy các giá trị của người dùng khác cho các yêu cầu đồng thời.

Thay vào đó, tôi khuyên bạn nên sử dụng một ReadOnly tài sản không chia sẻ để nhận được giá trị từ phiên một lần:

Private mUserNumber As String 
Public ReadOnly Property UserNumber As String 
     Get 
      If String.IsNullOrEmpty(mUserNumber) Then 
       mUserNumber = Session("UserNumber") 
      End If 
      Return mUserNumber 
     End Get 
End Property 

này sử dụng một mô hình gọi là "Lazy nạp", mà tôi sử dụng trong thuộc tính read-only rất nhiều trên các trang để cải thiện hiệu suất và khả năng đọc mã.

+0

Cảm ơn bạn đã trả lời nhưng tôi thấy câu trả lời xung đột Tôi nhận thấy Phiên được giữ riêng giữa người dùng nhưng câu hỏi của tôi là liệu người dùng B có thể thực hiện giá trị của biến UserNumber cho người dùng A không? – BugLover

+0

Từ điển 'Session' là gì, nhưng về' Chuỗi chia sẻ' thì sao? Các biến phiên khác nhau có đang cập nhật cùng một biến được chia sẻ không? – Curt

+0

-1.Bạn là đúng về từ điển 'Session', nhưng biến * UserNumber * (đây là câu hỏi của câu hỏi, chứ không phải' Session ("UserNumber") ') * là * được chia sẻ giữa tất cả người dùng. – Heinzi

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