문제

오늘 오전 토론을 통해 원시어와 리터럴에 대한 나의 이해가 올바른지 의문이 생겼습니다.


제가 이해한 바에 따르면 리터럴 유형은 특정 유형 선언 없이 사람과 컴파일러 모두 이해할 수 있는 표기법을 사용하여 할당된 값을 가질 수 있는 유형입니다.

var firstName = "John"; // "John" is literal

var firstName = (string)"John"; // *if* the compiler didn't understand that "John"
                                // was a literal representation of a string then I
                                // would have to direct it as such

프리미티브에 대한 나의 이해는 본질적으로 int와 같이 컴파일러가 이해할 수 있는 기본 데이터 유형이라는 것입니다.

int age = 25;

...리터럴은 VB9의 XML 리터럴 지원과 같이 기본이 아닐 수도 있습니다.실제 세계가 아닌 예는 System. Drawing.Point를 리터럴로 할당할 수 있는 경우입니다.

Point somePoint = 2,2; // both X and Y are primitive values, however Point is a
                       // composite value comprised of two primitive values

마지막으로 (그리고 이것이 제가 위의 질문을 하게 만든 질문입니다):내가 이해한 바에 따르면 유형이 기본 유형인지 리터럴인지 여부는 값 유형인지 참조 유형인지 여부와 직접적인 관련이 없습니다.

예를 들어 System.String은 리터럴을 지원하는 참조 유형입니다.사용자 정의 구조는 리터럴을 지원하지 않는 복합 값 유형입니다.

내 이해(내 설명은 아닐지라도)가 대부분 정확합니까?


업데이트: 좋은 정보와 대화에 감사드립니다!이것을 찾는 사람은 댓글과 답변을 꼭 읽어보세요. 몇 가지 흥미로운 참고 사항과 몇 가지 훌륭한 설명이 퍼져 있습니다.

그나저나:그것은 실제로 큰 녹색 수표를 받을 자격이 있는 대답 사이의 던지기입니다.나는 괜찮은 답변뿐만 아니라 댓글 스레드에 많은 설명과 정보가 포함되어 있는 불행하게도 반대표를 받은 답변에 이를 제공합니다.공평하게 말하면 여기에는 하나의 최선의 답변이 없으며 적어도 세 가지가 있습니다. :)

도움이 되었습니까?

해결책

나는 당신이 언급하지 않은 한 가지는 공간과 할당이라고 생각합니다. 프리미티브는 값 유형이며 스택에 할당됩니다 (문자열 클래스는 힙에 공간을 할당하는 문자열 유형을 제외하고는 객체와 관련이없는 한).

물체 자체에는 프리미티브가 포함되어 있지만 저장소는 실제 물체가 할당되는 곳에 있습니다.

다른 사람은 당신의 진술이 꽤 잘 쓰여졌다는 것입니다. 내가 놓친 구체적인 질문이 있습니까 :)?

다른 팁

나는 여기서 빠른 메모를 주사하고 싶었습니다.

C# 언어 사양은 "리터럴"을 명확하게 정의합니다. 값의 소스 코드 표현. 리터럴은 같은 것입니다 true, 10, 5.7, 'c', "hello" 그리고 널 - 그들은입니다 텍스트 그것은 a를 나타냅니다 특정 가치.

C# 언어 사양은 "원시"라는 단어를 두 번 사용합니다. 그것이 의미 할 수있는 것에 대해 결코 정의되지 않고 완전히 모호하지 않습니다.

C# 언어 사양은 "원시"라는 단어를 사용하거나 정의 할 필요가 없으므로이 모호한 용어를 사용해서는 안됩니다. 나는 MADS와 대화를 나누었고 우리는 미래의 사양 에디션 이이 사용법을 완전히 제거하기 위해 개조 될 것이라는 데 동의했습니다.

다른 유형 시스템 사양 - 반사 라이브러리, CLI, VE 등이 "원시"라는 단어를 정의하는 방법은 물론 그들에게 달려 있습니다.

질문을 제기해 주셔서 감사합니다.

내 이해가 (내 설명이 아니라면) 대부분이 맞습니까?

나는 한 시점에서 동의하지 않습니다 : 문자는 일종의 컴파일 시간 상수입니다 ( "Hello World", 5 또는 'A'). 그러나 "문자형 유형"은 없습니다. 리터럴은 항상 실제 가치입니다.

원시 유형은 String, int, double, float, short, short, imo "기본"유형입니다.

따라서 원시는 그들의 유형의 리터럴이 그들과 연결되어 있습니다.

예, 리터럴은 소스 코드로 표현된 값입니다. 따라서 VB는 날짜/시간 및 XML 리터럴을 지원하지만 C#은 지원하지 않습니다.

