2009-10-06 4 views
3

VS2005의 C# .Net WinForm 응용 프로그램에 NumericUpDown 컨트롤이 있습니다. . 설계자는, 나는 폼의 .designer.cs 코드에서 왜 디자이너의 컨트롤 속성에 숫자 값을 지정하면 코드에 새로운 소수점이 생깁니 까? (new int [] {... 코드에서 ...

, 나는이 볼 것으로 예상 -65535에 NumericUpDown의 최소 속성을 설정 :

this.myNumericUpDown.Minimum = -65535; 

을 대신 내가 얻을 :

this.myNumericUpDown.Minimum = new decimal(new int[] { 
    65535, 
    0, 
    0, 
    -2147483648}); 

나는 무엇을 알고있다. int32[] decimal constructor을 찾는 것을 의미하지만 디자이너가 입력 한 값을 넣는 대신 해당 양식을 사용하는 이유는 무엇입니까? 아니면 int32 decimal constructor을 사용하고 있습니까?

답변

3

이론적으로 디자이너는 원래 입력 텍스트를 저장할 수 있습니다. 그러나 비주얼 디자이너는 이러한 값 (예 : 왼쪽, 위쪽 등)을 수정할 수도 있기 때문에 직렬화 중에이 저장 장치를 컨트롤의 값과 조정해야합니다. 이것은 디자이너가 입력 한 텍스트 값을 저장하지 않고 텍스트를 가져 와서 컨트롤에 배치 할 수있는 값으로 변환하는 이유 중 하나입니다. 그것을 직렬화해야 할 때 그냥 컨트롤의 속성을 읽고 그들을 씁니다. 저장하기 전에 십진법의 세부 사항을 조사하여 사용할 생성자를 최적화하는 것이 중요하지 않습니다. 10 진수 형식의 가능한 모든 값을 처리해야하므로 int []는 십진수가 나타내는 모든 값에 대해 왕복 안정적인 저장 메커니즘을 제공합니다.

BTW, 다음 소수의 내부 구성을 간략하게 설명

  • 비트는 32 비트 부호있는 정수 네 소자 어레이이다.
  • 비트 [0], 비트 [1] 및 비트 [2]에는 96 비트 정수의 하위, 중간 및 상위 32 비트가 포함됩니다.
  • 비트 [3]은 스케일 팩터 및 기호를 포함하고, 다음의 부분으로 구성
    • 비트 0 하부 단어 (15), 미사용 제로이어야한다.
    • 비트 16에서 23까지는 0에서 28 사이의 지수를 포함해야합니다.이 지수는 정수를 나눌 10의 지수를 나타냅니다.
    • 비트 24-30은 사용되지 않으므로 0이어야합니다.
    • 비트 31에는 부호가 있습니다. 0은 양수를 의미하고 1은 음수를 의미합니다.

업데이트 :

당신이 "설명 할 ... 비주얼 디자이너는 이러한 값을 수정할 수 있기 때문에 ... 그것은 컨트롤의 값에 대해이 스토리지를 조정해야 할 것입니다 직렬화 중 ... "자세히 설명하겠습니까?

확실히."디자이너가 왜 값을 입력하는 대신 양식을 사용합니까?"라는 질문에 대한 문자 적 ​​해석을 다루려고했습니다. 기본적으로 내가 말한 것은 디자이너가 "-65535"라고 입력 한 정확한 텍스트 값을 추적하지 않는다는 것입니다. 대신 decimal.Parse (...)와 같은 것을 사용하여 소수로 변환합니다. 그런 다음이 십진수를 컨트롤의 값 (이 경우 NumericUpDown.Minimum)에 배치합니다. 뒤이어 각 속성 값을 읽음으로써 xxxx.Designer.cs 파일에서 컨트롤의 상태를 serialize합니다. 따라서 입력 한 원본 텍스트 "-65535"의 복사본은 더 이상 없지만 결과 십진수 만 복사합니다.

"이 저장 조정 ..."을 참조하는 부분은 사용자가 입력 한 원본 텍스트를 추적하는 것뿐만 아니라 일부가 변경 한 값을 검색하는 것도 어렵다는 것을 지적하기위한 것입니다 other는 원본 텍스트 입력을 의미합니다.

죄송합니다. 여전히 혼란 스럽다면 문제를 설명하는 데 어려움이 있습니다. C#, C++, SQL 및 JScript 바로 뒤에 영어가 제 5 언어입니다. 모두 영어보다 의미가 훨씬 더 명확합니다.

+0

비주얼 디자이너도이 값을 수정할 수 있기 때문에 직렬화 중이 값을 컨트롤의 값과 조정해야합니다 ... 자세히 설명하겠습니까? – JeffH

0

스케일링을하지 않거나 더 빠른 증가/감소 작업을 수행하지 않고 다른 소수 자리와의 비교를 빠르게하기 위해 소수점의 지수 부분을 0으로 강제하는 조기 최적화가있을 수 있습니다.

this.myNumericUpDown.Minimum = new decimal(new int[] { 
    65535, 
    0, 
    0, 
    -2147483648}); // -2147483648 == 10000000000000000000000000000000b 
        // => only sign bit is set 
+0

십진수가 생성 된 후에는 십진수가 생성 된 후에는 동일한 내부 표현이 사용됩니다 (Int32 []) 걸리는 생성자 또는 (Int32) 걸리는 생성자 Visual Studio 디자이너가 사람이 읽을 수없는 생성자를 사용하여 소수를 만드는 이유를 아직도 모르겠다 – JeffH

+0

대부분의 경우 디자이너 코드는 사람이 읽을 수 없으므로 VS 개발자에게는 문제가되지 않습니다. – Pedro

+0

@Pedro - VS 개발자는 (Int32) 양식을 통해 (Int32 []) 형식의 생성자를 선택해야했습니다. (Int32 []) 형식은 더 자세한 정보이므로 오류가 발생하기 쉽습니다. 내 질문은 : * 왜 * VS 개발자가 더 복잡하지만 외관상으로 동등한 생성자를 사용하겠습니까? – JeffH

관련 문제