1. 무의미한 변수 초기화 작업을 피하세요
CLR은 할당된 메모리를 0으로 만들어 모든 개체에 액세스하기 전에 초기화되도록 합니다. 따라서 변수를 0, false 또는 null로 다시 초기화할 필요가 없습니다.
//일반적으로 전문가 10개 이하의 항목
개인 HashTable _items = null;
개인 NameValueCollection = _queryString = null;
개인 문자열 _siteUrl = null;
개인 Uri _currentUri;
문자열 RoleCacheKey = null;
문자열 인증 유형 = "양식";
bool _isUrlRewrite = 거짓;
문자열 _rawUrl = null;
HttpContext _httpContext = null
DateTime requestStarTime = DateTime.Now;
메서드의 지역 변수는 힙이 아니라 스택에서 할당되므로 C#에서는 해당 변수를 지우지 않습니다. 할당되지 않은 로컬 변수를 사용하면 컴파일 중에 알람이 발생합니다. 이 인상 때문에 모든 클래스의 멤버 변수에 값을 할당하지 마십시오. 둘의 메커니즘은 완전히 다릅니다!
2. ValueType 및 ReferenceType
(1). 참조로 값 유형 매개변수를 전달합니다.
값 유형은 호출 스택에서 할당되고 참조 유형은 관리되는 힙에서 할당됩니다. 값 유형이 메소드 매개변수로 사용되는 경우 매개변수 값 복사가 기본적으로 수행되므로 값 유형 할당의 효율성 이점이 무효화됩니다. 기본 기술로 값 유형 매개변수를 참조로 전달하면 성능이 향상될 수 있습니다.
개인 무효 UseDateByRef(ref DateTime dt){ }
공공 무효 foo()
{
현재 날짜시간 = DateTime.Now;
UseDateByRef(지금 참조);
}
(2) ValueType에 Equals 메소드 제공
.net에서 기본적으로 구현하는 ValueType.Equals 메서드는 리플렉션 기술을 사용하고 리플렉션을 사용하여 비교를 위해 모든 멤버 변수의 값을 얻습니다. 이는 매우 비효율적입니다. 우리가 작성하는 값 개체의 Equals 메서드를 사용하려면(예: 값 개체를 HashTable에 배치) Equals 메서드를 오버로드해야 합니다.
공개 구조체 직사각형
{
공개 이중 길이;
공개 이중 범위;
공개 재정의 boequals(객체 ob)
{
if(ob은 직사각형)
Equels ((Rectangle)ob)) 반환
또 다른
거짓을 반환 ;
}
private bool Equals (직사각형 직사각형)
{
return this .Length == ret.Length && this .Breadth == ret.Breach;
}
}
(3) 포장 및 개봉을 피하세요.
C#에서는 boxing 및 unboxing을 통해 값 형식과 참조 형식 간에 자동으로 변환할 수 있습니다. 박싱에는 힙에서 개체를 할당하고 값을 복사해야 하는데, 이는 특정 성능 비용을 발생시킵니다. 이 프로세스가 루프에서 발생하거나 기본 메서드로 자주 호출되는 경우 누적 효과에 주의해야 합니다.
컬렉션 유형으로 작업할 때 일반적인 상황이 발생합니다. 예를 들어:
ArrayList al = new ArrayList();
for(int i = 0; i < 1000; i ++)
{
al.Add(i); // Add()가 객체를 취하기 때문에 암시적으로 박싱됩니다.
}
int f = ( int )al[ 0 ]; // 요소가 언박싱되었습니다.
이 문제에 대한 해결책은 .net2.0에서 지원하는 일반 컬렉션 유형을 사용하는 것입니다.