2010-04-26 3 views
13

Ich hatte heute ein Interview und alles lief sehr gut, aber dann fragte mich ein Interviewer eine Frage Wo funktioniert statische Variable in C# - auf Anwendungsebene oder auf Seitenebene.Wo funktioniert statische Variable in der ASP.NET-Seite?

Ich war nicht sehr klar über diese Antwort, da ich nur wusste, dass statische Variablen auf Heap gespeichert sind und ich nichts über Web bezogene Sache wusste.

Dann versuchte er mich klarer zu machen, indem ich ein Beispiel gab, dass in einer Seite ich statische Variable benutze und drei Benutzer auf die Seite zugreifen, einer der Benutzer den Wert der statischen Variable aktualisiert, welcher Wert sichtbar bleibt zwei Benutzer eine alte Kopie oder das Update wird wiedergegeben.

+7

Zufälliger Gedanke, emailen Sie sie mit, wie Sie diese Frage jetzt mit dem Wissen beantworten würden, das Sie gewonnen haben. Eine der wichtigsten Fähigkeiten eines Entwicklers ist es, zu wissen, wann man fehlendes Wissen zugeben und dann mit neuem Wissen überwinden kann. –

Antwort

20

Wenn es sich nicht um [ThreadStatic] handelt, hat eine statische Variable nur einen Wert für jede Anwendungsdomäne.

In ASP.Net hat jede Anwendung ihre eigene AppDomain. Daher werden statische Variablen von allen Anforderungen in der Anwendung gemeinsam genutzt. Das ist, was der Interviewer bekommen hat - mit static Variablen in ASP.Net-Anwendungen ist ein häufiger Fehler, der zu mysteriösen Fehler führen kann, wenn mehrere Anfragen gleichzeitig auftreten.

+0

Was ist AppDomain und was ist ihr Zweck? –

+0

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

+0

@Slacks: Also meinst du sagen ThreadStatic war das echte Sorge des Interviewers. Er wollte das Gleiche über statische Variablen wissen. In diesem Fall, was wäre deine Antwort. Würden alle Benutzer einen aktualisierten Wert erhalten, wenn sie threadstatic verwenden? –

4

Nachdem eine Seite den Wert geändert hat, erhalten alle anderen Seiten den aktualisierten Wert.

Dies kann oder kann nicht sein, was Sie wollen. Aus diesem Grund sind statische Variablen in der Webprogrammierung gefährlich. In einer Winforms-Anwendung funktioniert beispielsweise eine statische Variable ordnungsgemäß, um Werte zu speichern, die für diesen Prozess global sind, da wahrscheinlich nur ein Prozess ausgeführt wird. Sie erhalten das erwartete Verhalten.

In einer Webanwendung kann Ihr Code jedoch in mehreren Threads in demselben AppDomain gestartet werden. Entwickler sind manchmal überrascht, wenn der Wert geteilt wird.

Wenn Sie möchten, dass die Werte unterschiedlich sind (was normalerweise der Fall ist), können Sie dies mit dem Attribut ThreadStatic erzwingen. Verschiedene Web-Anfragen sind in verschiedenen Threads, so dass sie einander nicht kennen. Ich benutze das nie, da ich der Garbage-Collection nicht traue, den Wert vor dem nächsten Aufruf der Seite loszuwerden, der den gleichen Thread wiederverwenden könnte. Ebenso würde ich statischen Variablen nicht vertrauen, um absichtlich Werte zwischen asp.net-Threads zu teilen; Verwenden Sie eine server variable.

+0

@Patrick, also bedeutet dies, dass statische Variablen Shared Memory verwenden, wie ich es erwartet habe, aber aufgrund mehrerer Threads, weil mehrere Benutzer auf dieselbe Seite zugreifen, können sie je nachdem, zu welcher Zeit die Benutzer zugreifen, unterschiedliche Werte erhalten. –

+0

Das ist richtig. Jetzt könnte es * sein, dass du das willst. Ich denke, es wird öfter zufällig gemacht. –

+0

Das bedeutet, Slack ist genau an diesem Punkt, was nicht zu verwenden ist und was zu verwenden. –

2

Statische Variablen in C# mit ASP.NET funktionieren auf Anwendungsebene.

Bis zu welchem ​​Wert sie erhalten würden, hängt es davon ab, ob sie auf die Variable zugreifen, bevor oder nachdem die Seite die statische Variable aktualisiert. Wenn sie den Wert erhalten, bevor die statische Variable geändert wird, sehen sie den alten Wert. Wenn sie den Wert erhalten, nachdem die statische Variable geändert wurde, erhalten sie den neuen Wert. Statische Variablen können in ASP.NET problematisch sein. Ich würde vorschlagen, dass sie nur für konstante Werte oder für schreibgeschützte, unveränderbare Klassen verwendet werden.