2010-07-31 7 views
0

죄송 클래스 외부에서 공용 변수의 속성을 변경하는 방법, 나는 바로 그것을 설명 할 수 있다고 생각하지 않습니다제목에 대한

이것은 간단한 예 클래스입니다,이 괜찮 노력하고 있습니다. (나는 또한 저장() 메소드가)

public class busItem 
    { 

     public Item vItem; 

     public busItem(int pItem_Id) 
     { 
      DBDataContext db = new DBDataContext(); 

      Item vItemQuery = (from i in db.Items 
           where i.Id == pItem_Id 
           select i).FirstOrDefault(); 

      vItem = new Item(); 

      vItem.Id = vItemQuery.Id; 
      vItem.Desc = vItemQuery.Desc; 

     } 
    } 

그리고 이것은 내 코드 숨김 호출입니다 :

busItem item = new busItem(1); 
item.vItem.Desc = "new description"; 

문제는 내가 "새로운 설명"을 통과 할 때, 나는를 얻을 수 있다는 것입니다 "null 참조"예외입니다. 어떻게해야합니까?

+3

공개 된 접근 필드가 있습니까? 오, 공포! 적어도 재산을 사용하십시오. – Oded

답변

0

우선,이 코드는 적어도 2 가지 이유 때문에 올바르게 보이지 않습니다. 쿼리의 pItem이 선언되지 않았습니다. pItem_Id? 또한 "새로운 설명"이있는 행은 세미콜론으로 끝나지 않습니다. 정확한 코드를보고 있지 않다면 실제 문제가 보이지 않을 가능성이 있습니다. 둘째, "새로운 설명"을 할당 할 때 실제로 vItem.Desc = vItemQuery.Desc를 할당 할 때 오류가 아닌 것으로 의심됩니다. "새로운 설명"줄이 어떻게 문제가 될지는 모르겠지만 요청한 객체를 찾을 수 없어 쿼리가 null을 반환하면 원래/기본 설명을 가져올 때 오류가 발생합니다.

편집 : 당신이 확인이 생성자 내에서 vItem의 로컬 인스턴스를 선언 같은 코드의 몇 가지 중요한 부분을 배제하지 않았다 있습니까?

+0

그래, 내가 게시 된 코드는 실제 코드가 아닙니다. 하지만 생성자가 실제로 작동하고 모든 값을 정확하게 얻는 중입니다. –

+0

나는 그것을 믿을 수 없습니다. 생성자가 오류없이 vItem.Desc를 설정할 수 있다면 다른 코드는 vItem.Desc를 오류없이 설정할 수 있어야합니다. 그렇지 않으면 1) 다른 코드가 vItem을 null로 지우거나 2) 해당 생성자가 실제로 실행되지 않은 경우가 아니면 ... 예를 들어 생성자 내에 로컬 vItem을 선언 했으므로 실제로는 기본 vItem을 설정하지 않습니다. – BlueMonkMN

+0

당신이 옳았습니다, 저의 실수였습니다. 개체가 다른 방법으로 지워졌고 눈치 채지 못했습니다. –

1

아마도 생성자에서 null 참조 예외가 발생합니다. IEnumerable에 항목이없는 경우 FirstOrDefault()은 null을 반환 할 수 있으며이 경우 IdDesc에 액세스하면 예외가 발생합니다. 생성자가 정상적으로 완료되면 item.vItem.Desc이 실패하지 않아야합니다.

+0

그는 또한 busItem 생성자에서 모든 코드를 가지고 오류가 발생하면 더 자세한 정보를 얻기 위해 시도의 catch 블록 안에 넣을 수 있습니다. 정말 크다 원인 – virious

0

Vitor 코드를 게시하고 DataContext 및 Item에 대한 두 개의 작은 모의 구현을 추가하여 코드를 실행했습니다. 그런 다음 테스트에서 실패한 코드를 추가했습니다. 이 테스트는 DataContext에 의해 리턴 된 콜렉션에 추가하는 Item 오브젝트에 상관없이 통과되었습니다.

내가 재현 할 수 있었던 유일한 예외는 생성자에서 발생했습니다. 새 설명이 설정된 행은 결코 실패하지 않습니다.

아래 코드를 추가했습니다.

보다 일반적인 참고 사항 : 공개 멤버 변수는 일반적으로 디자인을 향상시킬 수있는 신호입니다. 이 변수를 비공개로 설정하고 거기서 작업하는 것이 좋습니다. 우리 팀에서는 멤버 변수가 공개되지 않아 취약한 디자인으로 이어질 수 있다는 규칙이 있습니다. 그냥 내 두 센트.

public class Item { 
    public int Id; 
    public string Desc; 
    } 

    public class DBDataContext { 
    public System.Collections.Generic.List<Item> Items { 
     get { 
      var items = new System.Collections.Generic.List<Item> { 
       new Item { 
       Desc = null, 
       Id = 1 
       } 
      }; 
      return items; 
     } 
    } 
    } 

    public class busItem { 

    public Item vItem; 

    public busItem(int pItem_Id) { 
     DBDataContext db = new DBDataContext(); 

     Item vItemQuery = (from i in db.Items 
          where i.Id == pItem_Id 
          select i).FirstOrDefault(); 

     vItem = new Item(); 

     vItem.Id = vItemQuery.Id; 
     vItem.Desc = vItemQuery.Desc; 
    } 
    } 

    [Test] 
    public void TestBusItem() { 
    busItem item = new busItem(1); 
    item.vItem.Desc = "new description"; 
    } 
0

문제는 아마 코드 :

Item vItemQuery = (from i in db.Items 
          where i.Id == pItem_Id 
          select i).FirstOrDefault(); 

FirstOrDefault는 첫 번째 항목하거나 기본값을 반환합니다. Item은 클래스이므로 기본값은 null이며 null에 멤버를 설정할 수 없습니다. 위의 명령문 다음에 null을 테스트해야합니다. 널 (null) 인 경우 수동으로 인스턴스를 작성하십시오. 또한 공개 입력란은 이며 매우입니다.

관련 문제