2010-08-08 12 views
0

아래 코드에 문제가 있습니다. 나는 아래 클래스의 새로운 인스턴스를 생성하고 호출 할 때마다 나는에 개체의 인스턴스로 설정되어 있지 않은 객체 참조를 얻을 "를 선택하십시오"를 "this.db"왜 내 New() 발사가되지 않습니까?

namespace SPI { 

    class CompaniesDB 
    { 
     private DataContainer db; 

     public void New() { 
      this.db = new DataContainer(); 
     } 
     public Company Select(int companyID) { 
      return this.db.Company_Get(companyID).SingleOrDefault(); 
     } 
    } 
} 

왜 누군가가 날 지점 수 내 " 새로 만들기() "가 새 객체를 만드는 것 같지 않습니까?

저는 C#에 비교적 익숙합니다.

+0

"this"없이 시도해 보셨습니까? 접두사? 나는 그것이 클래스 변수로 선언되었으므로 당신이 필요로한다는 것을 완전히 확신하지 못한다. 또한 spi.CompaniesDB 변수를 선언 할 때 New() 선언을 사용하고 있습니까? (VB에 해당하는 예제) enterprisesDB = new CompaniesDB()와 같이 myDB를 흐리게 처리합니다. 단지 2 센트. – Tommy

+0

@Tommy - Mike의 문제는 'this'참조를 사용하는 것과 관련이 없습니다. @ Moron의 대답을보십시오. –

+0

@ 토미 :'this.' 지정자는 필요하지 않지만 'db'라는 이름의 스코프에 다른 것이 없기 때문에 거기에 아무런 변화가 없습니다. – Guffa

답변

11

생성자 이름을 New으로 지정하지 마십시오. Name 클래스를 사용하여 이름을 지정합니다.

생성자에

namespace SPI { 

    class CompaniesDB 
    { 
     private DataContainer db; 

     public CompaniesDB() { 
      this.db = new DataContainer(); 
     } 
     public Company Select(int companyID) { 
      return this.db.Company_Get(companyID).SingleOrDefault(); 
     } 
    } 
} 

MSDN 페이지를보십시오 : http://msdn.microsoft.com/en-us/library/ms173115.aspx

+1

반환 형식이 없어야합니다. –

+0

@ Dan : 예. 나는 편집 과정에 ... –

+0

또는 변수의 선언시 db에 DataContainer의 새 인스턴스를 할당 할 수 있습니다. – fletcher

1

가 CompaniesDB에 새로운 방법을 이름 바꾸기? 또한 'void'수정자를 제거하십시오.

+0

아주 간단해야한다는 것을 알았습니다. VB와의 차이점을 극복하려고합니다. –

1

New()를 생성자로 사용 하시겠습니까? 그렇다면 C#의 생성자 구문에서 클래스 이름을 묻습니다. 따라서 생성자는 다음과 같아야합니다.

public CompaniesDB() 
{ 
    this.db = new DataContainer(); 
} 

희망이 도움이 되었으면합니다.

0

이 경우 DataContainer 생성자는 인수가 필요하지 않으며 새 기능의 변수에 의해 인스턴스화가 영향을받지 않으므로 해당 함수를 완전히 제거 할 수 있습니다. 당신은 개인 DB 변수의 선언시 DataContainer의 인스턴스 수 :

namespace SPI { 

    class CompaniesDB 
    { 
     private DataContainer db = new DataContainer(); 

     public Company Select(int companyID) { 
      return this.db.Company_Get(companyID).SingleOrDefault(); 
     } 
    } 
} 

편집, 마이크 졸리는의 요청에 따라 추가 정보 :

이 정말 취향까지이며, 두 솔루션이 작동하고 안전됩니다.

namespace SPI { 

    class CompaniesDB 
    { 
     private DataContainer db; 

     public CompaniesDB() 
     { 
      db = new DataContainer(); 
     } 

     public Company Select(int companyID) { 
      return this.db.Company_Get(companyID).SingleOrDefault(); 
     } 
    } 
} 

이 코드는 좋다, 당신은 참조 DB를 변수에 할당됩니다 DataContainer의 인스턴스를 만들 :

는 다음과 같은 코드를 사용할 수 있습니다. db 변수를 사용하기 시작할 때 db 변수가 참조를 포함하는지 확인 중입니다.

그러나이 인스턴스는 항상 동일하므로 생성자 내에서 할당을 제거하고 기본적으로 일반 DataContainer를 만들 수 있습니다. 이것은 또한 변수가 항상 CompaniesDB 객체의 인스턴스화시 DataContainer에 대한 참조가 포함되어 있는지 확인합니다 :

namespace SPI { 

    class CompaniesDB 
    { 
     private DataContainer db = new DataContainer(); 

     public Company Select(int companyID) { 
      return this.db.Company_Get(companyID).SingleOrDefault(); 
     } 
    } 
} 

DataContainer 생성자 인수했다 경우 생성자의 필요성이 명확 다음과 같습니다

namespace SPI { 

    class CompaniesDB 
    { 
     private DataContainer db; 

     public CompaniesDB(string name) 
     { 
      db = new DataContainer(name); 
     } 

     public Company Select(int companyID) { 
      return this.db.Company_Get(companyID).SingleOrDefault(); 
     } 
    } 
} 

인수가 도입되면 생성자에서 DataContainer 인스턴스를 만드는 것이 더 좋습니다.

+0

+1 : 잘 설계된 프로그램에서 생성자를 필요로하지 않는다고 주장 할 수 있습니다 :-) –

관련 문제