2012-08-31 2 views
0

"새"키워드의 사용법 및 객체의 여러 인스턴스 제거에 대한 몇 가지 질문이 있습니다.서브 루틴 종료 전에 여러 인스턴스 제거하기

코드 숨김 ASP.Net 문의 서블릿이 서브 루틴이 실행될 때마다 실행되면 employeeDetails.DataKeyNames의 인스턴스가 여러 개 있습니까? 이 객체는 서브 루틴에 국한됩니다. 대답은 '예'이 코드를 포함하는 서브 루틴이 완료되면 employeeDetails.DataKeyNames의 모든 사본을 제거하는 코드를 사용해야하는 경우

employeeDetails.DataKeyNames = New String() {"EmployeeID"} 

? 이 경우 employeeDetails.DataKeyNames의 모든 사본을 제거하는 데 필요한 코딩을 보여주십시오.

답변

1

이 경우 New는 .DataKeyNames 속성에있는 값을 새 값으로 바꿉니다. 이 경우 해당 속성에 더 많은 값을 추가하는 것이 아니라 문자열 배열을 반복적으로 만들고 파괴하는 성능 저하가 나타납니다. 이 값이 설정되어 있는지 확인하고 간단한 경우 절을 대체하지하는 것이 좋습니다 :

, 당신은 당신이 이유를 확인하기 위해 코드에서 다른 논리를 확인 할 수 있습니다 말했다되고 그건
If employeeDetails.DataKeyNames Is Nothing Then 
    employeeDetails.DataKeyNames = New String() {"EmployeeID"} 
End If 

이 메소드를 반복 해 호출 해, 그러한 호출을 줄이는 방법이 있을지 어떨지를 확인합니다.

+0

안녕하세요. 자세한 답변을 보내 주셔서 감사합니다. 그들은 매우 도움이됩니다. 설명 된대로 if 문을 사용합니다. 또한 서브 루틴이 호출 될 때마다 employeeDetails.DataKeyNames가 Nothing인지 여부를 확인하기 위해 메시지 상자를 그 안에 넣을 계획입니다. 서브 루틴의 목적은 사용자가 요약 행을 선택하고 사용자가 버튼을 클릭 한 후 서브 루틴이 호출 된 후에 세부 사항을 표시하는 것입니다. –

2

응용 프로그램에서 작성한 객체 참조는 예상하는 일반적인 범위 지정 규칙을 따릅니다. 예를 들어, 메소드 내에서 오브젝트 참조를 작성하면 메소드가 호출자에게 제어를 리턴 할 때까지만 오브젝트 참조가 작성됩니다. For 루프 내에서 참조를 만드는 경우 참조는 해당 루프에 대해서만 범위 내에 있습니다. 그렇다고해서 참조가 가리키고있는 객체가 즉시 사라지는 것은 아닙니다. .NET과 같은 관리 환경에서 가비지 수집기는 더 이상 객체가 가리키는 참조가없는 경우에만 메모리의 객체를 파괴합니다. 그렇더라도 GC는 백그라운드에서이 작업을 처리 할 적절한 시간을 예약하고 개체에 대한 참조 수가 0에 도달하는 즉시 가비지 수집을 수행하지는 않습니다.

this article을 .NET의 가비지 수집.

응용 프로그램에서 관리되지 않는 리소스 또는 CLR에서 직접 제어하지 않는 리소스를 사용하여 만든 개체를 참조하는 경우에는 예외입니다. 이에 대한 일반적인 예는 데이터베이스 연결 또는 네트워크 소켓 일 수 있습니다. 이러한 경우 리소스가 해제되도록 개체에서 실제로 Dispose을 호출해야 할 수 있습니다.

IDisposable을 사용하는 이유와시기에 대한 좋은 설명은 this question을 참조하십시오.

관련 문제