2012-04-10 4 views
0

스택 오버플로. 변수 중 비 정적 클래스 (UserID (int)와 MyDictionary (Dictionary)) 중 하나를 초기화하려고한다고 가정 해 봅시다. 이 비 정적 클래스는 정적 클래스 내에서 선언되며 정적 클래스 멤버 중 하나에서 초기화됩니다. 스크립트가 오래 실행되고 다른 사용자가 같은 페이지에 액세스하면 새 사용자가 다른 사용자의 MyDictionary의 내용을 변경하게됩니다. 그러나 MyDictionary가 비 정적 클래스에 있기 때문에 이것이 가능한지는 알 수 없습니다. 아무도 이것을 이해합니까? 고맙습니다. 포함하는 클래스 상기 액세스 부재가 정적정적 클래스 스레드 안전성 내에서 ASP.NET 비 정적 클래스

+0

다른 사용자가 사용하는 서버 측 항목을 수정할 수있는 사용자는 어디에서 얻을 수 있습니까? 실수로 서버를 사용하면 모든 사용자가 별도의 스레드와 메모리를 사용하게됩니다. 또한 개인 클래스가 1 클래스에서만 사용되는 경우를 제외하고 모든 클래스를 개별 파일에 저장하는 것이 좋습니다. – MarioDS

답변

1

코드가 이처럼 약간 생겼다고 가정합니다. 당신은 기본적으로 말하는 정적 변수 "; 이들 중 하나의 내 응용 프로그램에서 나는 이들 중 하나 싶다"으로 정적 클래스 내부의 객체를 선언함으로써

public class MyNonStaticClass 
{ 
    public int UserID; 

    public Dictionary<int, string> MyDictionary 
     = new Dictionary<int, string>; 
} 

public static class MyStaticClass 
{ 
    public static MyNonStaticClass aStaticInstanceOfTheNonStaticClass 
     = new MyNonStaticClass(); 

    public static void AddToDictionary(int key, string value) 
    { 
     aStaticInstanceOfTheNonStaticClass.add(key, value); 
    } 
} 

; 그래서 클래스가 정적이 아니더라도; 여전히 정적 인스턴스를 만들고 있습니다.

+0

이봐, 나는 약 1 시간 동안 이것을 알아 냈다. 그리고 당신의 대답은 그것을 확인한다. 고맙습니다. – user1325179

0

때문에 단일 메모리 공간을 이용한다. 정적 클래스의 참조 (이 경우에는 지역, 필드 또는 속성)가 static이 아닌 것으로 가정해야합니다 (정적이 아닌 클래스의 인스턴스화 일지라도).

클래스가 처음부터 정적 인 이유는 무엇입니까? 공유 논리를 사용하는 경우 정적 메서드에 대한 참조로 사전을 전달하지 않으시겠습니까?

1

정적 다움 (또는 그 부족) 하지 스레드 안전에 영향을 미치지 않습니다. 정적 단순히 반원 (속성 필드, 방법 또는 생성자)를 형 클래스의 특정 인스턴스 와하지와 연관되는 것을 의미한다.

내가 스레드로부터 안전하지 않습니다 정적 코드를 작성할 수 있습니다 그 반대의 경우도 마찬가지 스레드로부터 안전하고, 내가 인스턴스 코드를 작성할 수 있습니다 (귀하의 질문에 설명하는 코드와 같은). 여기에 (나쁜) 일부 않는, 쓰레드는 코드, 더 많거나 적은 내가 당신을 생각의 라인을 따라가하고있는 :

public static class MyFoo { 

    // Just because this is a static property doesn't 
    // mean the contained dictionary is thread safe! 
    public static Dictionary<String, String> MyDictionary { get; set; } 

    public static MyFoo() { 
     MyDictionary = new Dictionary<String, String>(); 
    } 
} 

당신은 ASP.NET에서 사용자 별 정보를 저장해야하는 경우를 사용 세션 객체 또는 (더 긴 수명의 데이터의 경우) 데이터베이스. 정적 변수에 의존하지 마십시오. 두 명의 사용자가 동시에 사이트에 있다면 어떻게해야합니까?

관련 문제