ProgramingTip

.Net에서 Decimal.One, Decimal.Zero, Decimal.MinusOne의 목적은 무엇입니까

bestdevel 2020. 11. 25. 08:17
반응형

.Net에서 Decimal.One, Decimal.Zero, Decimal.MinusOne의 목적은 무엇입니까


간단한 질문 -10 진수 유형이 상수를 정의하는 이유는 무엇입니까? 왜 귀찮게?

이것이 언어에 의해 정의되고 컴파일러에 대한 가능한 사용이나 효과가 아닌 이유를 찾고 있습니다. 이걸 처음부터부터 넣었나요? 컴파일러는 Decimal.Zero만큼 쉽게 0m를 인라인 할 수 있으므로 컴파일러 바로 가기로 구입하지.


작은 설명. 실제로 상수가 아닌 정적 읽기 전용 값입니다. 상수 값은 다양한 컴파일러에 의해 인라인 쉽게 어셈블리에서 사용을 추적 할 수 없기 때문에 .Net에서 다양한 컴파일러가 있습니다. 그러나 정적 읽기 전용 값은 복사되지 않고 대신 참조됩니다. 이것은 귀하의 질문에 유리합니다.

리플렉터를 사용하고 BCL을 사용하고 있습니다. MinusOne과 Zero가 VB를 사용하고 있습니다. 주로 Decimal 값 변환 및 제공하기 위해 존재합니다. MinusOne이 우연히 사용되는 이유는 오늘 바로 별도의 사용되는 이유입니다. ( 링크 )

이상하게도 Decimal.One 값을 보면 아무데도 사용하지 않는다는 것을 알 수 있습니다.

그들이 명시 적으로 정의 된 이유에있는 이유는 ... 나는 어렵고 빠른 이유가 존재합니다. 나타납니다 특별한 성능과 자신의 존재에 기인 할 수있는 편리 성 측정의 조금있을 수 있습니다. 생각 에는 편의를 위해 BCL을 개발하는 동안 누군가가 추가했으며 제거하지 않은 것 같습니다 .

편집하다

파고 const문제 (A)는 @Paleta에 의해 게임 후 더 비트. 의 C #을 정의 Decimal.Oneconst수정자를 사용 하지만 static readonlyIL에서 레벨 로 방출됩니다 . C # 컴파일러는 몇 가지 트릭을 사용 하여이 값을 a const(예 : 인라인 리터럴)과 거의 구분할 수 있습니다. 이 트릭을 인식하는 언어로 표시됩니다 (VB.Net은 인식하지만 F #은 인식하지 않습니다).


일부 .NET 언어는 10 진수를 데이터 유형으로 지원하지 않기 때문에 새로운 경우 Decimal (1) 대신 Decimal.ONE을 작성하는 것이 더 편리하고 빠 사용합니다.

Java의 BigInteger 클래스에는 같은 MIST ZERO와 ONE도 있습니다.


그들에 대한 나의 의견 은 그들이 매직 넘버를 피하기 위해 거기에 것입니다.

매직 넘버는 기본적으로 코드의 어디에서나 부수적 인 숫자가 떠 다니는 곳입니다. 예를 들면 :

int i = 32;

이것은 내가 32로 설정되었는지 (32)가 무엇을 의미하는지, 아니면 32되어야가 하는지 아무도 알 수 없다는 점에서 문제가됩니다 . 마법에 신비합니다.

추가 맥락 에서이 작업을 수행하는 코드를 자주 사용합니다.

int i = 0;
int z = -1;

0과 -1로 설정되는 이유는 무엇입니까? 우연일까요? 무슨 뜻인가요? 누가 알아?

반면 Decimal.One, Decimal.Zero등은 값이 응용 프로그램 (아마도 제로 수단 "실종", 등)의 맥락에서 무엇을 의미하는지 알려 하지 않는 , 그것은 않습니다 값이 의도적으로 설정되었음을 말해, 가능성 어떤 의미를 갖습니다.

훨씬 완벽하지만 아무것도 말하지 않는 것보다 훨씬 낫습니다. :-)

참고 그건 하지 최적화. 이 C # 코드를 관찰하십시오.

public static Decimal d = 0M;
public static Decimal dZero = Decimal.Zero;

ildasm을 사용하여 생성 된 바이트 코드를 볼 때 두 옵션 모두 동일한 MSIL을 생성합니다. System.Decimal값 유형이므로은 Decimal.Zero리터럴 값을 사용하는을 구석으로보다 더 "최적"이 아닙니다.


그 3 개의 값 arghhh !!!

그들이 내가 나는 후행 1 이라고 부르는 것과 관련이 있다고 생각합니다.

이 공식이 안심 가정하십시오.

(x) 1.116666 + (y) = (z) 2.00000

그러나 x , z0.112.00으로 반올림되고 (y)를 계산 한 메시지가 표시됩니다.

그래서 당신은 생각할 수 있습니다 y = 2.00 - 1.11. 실제로 y0.88과 같지만 0.89가 됩니다. ( 0.01 차이 가 있습니다).

x와 y의 실제 값에 따라 결과는 -0.01 에서 +0.01 까지 다양하며 ,에 따라 후행 1을 처리 할 때 후행 값이 Decimal.MinusOne / 100, Decimal.One / 100또는 같은 경우에 확인할 수 있습니다. Decimal.Zero / 100요구 고치기 위해.

이것이 내가 해결 방법입니다.

참고 URL : https://stackoverflow.com/questions/745591/what-is-the-purpose-of-decimal-one-decimal-zero-decimal-minusone-in-net

반응형