the source code for ExcelPackage
에서 보면, Workbook
속성은 null
를 반환 할 수 없다. 그것의 내부 필드 null
것을 발견하면 그 게터 새로운 Workbook
을 생성합니다 :
public ExcelWorkbook Workbook
{
get
{
if (_workbook == null)
{
var nsm = CreateDefaultNSM();
_workbook = new ExcelWorkbook(this, nsm);
_workbook.GetExternalReferences();
_workbook.GetDefinedNames();
}
return (_workbook);
}
}
이를 알고, 당신이 안전하게 모두 체크를 제거 할 수 있습니다 생각합니다.
또한 다른 사람들이 언급했듯이 using
문을 사용하는 방법에주의해야합니다. ExcelPackage
이 처리되면 Workbook
이 차례로 처리됩니다 (연결 한 소스 코드에서이 문제가 발생할 수 있음). 이는 아마도 null
통합 문서가 귀하의 방법에서 반환되었지만 using
문에있는 동안 이 아닌 것을보고하는 이유 일 수 있습니다. 잠시 후 바로 }
이 using
인 경우 null
이됩니다. 당신은 당신이 EPPlus
의 기능을 래핑하는 데 사용하는 클래스가있는 경우
, 당신은 확실히 그것을 있는지 확인해야합니다
는
- 한 번만
ExcelPackage
를 인스턴스화에 대한 참조에 보유; 이 작업을 수행 할 때 using
문을 사용하지 마십시오.
- 필요하면 다른 방법으로이
ExcelPackage
참조에 액세스하십시오. 패키지를 전달하거나 다시 열지 마십시오.
IDisposable
을 구현 한 다음 래퍼가 처리 될 때 ExcelPackage
개체를 올바르게 처리하십시오. using (var wrapper = new YourWrapper())
{
// Do everything related to manipulating the Excel file here
}
그리고 모든 것이 잘 정리 얻을 것이다 : 당신이 당신의 래퍼를 인스턴스화 할 때마다 using
을 사용, 이제 대신
public class YourWrapper : IDisposable
{
private bool disposed;
public YourWrapper()
{
}
public YourWrapper(string path)
{
OpenExcelPackage(path);
}
public void OpenExcelPackage(string path)
{
Package = new ExcelPackage(path);
}
public ExcelPackage Package { get; private set; }
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (Package != null)
{
Package.Dispose();
Package = null;
}
}
}
this.disposed = true;
}
~YourWrapper()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
:
여기에 예를 들어 *입니다.
* 클래스의 이름을 변경하십시오/더 적절한 뭔가 방법; 이것은 단지 설명을위한 것이 었습니다.