에서 사용한 후 개체를 Null/Nothing으로 설정합니다.그물
모든 오브젝트를 든음음음음음음음음음음음음음음 all all all로 설정해야 하나요?null ) 。 ( ) 。NothingVB.NET)는요?
에 나와있는 것을 잘 알고 있습니다.NET NET을 구현하는 개체의 인스턴스는 반드시 폐기해야 .IDisposable일부 리소스를 해제하기 위한 인터페이스(interface)는 개체가 제거된 후에도 여전히 무엇일 수 (예: 일부 리소스 ). 그러나 개체는 삭제된 후에도 계속 유지될 수 있습니다(예:isDisposed기억이나 적어도 일부분이 남아있을 수 있을 것 같습니다.
또한 개체가 범위를 벗어나면 가비지 수집기의 다음 통과를 위해 수집용으로 표시된다는 것도 알고 있습니다(시간이 걸릴 수 있습니다.
그래서 이 을 염두에 두고 '이렇게 하다'로 설정합니다.null메모리가 더 이상 범위를 벗어났다는 것을 알 필요가 없기 때문에 시스템의 메모리 방출 속도를 높이고 나쁜 부작용이 있습니까?
MSDN 기사는 예시에서 절대 이렇게 하지 않으며 현재 저는 해를 볼 수 없기 때문에 이렇게 하고 있습니다.하지만 저는 의견이 뒤섞여서 어떤 의견이라도 유용하게 쓰입니다.
칼입니다. 늘 그렇듯이요.사물이 구현되어 있는 경우입니다.IDisposable꼭 전화해 주세요IDisposable.Dispose()그 물건을 다 쓰면요.try..finally 또는 가, 가, 가, 나, 나, 나, 나, 나, 나, 나, 나, 나.using()을을을을을을을다 다다다다?하지만 잊지 전화해야 합니다.Dispose(), 객체의 피니셔 메서드는 calling , finalizer finalizer 입니다Dispose()네, 그렇습니다.
이게 좋은 치료라고 생각했어요
그리고 이거요
GC는 자체 조정되고 불투명하기 때문에 GC와 그 관리 전략을 재추측하는 것은 의미가 없습니다.Dot Net Rocks의 Jeffrey Richter와 함께 내부 작업에 대한 좋은 토론이 있었습니다. Windows 메모리 모델의 Jeffrey Richter와 C# 20의 리치터스 책 CLR은 훌륭한 치료법을 가지고 있습니다.
개체를 사용한 후 null로 설정하지 않는 또 다른 이유는 개체를 실제로 더 오래 존속시킬 수 있기 때문입니다.
예.
void foo()
{
var someType = new SomeType();
someType.DoSomething();
// someType is now eligible for garbage collection
// ... rest of method not using 'someType' ...
}
일부에서 참조하는 개체를 허용합니다."DoSomething" 호출 후 GC'd로 입력합니다.
void foo()
{
var someType = new SomeType();
someType.DoSomething();
// someType is NOT eligible for garbage collection yet
// because that variable is used at the end of the method
// ... rest of method not using 'someType' ...
someType = null;
}
메서드가 끝날 때까지 개체를 활성 상태로 유지할 수 있습니다.JIT는 일반적으로 할당을 null로 최적화하므로 두 코드 비트가 모두 동일합니다.
아니요 개체를 null로 만들지 마십시오.자세한 내용은 https://web.archive.org/web/20160325050833/http://codebetter.com/karlseguin/2008/04/28/foundations-of-programming-pt-7-back-to-basics-memory/에서 확인할 수 있지만 null로 설정하면 코드를 더럽히는 것 외에는 아무 것도 할 수 없습니다.
또한 다음을 수행합니다.
using(SomeObject object = new SomeObject())
{
// do stuff with the object
}
// the object will be disposed of
일반적으로 사용 후 개체를 null로 만들 필요는 없지만 경우에 따라서는 이 방법이 좋습니다.
개체가 IDisposable을 구현하고 필드에 저장되는 경우, 단순히 삭제된 개체를 사용하지 않기 위해 해당 개체를 무효로 하는 것이 좋다고 생각합니다.다음과 같은 종류의 버그는 문제가 될 수 있습니다.
this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();
필드를 폐기한 후에는 필드를 무효화하고 필드를 다시 사용하는 라인에서 NullPtrEx를 받는 것이 좋습니다.그렇지 않으면 DoSomething의 정확한 기능에 따라 다음 단계에서 일부 암호화 버그가 발생할 수 있습니다.
변수의 필요성을 느끼는 경우 코드가 충분히 긴밀하게 구성되어 있지 않을 수 있습니다.
변수의 범위를 제한하는 방법은 여러 가지가 있습니다.
Steve Tranby가 언급했습니다.
using(SomeObject object = new SomeObject())
{
// do stuff with the object
}
// the object will be disposed of
마찬가지로, 다음과 같이 대괄호를 사용할 수 있습니다.
{
// Declare the variable and use it
SomeObject object = new SomeObject()
}
// The variable is no longer available
저는 "헤딩" 없이 곱슬곱슬한 괄호를 사용하면 코드를 정말 깨끗하게 하고 더 쉽게 이해할 수 있다는 것을 알게 되었습니다.
일반적으로 null로 설정할 필요가 없습니다.그러나 클래스에 Reset 기능이 있다고 가정합니다.
그러면 일부 Dispose가 올바르게 구현되지 않고 시스템이 느려질 수 있으므로 두 번 Dispose를 호출하지 않을 수 있습니다.ObjectDisposed 예외입니다.
private void Reset()
{
if(_dataset != null)
{
_dataset.Dispose();
_dataset = null;
}
//..More such member variables like oracle connection etc. _oraConnection
}
변수를 null로 설정해야 하는 유일한 시기는 변수가 범위를 벗어나지 않고 관련 데이터가 더 이상 필요하지 않은 경우입니다.그렇지 않으면 그럴 필요가 없습니다.
이러한 종류의 "사용 후 개체를 null로 설정할 필요가 없습니다"가 완전히 정확한 것은 아닙니다.변수를 폐기한 후 NULL로 해야 할 경우가 있습니다.
네, 항상 전화하셔야 합니다..Dispose()아니면요?.Close()이렇게요.파일 핸들, 데이터베이스 연결 또는 일회용 개체입니다.
이와는 별도로 LazyLoad의 매우 실용적인 패턴이 있습니다.
''를 '나'를 인스턴스화했다라고 해 주세요.ObjA★★★★★★★★★★★★★★★★의 경우class A...을(를) 참조하십시오.Class A는 공공재산을 가지고 .PropB★★★★★★★★★★★★★★★★의 경우class B요.
내부적으로는 ★★★★★★★★★★★★★★★★★★★★★★」PropB은 개인 변수인 of는 of of of of of of of of of of of of of of of of를 사용합니다._B무효라고 합니다.언제요?PropB.Get()사용했을 때 사용 여부를 확인합니다._PropB는 null이며 null인 경우 null, null인 경우 null인 경우 null인 경우 null인 경우 필요한 리소스를 엽니다.B안으로_PropB그리고 나서 다시 돌아오게 됩니다_PropB요.
제 경험상, 이것은 정말 유용한 속임수입니다.
null의 은 null의 내용이 A를 재설정하거나 변경하는 경우입니다._PropB 값의 입니다.A, Dispose AND null out , 기 out null out 이 필요합니다_PropB따라서 코드가 필요한 경우 올바른 값을 가져오도록 LazyLoad를 재설정할 수 있습니다.
이렇게만 하면 됩니다._PropB.Dispose()LazyLoad에 대한 null 점검이 성공할 것으로 예상한 직후에는 null이 되지 않고 오래된 데이터가 표시됩니다.사실상 '없다'는 '없다'는 '없다' 뒤에 '없다'는 '없다'는 '없어야 합니다.Dispose()혹시 모르니까
않으면, 지금 이 동작을 나타내는 코드를 가지고 있어요.Dispose()에 a로요._PropB또한 Dispose를 수행한 호출 함수(즉, 거의 범위를 벗어남)를 제외하면 개인 소품은 여전히 null이 아니며 오래된 데이터는 여전히 남아 있습니다.
결국 처분된 재산은 사라지겠지만, 제 관점에서는 결정적이지 않습니다.
가 시사하는 바와 같이 핵심 이유는 상위 컨테이너(dbkkk 가 암 암 암 암 db db the the the the the the the the ( dbkk ) 。ObjA와와 with와 함께요.PropB)은(는) 의 인스턴스를 보관하고 있습니다_PropB범위 내에서요Dispose()요.
Stephen Cleary는 이 게시물에서 매우 잘 설명합니다.가비지 수집을 지원하려면 변수를 Null로 설정해야 합니까?
다음과 같이 말합니다.
변수가 정적 필드이거나 열거 가능한 메서드(수익률 반환 사용) 또는 비동기 메서드(비동기 및 대기 사용)를 작성하는 경우, 즉 "성급한 예"에 대한 단답입니다.아니면 안 돼요
즉, 일반 메서드(번호 지정 불가 및 비동기)에서는 로컬 변수, 메서드 매개 변수 또는 인스턴스 필드를 null로 설정하지 않습니다.
(IDisposable을 구현하는 경우에도 마찬가지입니다.폐기합니다. 그래도 변수를 null로 설정하면 안 됩니다.
우리가 고려해야 할 중요한 것은 정적 필드입니다.
정적 필드는 항상 루트 개체이므로 가비지 수집기에 의해 항상 "활성"으로 간주됩니다.정적 필드가 더 이상 필요하지 않은 개체를 참조하는 경우 가비지 수집기에서 해당 개체를 수집 대상으로 처리하도록 null로 설정해야 합니다.
전체 프로세스가 종료되는 경우 정적 필드를 null로 설정하는 것은 의미가 없습니다.모든 루트 개체를 포함하여 해당 시점에서 전체 힙이 가비지가 수집됩니다.
결론은 다음과 같습니다.
정적 필드입니다. 그게 다예요.다른 건 다 시간 낭비예요.
null 참조를 사용하는 것이 의미가 있는 경우가 있습니다.예를 들어, 우선 순위 대기열과 같은 컬렉션을 작성할 때 클라이언트가 해당 개체를 대기열에서 제거한 후 클라이언트에 대해 활성 상태로 유지해서는 안 됩니다.
하지만 이런 건 오래 산 소장품에서만 문제가 되죠큐가 생성된 함수의 끝에서 살아남지 못할 경우, 그 중요성은 훨씬 줄어듭니다.
대체적으로, 당신은 정말 신경 쓰지 않아도 됩니다.컴파일러와 GC가 각자의 작업을 수행하도록 하십시오.
다음 기사도 참조하십시오. http://www.codeproject.com/KB/cs/idisposable.aspx
대부분의 경우 개체를 null로 설정해도 아무런 효과가 없습니다.비트맵과 같이 크기가 84K보다 큰 "큰 개체"를 사용하는 경우에만 이 작업을 수행해야 합니다.
GC 구현자의 설계상 무효화로는 GC 속도를 높일 수 없다고 생각합니다.GC가 언제 어떻게 운영되는지 걱정하지 않으실 겁니다. 마치 어디에서나 볼 수 있는 것처럼 당신을 보호하고 감시하는 것처럼요.(무지개는 고개를 숙이고, 주먹을 하늘로 치켜들고)요...
개인적으로, 저는 종종 자기 문서화의 한 형태로 변수들을 끝냈을 때 null로 명시적으로 설정합니다.선언하거나 사용하거나 나중에 null로 설정하지 않습니다. 더 이상 필요하지 않은 즉시 null로 설정합니다.전 분명히 말하고 있어요 "당신과 공식적으로 끝났어요...사라졌어요..."
GC'd 언어에서 무효화가 필요합니까?아니요, GC에 도움이 되나요?예, 아니오, 확실하지는 않습니다. 설계상 제어할 수 없습니다. 그리고 이 버전에 대한 오늘의 답변과 상관없이 향후 GC 구현에 따라 답변이 달라질 수 있습니다.또한 nulling이 최적화되어 있다면 과장된 코멘트에 지나지 않습니다.
제 전철을 밟는 다음 불쌍한 바보에게 제 의도가 분명해지고, 가끔 GC에 도움이 될 수 있다면, 제게는 그럴 가치가 있다고 생각합니다.대부분 깔끔하고 깔끔한 느낌을 주며 몽고는 깔끔하고 깔끔한 느낌을 좋아합니다.:)
저는 이렇게 봅니다. 프로그래밍 언어는 다른 사람에게 의도적인 아이디어를 주고 컴파일러는 작업 요청을 할 수 있도록 하기 위해 존재합니다. 컴파일러는 CPU에 대한 요청을 다른 언어로 변환합니다. CPU는 사용자가 사용한 언어, 탭 설정, 주석, 스타일 강조, 강조, 메시지를 제공합니다.변수 이름 등 -- CPU는 어떤 레지스터와 연산 코드, 메모리 위치를 트위들링할지를 알려주는 비트 스트림에 대한 모든 것입니다.코드로 작성된 많은 항목이 지정된 순서대로 CPU에서 소비하는 값으로 변환되지 않습니다.우리의 C, C++, C#, 리스프, 바벨, 조립자 또는 이론이 실제가 아닌 무엇이든 작업 명세서로 작성됩니다.당신이 보는 것은 어셈블러 언어로 얻는 것이 아니다.
"불필요한 것"(예: 빈 줄)의 사고방식은 "소음 및 혼란스러운 코드"에 불과하다는 것을 이해합니다.그건 제 경력 초반의 저였어요. 완전히 이해해요.이 시점에서 저는 코드를 명확하게 하는 쪽으로 기울었습니다.제 프로그램에 50줄의 "노이즈"를 추가하는 것도 아니고, 여기나 저기에 몇줄의 "노이즈"를 추가하는 것도 아닙니다.
어떤 규칙에도 예외가 있습니다.휘발성 메모리, 정적 메모리, 레이스 조건, 싱글톤, "stale" 데이터 사용 및 부패와 같은 모든 종류의 시나리오에서는 다릅니다. 메모리가 GC'd Universe의 일부가 아니기 때문에 메모리를 직접 관리해야 합니다.나머지 시간에는 GC'd 언어의 필요성이나 성능 향상 보장이 아니라 스타일의 문제입니다.
결국 GC에 적합한 것과 그렇지 않은 것을 이해해야 합니다. 적절한 잠금, 폐기 및 무효화; 왁스, 왁스, 왁스 오프; 숨을 들이쉬고 내쉬고; 그리고 제가 말하는 다른 모든 것에 대해: 기분이 좋으면 하세요.마일리지가 다를 수 있습니다. 당연히 그래야 합니다.
다시 0으로 설정하는 것은 지저분한 것 같아요.지금 설정되는 항목이 "속성을 통해" 노출되는 시나리오를 상상해 보십시오.항목이 폐기된 후 코드 조각이 실수로 이 속성을 사용하는 경우 정확히 무슨 일이 일어나고 있는지 파악하기 위해 조사가 필요한 null 참조 예외가 발생합니다.
프레임워크 일회용으로는 ObjectDisposed를 던질 수 있습니다.더 의미 있는 예외입니다.이러한 이유로 null로 다시 설정하지 않는 것이 더 좋습니다.
어떤 사물은 이 사물을 가정합니다..dispose()리소스를 메모리에서 강제로 제거하는 방법입니다.
언급URL : https://stackoverflow.com/questions/2785/setting-objects-to-null-nothing-after-use-in-net 입니다.
'programing' 카테고리의 다른 글
| 단일 테스트 파일을 실행합니다. (0) | 2023.04.25 |
|---|---|
| Excel의 2차 및 3차 회귀 분석입니다. (0) | 2023.04.25 |
| WPF의 폭과 실제 폭의 차이점은 무엇입니까? (0) | 2023.04.25 |
| SQL Server 2012에서 Excel로 데이터를 복사할 때 새로운 라인 문제가 발생합니다. (0) | 2023.04.25 |
| Visual Studio에서 "패키지에서 도구 상자 컨텐츠 로드"를 지속적으로 가져오면 IT는 영원히 걸립니다! (0) | 2023.04.25 |