다음 코드는 using(...)
기능/용도와 관련이 없습니까?
GC 성능이 저하 될 수 있습니까?`using (...) '을 사용하면 효과적으로 쓸모 없거나 비효율적입니까?
class Program
{
static Dictionary<string , DisposableClass> Disposables
{
get
{
if (disposables == null)
disposables = new Dictionary<string , DisposableClass>();
return disposables;
}
}
static Dictionary<string , DisposableClass> disposables;
static void Main(string[] args)
{
DisposableClass disposable;
using (disposable = new DisposableClass())
{
// do some work
disposable.Name = "SuperDisposable";
Disposables["uniqueID" + Disposables.Count] = disposable;
}
Console.WriteLine("Output: " + Disposables["uniqueID0"].Name);
Console.ReadLine();
}
}
class DisposableClass : IDisposable
{
internal string Name
{
get { return myName; }
set { myName = value; }
}
private string myName;
public void Dispose()
{
//throw new NotImplementedException();
}
}
출력 : SuperDisposable
는
using(...)
기능의 나의 이해는 즉시 DisposableClass
처분을 강제하는 것입니다. 그러나 코드 블록 내에서 클래스를 사전 컬렉션에 추가합니다. 내 이해 클래스는 본질적으로 참조 형식입니다. 그래서 내 실험은 이러한 방식으로 컬렉션에 추가 된 일회용 객체에 어떤 일이 일어날지를 확인하는 것이 었습니다.
이 경우 DisposableClass
은 여전히 아주 오래되었습니다. 클래스는 참조 유형입니다. 따라서 컬렉션은 단순히이 유형을 참조하는 것이 아니라 실제로 클래스를 값으로 유지한다는 가정이되었습니다. 그러나, 그것도 이해가되지 않았다.
그래서 실제로 무엇이 일어나고 있습니까?
EDIT : 일부 답변에서 제안한 것처럼 객체가 죽지 않았 음을 증명하는 출력 코드가 수정되었습니다.
2 편집 :이 아래로 좀 더 많은 코드를 통해 갔어요로 제공이 무엇 : 코드를 통해 스테핑
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool dispose)
{
if (!isDisposed)
{
if (dispose)
{
// clean up managed objects
}
// clean up unmanaged objects
isDisposed = true;
}
}
~DisposableClass()
{ Dispose(false); }
방법에 전달됩니다 false
(private void Dispose(bool dispose)
에서 중단 점을했다) , 여기에 자원이 적절히 처분되어야합니다. 그럼에도 불구하고 수업은 아직 살아 있지만 예외적으로 스스로를 설정하고 있습니다. 대답이 나를 호기심에 떨게했습니다 ...
충분합니다. 나는 무슨 일이 일어나고 있는지 이해하려고 애썼다. 오브젝트가 처리 중이거나 해당 오브젝트와 연관된 자원 인 경우 +1 – IAbstract