반응형

숫자와 문자로 상호 변환하는 세 가지

캐스팅

가장 효율적 O
IL
명령어 직접 실행으로 추가 메서드 호출 X
C#
및 몇몇 컴파일러는 오버플로우 검사 X

Convert 타입

해당 메서드는 모두 오버플로우 검사를 수행
데이터 소실 가능성 = OverflowException 예외

IConvertible 인터페이스

가장 효율적 X
값 타입일 경우 인터페이스 메서드로 가기 위해 박싱
데이터 소실 가능성 = System.InvalidCastException 예외

 

String

Object를 상속받는 객체로서 참조 타입으로 분류 항상 힙에 할당된다.
(
절대 스레드의 스텍에 쌓이지 않는다.)

Newobj – IL 명령어 객체의 새로운 인스턴스를 생성
ldstr(Load String) – IL
명령어 – string을 위한 인스턴스 생성

문자열은 변경이 불가능 하다

String 메서드들 중 다수가 새로운 문자열을 반환하는 식이며, 이 과정에서 발생하는 임시 stringgc에서 수집해야 할 메모리로 간주
필요로 하는 문자열 개수를 줄이는 방식 – string interning

 

문자열 비교

CurrentCUltureIgnore 혹은 CurrentCulture 옵션 사용

소문자나 대문자로 통일 (엥간하면 대문자 대문자가 더 빠름)

!=, ==, CompareTo – 비교방법 명시적이지 않음(예 문화권 비교 등) 및 커스텀 비교함수 지양

 

문자열 인터닝

Intern (string x) – 매개변수 해시 코드 값 계산 - 내부 해시 테이블에 반영
IsInterned(string x) –
매개변수 해시 코드 값 계산 내부 해시 테이블에 있으면 반환, 없으면 null 반환

해시값 비교 시 – Object.RefernceEquals( A, B)

인터닝 하는 이유 메모리에 문자열을 단 하나만 유지하고 참조하는 식이면 메모리를 효율적으로 관리할 수 있다는 생각에서 해시 테이블에 등록하고 쓴다.

+ C/C++ 시절부터 컴파일러는 같은 문자열을 메타데이터에 단 한 번만 기록되도록 한다. – 문자열 풀링

+SecureString 안전한 문자열

 

Enum

C#에서는 System.ValueType 상속 -> System.Object 상속
따라서 값 타입이다. 하지만 내부에서 함수, 메서드, 프로퍼티 등을 가질 수 없다.

Byte, Int 계열로 변경 가능하다.

확장메서드를 활용해 함수를 사용하는 것처럼 보이게 할 수도있다.(static 메서드를 호출하는 방식)
public static AEnum Set(this AEnum flags, AEnum setFlags)
{ return flags | setFlags; }
AEnum A = AEnum.System;
A = A.Set(AEnum.ReadOnly);

 

배열

시작은 항상 0 인덱스부터 시작, 크기를 늘리면 모두 0으로 초기화
권장하진 않지만 시작 인덱스가 0이 아니게 제작할 수도 있음
Array
CreateInstance 정적메서드 사용시 시작 인덱스 0이 아닌 배열 제작 활용 가능

1차원의 0배열
https://en.wikipedia.org/wiki/Zero-based_numbering

하드웨어에 직접적인 주소를 가리킬 수 있기 때문에 컴파일 속력이 올라간다(뭐 대충 그렇게 들린다. 전념 ㄴㄴ)

Array.Copy – 얕은 복사 수행

시작 인덱스 1 1차원 배열을 GetType()로 출력 시 System.String[*]이 반환된다. 이유는 시작 인덱스가 다름을 알기 위해서인데, 다차원 배열인 경우는 모두 시작 인덱스가 0이 아닌 것으로 간주하여 [*,*] 식의 출력을 하지는 않는다.

Unsafe 구조체에 배열 두려면

Internal unsafe sturct UnSafeArray
{
 public fixed int A[20];
}

l  배열은 타입은 반드시 구조체(값 타입), 내부에 클래스(참조 타입)을 포함해서도 안된다.

l  필드 포함하는 구조체는 unsafe 키워드를 추가

l  배열 필드는 반드시 fiexed 키워드 추가

l  반드시 1차원이면서 시작 인덱스 0이어야 함

반응형

'C# > CLR via' 카테고리의 다른 글

사용자 정의 특성 (Creating Custom Attribute)  (0) 2020.03.25
델리게이트(대리자)  (0) 2020.03.25
인터페이스  (0) 2020.03.25
이벤트 & 제네릭  (0) 2020.02.28
매개변수 & 프로퍼티  (0) 2020.02.21
Posted by Lotus' Library
,