2010-06-08 5 views
10

에 초기 값을 설정하는 단점은 같은 클래스에 어떤 단점이 있나요?C#을 선언

는 UPDATE :
세션 [ "사용자"는, 상기의 Global.asax으로 session_start 설정된다. 그래서 실패하면. 아무튼 어쨌든 작동해야합니다.

+0

세션이 초기화 되었습니까? – ANeves

+0

질문 업데이트 – BuddyJoe

+0

합체 연산자의 내 즐겨 찾기 중 하나 UserId = (문자열) Session [ "user"] ?? "0"; – kenny

답변

5

가장 큰 문제는 protected string UserId = (string)Session["user"];이 실패한 경우입니다. 당신은 우아하게 저하 될 의지가 ​​없습니다. 생성자 등에 넣음으로써 세션을 확인하고 무엇을 해야할지 결정할 수 있습니다.

일반적으로 나는 UserId = -1; 등과 같이 성공할 가치가있는 값만 입력하고 필요한 경우 코드 블록에서 수정합니다. 어떤 일이 잘못되어 복구해야 할 때를 결코 알 수 없습니다.

2

주요 단점은 단일 문을 사용하여 값을 설정할 수 있다는 것입니다. 예를 들어 존재하는 세션 키를 확인하고 싶지 않은 경우 세션 키를 지정하려면 초기 값을 설정하여 수행 할 수 없습니다.

2

디버거를 체크인하면 선언 (예 1)의 값 설정은 생성자가 호출되기 전에 발생하므로 생성자에서 설정 한 값에 의존하지 않도록해야합니다.

+0

좋은 지적. 이 상황을 확인하는 것을 기억합니다 +1 – BuddyJoe

1

'안전한'캐스트를 사용하는 것이 좋습니다.

UserId = Session["user"] as string; 

이렇게하면 세션 항목이 없거나 문자열이 아닌 경우 오류가 발생하지 않습니다. UserId를 사용하기 전에 테스트 할 수있는 null을 얻습니다.

+3

안전한 캐스팅은 이런 상황에서 너무 많이 사용됩니다. 문자열이 아닌 경우 오류가 발생한다고 생각합니다. firsat 장소에 코드를 작성 중이므로 문자열이 필요하므로 문자열이 아닌 경우 문제를 해결해야합니다. 나는 잘못된 유형이 어딘가에 저장되었고 안전한 캐스트가 실제 오류를 숨기고 대신 초기화되지 않은 변수 오류처럼 보이게 만들었 기 때문에 너무 많은 시스템이 이상한 동작을 보임을 보았습니다. 그냥 내 두 센트. –

+0

그의 코멘트 (답 뒤에 추가)는 Session [ "user"]'*가 반드시 문자열이어야하기 때문에 봉오리에 문제가 없도록하는 것이 가장 좋습니다. – STW

+0

예외 발생은 항상 선택이어야합니다 예외가 가능하다는 것을 알 때마다 이 경우에는 예외 처리를 허용하는 것이 옳을 수도 있지만 그렇지 않을 수도 있습니다. 안전 주조로 선택의 여지가 있습니다. –

1

AFAIK 인라인 값 초기화 프로그램과 생성자 초기화 간에는 명령문의 실행 순서와 인라인 코드에서 한 줄로 된 명령문이 매우 제한된다는 점을 제외하면 실제 값 차이가 없습니다.

실행 순서는 생성자 논리 앞에 특정 논리가없는 순서로 실행되므로 초기화 문에 부작용이있는 경우 일부 불쾌한 놀라움을 겪을 수 있습니다. 그러나 코드가 실행되므로 나중에 추가 생성자를 추가하거나 일부 필드를 초기화하지 못할 수도 있습니다.

인라인 초기화에 코드 생성자를 사용하는 편이 더 좋습니다. 코드를보다 읽기 쉽도록 만들었으며 필요에 따라 추가 검사를 수행 할 수 있기 때문입니다.

0

내가 사용하는 지침 : 컴파일시 알려진 기본/값에 필드 초기화 프로그램을 사용하십시오. 전역 콜렉션이나 중요하지 않은 로직을 찾는 것과 같은 일을하는 경우 ctor로 이동하십시오 (다른 사람이 지적한대로 오류 처리/복구 용).

  • 거꾸로, 당신은 오류가 없을 것이라고 확신한다고 가정 : 필드 이니셜 라이저가 쉽게 읽을 수 있습니다.
  • 단점 : 필드 이니셜 라이저와 여러 ctors가있는 경우 이니셜 라이저의 IL은 의 각 부분에 각각 ctor로 삽입되어 IL이 부풀어 오르게됩니다. 따라서이 경우 Initialize 메소드를 호출하는 것이 좋습니다.

이외에도 필드 이니셜 라이저에 대한 단점도 없습니다.

0

여러 가지 이유로 좋지 않다는 말을 시작하는 방법을 알기가 어렵습니다. 첫 번째 세션은 전역 변수 여야합니다. 그렇지 않으면 코드가 컴파일되지 않습니다. 귀하의 컨텍스트에서 여기에 세션을 추측하고있어 System.Web.HttpContext.Current.Session, 그래서 코드가 컴파일되지 않습니다. 세션 변수를 전역 변수로 가정하고 세션 변수를 적절히 초기화하고 Session [ "user"]를 할당해야합니다. 그러면 어떻게 할 것입니까? 그런 다음 클래스와 세션간에 이러한 종속성을 만들면 단위 테스트가 어떻게됩니까? 플러스 다른 모든 이유에서 다른 모든 이유.

0

사용자 아이디가 다른 두 번째 생성자를 원할 수도 있습니다.

0

AFAIK 생성자는 항상 모든 필드가 초기화 된 후에 호출됩니다. 따라서 예제 2에서는 필드를 Null으로 초기화 한 다음 (string)Session["user"]으로 초기화하고 있습니다.