2012-03-30 10 views
5

mam przejęte utrzymanie strony internetowej (ASP.NET VB) i na jednej konkretnej stronie zauważyłem poniższy kodPubliczna wspólna zmienna współdzielona między użytkownikami?

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 

Moje pytanie brzmi, czy zmienna UserNumber mogą być dostępne lub zmieniona przez jakiekolwiek inne użytkownik niż obecny?

Dziękujemy

+0

TAK; jako zmienna "Współdzielona" jest dostępna dla wszystkich instancji ... a więc dla wszystkich użytkowników aplikacji działających w tym samym procesie. –

Odpowiedz

9

Zmienna Shared jest taka sama jak zmienna static w języku C#.

Można je udostępniać we wszystkich instancjach, dlatego też różni użytkownicy podzielą tę samą zmienną.

Patrząc na nazwy zmiennej, chciałbym założyć, trzeba by usunąć tę Shared


Aplikujesz na Session wartość zmiennej do Shared String na Page_Init.

Dlatego za każdym razem, gdy użytkownik załaduje stronę, zmienna sesji zastąpi bieżącą wartość.


Jeśli nie używasz tej zmiennej spoza tej klasy, to polecam zmianę go na adres:

Protected UserNumber As String 
+0

Więc jeśli kod zostanie po prostu zmieniony na Publiczny numer użytkownika jako ciąg zmienna będzie dostępna tylko dla bieżącego użytkownika? – BugLover

+0

+1 Nie mogłem tego poprawić sam;) – musefan

+0

@BugLover To prawda – Curt

4

EDIT Moja początkowa odpowiedź była błędna. Próbuję ponownie ...

Pod względem technicznym, jak wskazano @Curt, zmienna Shared jest współużytkowana w instancjach klasy.

Jednak przy niezmienionym kodzie jest mniej prawdopodobne, że wartość zostanie udostępniona użytkownikom, ponieważ jest ona ustawiona na lokalną kopię każdego użytkownika wartości w ich sesji w Page_Init.

Istnieje "warunek wyścigu", w którym po zainicjowaniu udostępnionej zmiennej UserNumber w Page_Init, a inny użytkownik przesyła żądanie, które aktualizuje wartość tej zmiennej z ich sesji, pierwszy użytkownik zobaczy drugiego użytkownika wartość. np. użytkownicy widzą wartości innych użytkowników dla współbieżnych żądań.

Zamiast tego zaleca się używanie ReadOnly niewspólną właściwość, aby uzyskać wartość z sesji kiedyś:

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 

ta wykorzystuje wzorzec o nazwie „Lazy-loading”, którego używam w tylko do odczytu właściwości wiele na stronach, aby poprawić wydajność i czytelność kodu.

+0

Dziękuję za odpowiedzi, ale widzę sprzeczne odpowiedzi. Wiem, że sesja jest oddzielona między użytkownikami, ale moje pytanie brzmi, czy użytkownik B byłby w stanie zrealizować wartość zmiennej UserNumber dla użytkownika A? – BugLover

+0

Słownik 'Session' jest, ale co z' Shared String'? Czy różne zmienne sesyjne nie aktualizowałyby tej samej zmiennej współdzielonej? – Curt

+0

-1.Masz rację co do słownika 'Sesji', ale * zmienna UserNumber * (o to właśnie chodzi, a nie' Sesja ("UserNumber") ') * jest * udostępniana wszystkim użytkownikom. – Heinzi

Powiązane problemy