2009-10-05 5 views
0

연결된 모든 클라이언트가 클라이언트 클래스의 인스턴스로 표시되는 서버가 있습니다. 이 클래스는 데이터 처리를 담당합니다. 나는 항상 생각이 같은 클래스의 이상의 인스턴스가 나는 그것의 시내 전화로 간주하기 때문에 또한, "이"키워드를 사용할 필요가없는,이 경우에도 개인 함수를 호출 할 때 : 이상의 플레이어가있을 때"this"사용 - 클래스의 많은 인스턴스, 개인 메서드 호출

if (data[1]==2 && data [3]==2) 
    SendAck(); 

을하지만, (더 많은 클라이언트 클래스), 때로는 메시지가 다른 플레이어에게 보내졌고 다른 방법으로도 보내졌습니다. 모든 메서드 호출에 "this"를 추가하면 모두 괜찮 았습니다. "이"라는 다른 클래스의 메서드를 호출 할 가능성이 있습니까? 감사합니다.

EDITL : TryGetValue /를 호출 할 때 각 인스턴스에서 공용 사전과 같은 공용 멤버를 사용하고이 키워드/등을 사용하지 않는 경우는 어떻습니까?

C# 1 규격에서
+1

1. 정적 메서드를 호출 할 가능성이 있습니까? –

+0

당신의 '이걸 없애고 몇 가지 테스트를 해보십시오. 때로는 행동이 일관되고 반복적입니까? 이 문제가 발생하는 장소에는 어떤 공통점이 있습니까? –

+0

아니요, 매우 무작위이고 드문 문제였습니다. – Petr

답변

0

:

7.5.7이 액세스

... 이것은 클래스의 인스턴스 법 인스턴스 접근 에서 일차 식에 사용
는 그것이 값으로 분류됩니다. 값의 유형은 사용이 발생하는 내부 클래스 의 인스턴스 타입 (§10.3.1)이며 값은 방법이나 접근 호출 이었다되는 오브젝트 에 대한 참조이다.

연결된 클라이언트를 나타내는 유형의 인스턴스에 대한 다중 스레드 액세스에 문제가 있다고 생각됩니다.

+0

스레드 풀이 있으므로 문제가되지 않습니다. 그리고 공중 munmbers는 어떨까요 < – Petr

+0

자체가 스레드 풀의 존재는 공유 상태에 대한 액세스가 안전하다는 것을 보장하지 않습니다. 위의 발췌는 모든 인스턴스 (액세스 가능성이있는) 메서드 및 접근 자에 대해 true입니다. –

1

메서드가 클래스의 멤버 인 경우 SendAck();this.SendAck(); 사이에 차이가 없습니다. 메서드를 호출하는 인스턴스에서 항상 메서드를 호출합니다.

디버거를 사용하여 메소드 호출시 실제로 수행되는 내용을 확인하십시오. this 키워드의 유무와 상관없이 동일한 방법임을 알 수 있습니다.

+0

입니다.SendAck()는 확장 메소드 호출이 될 수있다. (특정 클래스에 대한 synaxical sugar) –

+0

현재 클래스에'SendAck' 메소드가 있다면,'SendAck()'와'this.SendAck()'는 모두 *를 호출 할 것이다. * 메소드. 이것은 확장 메소드보다 우선 순위가 있기 때문에. – Groo

3

아니요, 불가능합니다. "this"는 거의 모든 시간 선택적입니다. 클래스의 필드와 같은 이름의 매개 변수를 사용하는 메서드 (예 : 생성자)가 있고이 매개 변수의 값을 필드에 할당하려는 경우 (예 :

) 필요하면 상황이 필요할 수 있습니다.
class Test 
{ 
    private string strValue; 

    public Test(string strValue) 
    { 
     this.strValue = strValue; 
    } 
} 

나는 코드에 또 다른 문제가 있다고 생각합니다. 자세한 내용을 알려주시겠습니까?

+0

일부 메소드가 공개되어있을 수 있습니다. – Petr

+0

아니요. 공개/비공개 한정어는 아무 관계가 없습니다. – DevSolar

+0

죄송합니다. 좀 더 자세한 정보, 꽤 복잡한 앱을 제공 할 수 없으며이 키워드를 일부 메소드 호출에 추가하면 모든 문제가 갑자기 중지되었습니다. 클래스의 다른 인스턴스에서 메소드가 실행 된 것과 같았습니다. – Petr

관련 문제