.net에서 유형 안전이란 무엇입니까?
유형 안전이란 무엇입니까?
그것은 무엇을 의미하며 왜 중요합니까?
일반적으로 "유형 안전"이라는 개념이 무엇을 의미하는지 묻는다면 개발자가 값이나 객체가 특정 속성 (즉, 특정 유형)을 나타낼 것임을 확신 할 수있는 코드의 특성입니다. 예상치 못한 행동이나 정의되지 않은 행동에 대한 두려움없이 특정 방식으로 사용할 수 있습니다.
예를 들어 C #에서는 ArrayList
클래스가 모든 object를 저장할 수 있기 때문에 형식에 안전 하지 않다고 말할 수 있습니다. 즉, 다음과 같은 작업을 수행 할 수 있습니다.
var integers = new ArrayList();
integers.Add(1);
integers.Add(2);
integers.Add("3");
for (int i = 0; i < integers.Count; ++i) {
int integer = (int)integers[i];
// do something
}
위는이 법적으로 추가 할 수 있습니다, 그것은 문자열이 아닌 정수, 비록 값이 "3"때문에 컴파일 ArrayList
이후 String
(같은 도출 Int32
에서) Object
. 그러나, 그것은 발생합니다 InvalidCastException
당신은 설정하려고 할 때 integer
까지 (int)integers[2]
A를하기 때문에 String
할 수없는 캐스팅 에 Int32
.
한편, List<T>
클래스 인 즉, 위의 코드는 것 - 정확히 반대의 이유로 형태 보증 하지 경우 컴파일 integers
했다 List<int>
. List<int>
당신이 확신 할 수 있는 type-safe 내에서 개발자가 접근하는 모든 값 은 int
(또는 그에 상응하는 T
모든 제네릭 List<T>
)입니다. 따라서 int
(분명히) 캐스팅과 같은 작업을 수행 할 수 있습니다 long
.
C-int를 선언하고 char로 캐스트하고 int의 경계를 넘어서 메모리에 액세스합니다.
int i = 10;
char *s = (char*)i;
print(*(s+10));
C #-형식은 안전합니다.
int i = 10;
char *s //This is invalid unless you are using unsafe context.
포인터는 .NET에서 직접 지원되지 않습니다.
형식 안전 코드는 액세스 권한이있는 메모리 위치에만 액세스합니다. 예를 들어 형식 안전 코드는 다른 개체의 개인 필드에서 값을 읽을 수 없습니다. 잘 정의되고 허용 가능한 방식으로 만 유형에 액세스합니다.
JIT (Just-In-Time) 컴파일 중에 선택적 확인 프로세스는 메서드의 메타 데이터와 MSIL (Microsoft Intermediate Language)을 검사하여 기본 기계어 코드로 JIT 컴파일하여 형식이 안전한지 확인합니다. 코드에 확인을 우회 할 권한이있는 경우이 프로세스는 건너 뜁니다.
관리 코드를 실행하기 위해 형식 안전성 확인이 필수는 아니지만 형식 안전성은 어셈블리 격리 및 보안 적용에서 중요한 역할을합니다. 코드 형식이 안전한 경우 공용 언어 런타임은 어셈블리를 서로 완전히 격리 할 수 있습니다. 이러한 격리는 어셈블리가 서로 부정적인 영향을 미치지 않도록하고 응용 프로그램 안정성을 높이는 데 도움이됩니다.
자세한 내용은 msdn 링크를 참조하십시오.
그것을 설명하는 좋은 기사는 여기에 있습니다
.NET의 형식 안전성이 도입되어 한 형식의 개체가 다른 개체에 할당 된 메모리를 들여다 보는 것을 방지합니다.
특히 유형 안전 또는 일반적으로 유형 안전을 의미 했습니까?
허용되는 답변에 동의하지 않습니다 .ArrayList는 유형 안전 무지입니다 (유형 안전도 아니고 유형 안전도 아님) : https://stackoverflow.com/a/17984521/1145224
Richter-C #을 통한 CLR, 4 판 (93 페이지) :
형식 안전성은 CLR의 주요 기능입니다. System.Object의 비가 상 GetType 메서드를 호출하여 항상 개체의 정확한 유형을 검색 할 수 있습니다 .
예를 들어 Hero 클래스는 GetType 메서드를 재정 의하여 SuperHero 유형이 될 수 없습니다.
이 System.Object 기능을 통해 CLR은 런타임에 개체 캐스팅 가능성을 확인할 수 있습니다. 예를 들면 :
internal class Employee { ... }
public sealed class Program
{
public static Main()
{
DateTime dt = new DateTime(2016, 1, 1);
PromoteEmployee(newYears);
}
public static PromoteEmployee(Object o)
{
Employee e = (Employee)o; //InvalidCastException, runtime error
}
}
DateTime 형식을 Employee 형식으로 캐스팅하는 것은 형식이 안전하지 않은 캐스팅 시도의 예입니다.
여기에 일부 답변에 동의하지 않습니다. C #은 안전성 수준이 거의 없습니다 .
EDIT: Type safety has 2 levels of meaning (if we generally discus about programming languages, as in this thread)
One is compile time type-safety, near to refactoring etc, compiler catch typos, misspelled assigning of values to wrong variables (properties), i.e. string to int variable. Typical C# code is type-safe, known way to disable this feature is dynamic
keyword, or non generic containers, errors like above are delayed to runtime. Example: non-hacking C/C++ code is (generally) type safe at compile time. I think is possible write (hacking) casting in C# which hide type conflicts.
Next level is runtime type-safety, C# is safe in general (without unsafe sections). Even dynamic value are checked on runtime. In contrast: C/C++ isn't type safe at runtime. If compiler accept code, un-logical assigning isn't checked at runtime, providing bizarre / strange / system level or late errors, typical for C language.
Few of answerers in this thread mix other areas where C# is safe (memory safety, range safety, null pointer etc). To be strict, these are different kind of safety.
Theory: https://en.wikipedia.org/wiki/Type_safety
ReferenceURL : https://stackoverflow.com/questions/2437469/what-is-type-safe-in-net
'IT story' 카테고리의 다른 글
Python에서 렉싱, 토큰 화 및 구문 분석을위한 리소스 (0) | 2020.12.30 |
---|---|
Hibernate : HQL로 NULL 쿼리 매개 변수 값을 설정하는 방법은 무엇입니까? (0) | 2020.12.30 |
C # 정적 클래스 확장 메서드가 지원되지 않는 이유는 무엇입니까? (0) | 2020.12.30 |
PHP 함수의 코드 재구성 / 가져 오기 (0) | 2020.12.30 |
"네임 스페이스에 정의 된 요소는 비공개, 보호 또는 보호 내부로 명시 적으로 선언 할 수 없습니다."오류 (0) | 2020.12.30 |