객체 작업을 완료한 후에는 모든 객체를 null
(VB.NET에서는 Nothing
)로 설정해야 하나요?
.NET에서는 IDisposable
인터페이스를 구현하는 객체의 인스턴스를 처분하여 일부 리소스를 해제하는 것이 필수적이라는 것을 알고 있지만 객체가 처분 된 후에도 여전히 무언가가 될 수 있으므로 (따라서 양식의 isDisposed
속성) 여전히 메모리 또는 적어도 일부에 상주 할 수 있다고 가정합니까?
또한 객체가 범위를 벗어나면 가비지 수집기의 다음 패스를 위해 수집 할 준비가 된 것으로 표시된다는 것을 알고 있습니다 (시간이 걸릴 수 있지만).
따라서이를 염두에두고 'null'로 설정하면 더 이상 범위에 있지 않다는 것을 알아낼 필요가 없으므로 시스템에서 메모리를 해제하는 속도가 빨라지고 나쁜 부작용이 있습니까?
MSDN 기사는 예제에서이 작업을 수행하지 않으며 현재 나는 이것을 할 수 없기 때문에 이것을 수행합니다. 해를 참조하십시오. 그러나 나는 여러 가지 의견을 접했기 때문에 어떤 의견이라도 유용합니다.
카를 설정되었습니다 null 로 객체에는 사용 후 반드시 올바른 필요가 없다. '그냥', '는 리디스포사블 개체의 경우 전화하시기 smartupdate 리디스포사블리디스포세 ()' 을 (를), re 수행됨 you& # 39 있는 객체에는 랩된 받을시간은 '시도하시겠습니까 마침내' 또는 'a', '.' () 를 사용하는 '블록). 그러나 don& 경우에도 반드시 # 39, t () 메서드를 호출 ',' 폐기 처분할 수 있는 파이널이저 객체에는 호출하십시오 한다 ' ()' 당신꺼에요.
이는 생각해봤죠 좋은 치료:
>. [파고 salesforce. 리디스포사블] [1]
그리고 이
>. 리디스포사블 이해
20 장 숭배자들로부터도 리히터 책 CLR 통해 C # 가 있다.
[1]: //msdn.microsoft.com/en-us/magazine/cc163392.aspx http://web.archive.org/web/20090311003201/http
[3]: http://www.dotnetrocks.com/default.aspx = 361 쇼나룸?
또 다른 이유는 그들을 위해 null 로 설정을 객체에는 완료했으면 그들을 실제로 살아 오래 유지할 수 있다는 것입니다.
예:
void foo()
{
var someType = new SomeType();
someType.DoSomething();
// someType is now eligible for garbage collection
// ... rest of method not using 'someType' ...
}
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;
}
가끔 객체에는 5월 끝날 때까지 계속 살아 메서드입니다. 이 JIT 를 취하면 빼냅니다 최적화되었는지 할당되었는지 nulll, 따라서 비트 코드를 끝날 것 같습니다.
객체를 널로 설정하지 마세요. 자세한 내용은 http://codebetter.com/blogs/karlseguin/archive/2008/04/27/foundations-of-programming-pt-7-back-to-basics-memory.aspx> 에서 확인할 수 있지만, 객체를 null로 설정해도 코드가 더럽혀지는 것 외에는 아무 효과가 없습니다.
일반적으로 there& # 39 의 경우도 있지만, 내가 찾을 필요 없이 사용 후 nulll 객체에는 it& # 39 의 좋습니다.
개체의 경우 리디스포사블 구축 및 필드, 내가 생각하는 것이 좋을 것 같습니다; s # 39 는 저장됩니까 it& nulll 해버린다는거, 그냥 폐기합니다 객체에는 를 사용하지 않게 됩니다. 정렬하려면 버그에 대해 다음과 같은 것을 할 수 있다.
this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();
당신의 코드가 없을 경우 구조화된 긴밀하게 충분한 가능성이 있다 'null' * 변수 = 필요를 느낀다.
변수 범위를 제한할 방법에는 여러 가지가 있습니다.
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
내가 찾을 수 없이 사용하는 것이 중괄호 " heading"; 정말 코드 및 도움말에서는 정리하십시오 보다 잘 이해할 수 있도록.
일반적으로 null 로 설정할 필요가 없습니다. 그러나 재설정하지 클래스에 기능이 있다고 가정해 봅시다.
그럼 할 수 없기 때문에 일부 폐기 처분할 수 있기 때문에 제대로 구현되지 호츨 정렬할지 두 번 및 throw 시스템드로비치디스 프로스트 예외가 아니다.
private void Reset()
{
if(_dataset != null)
{
_dataset.Dispose();
_dataset = null;
}
//..More such member variables like oracle connection etc. _oraConnection
}
이러한 종류의 " null 로 설정할 필요가 없습니다 후 객체에는 use"; 정확한 것은 아니다. 이 후에 이 변수를 nulll 처리하는 데 필요한 시간을 있습니다.
네, 항상 microphone. 합니다 '이디스포세 ()' 또는 '오클로스 ()' 에 있는 것도 it 완료했으면. 그것이 바로 파일 처리, 데이터베이스 접속이거나 일회용 객체에는.
이는 매우 현실적이며 별도로 패턴을 라시로이드.
나는 '의' 클래스 A '와' 라고 인스턴스화되지 오비야. '클래스 A' 는 'B' 의 '클래스' 라는 공물 프로프브.
내부적으로 '개인' 과 '_B 프로프브' 는 변수 기본값은 null 입니다. 이 때 '프로프발제 ()' 를 사용할 경우 널임 _PropB 확인합니다 '' a '와' B '에 필요한 자원을 열었든 인스턴스화합니다 _PropB'. 그런 다음 _PropB 되돌려줍니다 ''.
내 경험, 이것은 정말 유용한 트릭.
Null 은 리셋이나 변경할 필요가 있는 경우 오는 어떤 식으로든 콘텐트입니다 _PropB '등이 있는' 자식 'A' 로, 이전 값에 처분할 수 있는 '및' _PropB nulll 아웃해야 합니다 그래서 라시로이드 경우 적절한 값을 페치할 재설정됨 코드 필요합니다.
() '와' _PropB.Dispose 할 경우에만 직후 작성되지는 nulll 확인할지 라시로이드 won& 널일 및 정보기술 (it), t # 39 성공할 것으로 보고, 데이터 오래되었는가 you& # 39 될 겁니다. 실제로 후 처분할 수 있도록 () '그냥' nulll 합니다.
마치 내가 지금 잘 하고 있지만, 그렇지 않으면 잘못된 코드를 폐기할 비헤이비어를 I& # 39 이 후 've got a' () '에' 그리고 그 외의 _PropB 함수 호출 (및 카타시안 아찔했어 아웃해야 범위) 을 처리할 수 있는 한 개인 특성, 그리고 여전히 isn& # 39, t nulll 오래되었는가 데이터 그대로 있습니다.
결국 폐기합니다 거역한다면 nulll 아웃하지만 that& # 39 의 속성을 컨텍스트로 비결정론적 from my 힘들다.
등 핵심 이유는 데브레크 에로남이네 상위입니다 컨테이너입니다 암시한다 ('오비야 프로프브' 을 (를) '') 는 '항상', '폐기 범위에 인스턴스입니다 _PropB 불구하고 ()'.
스티븐 클리어리 잘 았겠습니다 이 게시물에 대해 설명합니다. 내가 Null 로 변수를 설정할 수 있도록 가비지 수집?
다음과 같이 말합니다.
>. 이를 위해 짧은 대답 예, 변수가 정적 필드 또는 글로 경우 열거 방법 (복귀하십시오 사용하여 출력) 또는 비동기 방식 (비동기 및 사용하여 기다리는). 그렇지 않으면 아닙니다.
즉, 일반 > 서버리스 (비사양 열거 및 비사양 비동기적입니다), 또는 필드가 null 로 설정하지 않은 지역 변수, 메서드입니다 매개변수입니다 인스턴스입니다.
>. (심지어 null 로 변수를 설정할 경우, 당신은 여전히 구축해 리디스포사블리디스포세 안 된다).
, , 루트 객체에는 > 정적인 필드를 항상 있기 때문에 항상 "alive" 에서 쓰레기요 것으로 밝혀졌다. 정적 필드를 객체를 참조입니다 더 이상 필요하지 않은 경우 반드시 null 로 설정할 수 있도록 쓰레기요 모음기 대해 줄지 수집할 수 있기 때문이다.
정적 필드를 > 설정뿐입니다 nulll 경우, 전체 프로세스를 종료할 의미가 있다. 이 시점에서 수집됩니다 모두 포함한 전체 힙 예정인 쓰레기요 루트 개체.
결론:
, 정적 필드와 >. 그 's about it. 다른 사항은요 는 시간 낭비 .
Take a 이걸봐 기사 잘 알려져 있다. http://www.codeproject.com/KB/cs/idisposable.aspx
대부분의, 설정 객체를 nulll 효과가 없습니다. 유일한 할 때 반드시 승인하십시오 경우, 대규모 object" " 작업하고 있는 한, 보다 큰 규모의 84K (비트맵입니다 등).
몇 가지 경우를 nulll 참조입니다 것이 유리합니다. 예를 들어, re 쓸 때, 우선 대기열은 및 you& # 39 같은 취합은 계약에 따라, 그 후 계속 살아 객체에는 너회가 shouldn& # 39, t be 클라이언트에 대한 클라이언트의 요청이 재거됨 큐에서.
그러나 중요한 것은 이러한 종류의 디렉토리에만 살고 있는 한 작품. # 39 의 경우 queue& 않을 것이라면서 survivetm 함수의 끝에 만들어진 후 전체 훨씬 적은 것이 중요한 것입니다.
Null 은 과도한 뭔가 설정을 다시 생각한다. 이제 중인 항목을 통해 노출된 경우를 상상해 설정되었습니다 말하도다 재산이잖아 지금은 코드를 사용하는 일부 항목이 폐기합니다 실수로 이 등록 후 어떻게든 널 참조입니다 idfsysobject. 필요로 하는 만큼 정확히 파악 일부 얻을 수 있습니다 무슨 일이야.
I believe 프레임워크입니다 던질 수 있는 일회용 로비치디스포세데스세페시옹 더 의미 있는 것이다. 이 후 이러한 이유로 뒤로를 null 로 설정하지 않는 게 더 낫다.
I believe 설계, 구현, t < b> 전날에약혼자에게 can& GC 에서 # 39, 속도 up< /b>; GC 와 발생하고. # 39 m 합니다;; d # 39 i& they& 포지셔닝하십시오 치료할 수 있는 방법을 안 나오고, 이 때 교도관님도요 GC 런입니다 - 마치 유비쿼터스 < b> Being< / /b>;; 보호 및 지켜보고 및 아웃해야 당신꺼에요. (한 마음으로 고개, 주먹을 to the sky).
개인적으로 자주 null 로 변수를 설정할 때 명시적으로 I& # 39 m, 그들과 함께 수행됨 형태로 자체 문서용으로. # 39 를 사용하여 null 로 설정한 후, 나중에 내가 don& t 너희가운데 nulll - 난 직후, re they& # 39 더 이상 필요하지 않습니다. # 39 m, m, # 39 라고 i&, 즉, " I& 공식적으로 함께 수행됨 gone.", you.be
내 의도를 더 속일 수 있으면 내가 그림 내 뒤를 따르는 다음 케이블링의,,, 이것이 < i> " might" < /i>. # 39 의 가치가 있는 도움말에서는 어졌다면 it& GC 가끔 it to me. 주로 it makes me 깔끔한 느낌을 좋아하는 것, 그리고 깔끔한 및 죽여줬어 및 선택해제합니다 몽고 (동음이의) )
내가 이것좀봐 다음과 같습니다. 프로그래밍 언어는 컴파일러와 어느 정도인지 알 수 있는 사람이 다른 사람의 의도 타임코드가 열거하십시오 요청에 변환하는 작업을 해야 할 일 - 컴파일러는 이 요청을 CPU 를 다른 언어 (때때로 여러) 를 CPU (s) 는 어떤 언어를 사용할 줄 수 있습니다 - 훗 (hoot) 스타일 강조, 변수 이름 등 너회의 탭 설정, 주석. - a CPU& # 39 에 관한 모든 레지스터와 메모리 위치를 알리는 비트 스트림 및 it 를 어떻게 opcode 떨림. # 39 로 작성된 코드를 많은 것들이 don&, t # 39 에 사용된 CPU 에 의해 변환하십시오 what& e0100042.log 저희에게는힘과 지정되었습니다. 우리의 C, C++, C #, 리스프, 바벨, 어셈블러 이론 또는 있는모든 아닌 현실, 기록되었으므로 비호환성의 명세서. What you see is what you get, 그렇지 않을 경우에도 어셈블러 언어.
대한 인식, 불필요한 things" 나는한다 ". 아니다, 그러나 단순화됩니다 code." 클린업합니다 " 소음과 같은 비워둡니다 선). 내 커리어 초기 단계에 있는 나였잖소. 난 정말 프레젠테이션이든 iqn. 이런 와중에 emc.) 라고 하면 내가 한 것에 코드 보다 선명해진다. # 39, 심지어 50 m, s 미끼처럼이 아니라 I& it& # 39 줄의 추가 " noise"; # 39 의 몇 줄의 내 프로그램 - it& 여기서 또는 할 수 있다.
모든 규칙을 예외가 존재한다. 휘발성 메모리, 정적 메모리, 경쟁 조건, 싱글, 활용할 수 있는 시나리오 " stale"; # 39 에 있는 모든 종류의 rot, 데이터 및 that& 다릅니다. 때마침 때문에 별도의 메모리 및 메모리 등을 관리하는 데 필요한 것처럼, 잠금식 속하지 않는 GC&; d - # 39 는 우주의 모든 것을 기대해 본다. 나머지 시간을 함께 GC& 언어, d, s (a matter of style # 39 it& # 39 아닌 또는 성능 향상을 보장 못한다.
하루가 끝날 때 smartupdate 이해하겠니 지정하십시오. GC 와 what& # 39 의 대상이 아니다. 좉툑, 폐기 및 무력화 적절히. 왁스 on, off 만다. 우리가 사랑한 시간, 셋 아웃해야. 및 for everything else I 기도하라주여 기분 좋은 경우, do it. 네 마일리지 과민반을을 vary.as 노력하고 있다.
일부 객체는 리소스를 메모리에서 강제로 제거하는 .dispose()
메서드를 사용한다고 가정합니다.