C# 사양, 섹션 2.4.4에서:

오자 값의 소스 코드 표현입니다.

당신이 말했듯이 이것은 값 유형과 참조 유형과 관련이 없습니다. 문자열은 실제로 참조 유형입니다.

아직 아무도 언급하지 않은 리터럴 null 그런데...

또한 기본 유형과도 관련이 없습니다. Type.IsPrimitive:

원시 유형은 부울, 바이트, SBYTE, int16, UINT16, int32, uint32, int64, uint64, intptr, uintptr, char, double 및 single입니다.

...C# 사양은 실제로 "기본" 유형의 개념을 정의하지 않습니다. String 위 목록에는 없습니다.

리터럴이 컴파일 타임 상수라는 점에서 ...C#에서는 모든 리터럴에 어셈블리에 직접 적용할 수 있는 표현이 있습니다.VB의 추가 리터럴은 CLR이 이해할 수 있는 상수가 아니라는 것을 의미합니다. const DateTime 예를 들어 - 하지만 여전히 리터럴입니다.

여기 CLS에 대해 이야기하는 MSDN 페이지입니다. 원시 유형으로 :

.NET Framework 클래스 라이브러리에는 컴파일러가 사용하는 기본 데이터 유형에 해당하는 유형이 포함되어 있습니다. 이러한 유형 중 다음은 CLS 호환입니다 : 바이트, int16, int32, int64, 싱글, 더블, 부울, 숯, 소수, intptr 및 문자열. 이러한 유형에 대한 자세한 내용은 .NET Framework 클래스 라이브러리 개요의 유형 표를 참조하십시오.

거기에도 존재하는 것을 잊지 마십시오 ASP.NET 문자 수업.

편집 : 따라서 제목의 질문에 대한 답변은 동일한 기능을 제공하는 "원시"클래스가 없기 때문에 아니오입니다. 그러나 이것은 약간의 Smart Alec 응답으로 볼 수 있습니다.

나는 당신의 이해가 대부분 정확하다고 생각합니다. Winsharp93이 말했듯이, 리터럴은 그 자체가 유형을 가진 값이지만 "문자 유형"과 같은 것은 없습니다. 즉, 문자열 리터럴을 가질 수는 있지만 문자열은 "문자 유형"이 아닙니다. 당신이 추측 한 바와 같이, 리터럴을 정의하는 것은 값이 소스 코드로 직접 기록된다는 것입니다. 비록 지정할 필요가 없다는 요구 사항이 지나치게 엄격 해 보이지만 (예 : F#는 배열 리터럴을 가지고 있으며 배열 리터럴의 유형을 유추 할 수 있습니다. [| 1; 2; 3 |], 그러나 빈 배열의 유형을 반드시 추론 할 수는 없습니다. [| |]).

불행히도, 나는 원시를 만드는 이유에 대한 잘 알려진 정의가 있다고 생각하지 않습니다. 확실히, Jon Skeet가 지적했듯이 CLR은 자체 원시성 정의를 가지고 있습니다 (Type.IsPrimitive), 스트링을 배제합니다. 하지만, 다른 평판이 좋은 출처 고려하다 string 그리고 심지어 object C#내에서 원시 유형이 되십시오. 나는이 정의를 선호합니다. + 연결 및 사용을위한 운영자 == 참조 평등보다는 가치 평등과 문자열 유형이 짧은 형식을 사용하도록 지칭 할 수 있다는 사실 string 전체 이름을 사용하지 않고 System.String.

한계를 흐리게 하는 또 다른 유형이 있다는 점을 덧붙이면 다음과 같습니다. System.Decimal 그 값은 다음과 같이 표현될 수 있습니다. 리터럴 에서 씨# 언어는 아니지만 .Net 기본 유형.

IMHO 기본 유형 모든 기본 요소에 직접 "존재하는" 유형으로 간단히 정의할 수 있습니다. 플랫폼/호스트:이미 어셈블리 언어를 사용해 본 적이 있다면 바이트, 단어, 이중 단어가 있다는 것을 알고 있을 것입니다.하지만 문자열이나 소수가 없습니다.

물론 .Net 소수 이다 "에뮬레이트된"는 .Net 런타임에 의해 실행되며 하드웨어에서만 직접 처리되지는 않습니다. IEEE 754 부동 소수점 숫자(기본 유형인 float 및 double)

리터럴 값의 개념을 확장하여 "리터럴 유형" 주어진 언어(C#, VB.Net, CIL...)로 값을 직접 표현할 수 있는 모든 유형으로 간주될 수 있습니다.이 정의를 사용하면 리터럴 유형은 다음과 같습니다. 모든 기본 유형 + 문자열 + 소수.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top