Почему указание числового значения свойства элемента управления в конструкторе приводит к появлению нового десятичного числа (new int [] {... в коде? - PullRequest
3 голосов
/ 06 октября 2009

В моем приложении C # .Net WinForm в VS2005 у меня есть элемент управления NumericUpDown. В конструкторе я установил свойство Minimum для NumericUpDown равным -65535.

В коде формы .designer.cs я ожидал увидеть это:

this.myNumericUpDown.Minimum = -65535;

но вместо этого я получаю:

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

Я знаю, что это значит, просматривая десятичный конструктор int32 [] , но почему дизайнер использует эту форму вместо ввода введенного мной значения или даже используя десятичный конструктор int32

Ответы [ 2 ]

3 голосов
/ 13 октября 2009

Теоретически, дизайнер может хранить ваш исходный текст. Тем не менее, поскольку визуальный конструктор также может изменять эти значения (т. Е. Left, Top и т. Д.), Он должен будет согласовать это хранилище со значениями элемента управления во время сериализации. Вероятно, это одна из причин, по которой дизайнер не сохраняет введенные текстовые значения, скорее он берет ваш текст и преобразует его в значение, которое можно поместить в элемент управления. Когда ему нужно сериализоваться, он просто читает свойства элемента управления и записывает их. Было бы мало смысла опрашивать детали десятичного числа перед хранением, чтобы просто оптимизировать, какой конструктор использовать. Он должен обрабатывать все возможные значения десятичного типа, поэтому int [] предоставляет механизм надежного хранения данных в обоих направлениях для любого значения, которое может представлять десятичное число.

Кстати, следующее описывает внутреннюю структуру десятичной дроби:

  • бит - это четырехэлементный массив 32-битных целых чисел со знаком.
  • биты [0], биты [1] и биты [2] содержат младшие, средние и старшие 32 бита 96-битного целого числа.
  • бит [3] содержит масштабный коэффициент и знак и состоит из следующих частей:
    • Биты от 0 до 15, нижнее слово, не используются и должны быть равны нулю.
    • Биты с 16 по 23 должны содержать показатель степени от 0 до 28, что указывает на степень 10 для деления целого числа.
    • Биты с 24 по 30 не используются и должны быть равны нулю.
    • Бит 31 содержит знак; 0 означает положительный, а 1 означает отрицательный.

Обновление:

Не могли бы вы объяснить "... поскольку визуальный конструктор также может изменять эти значения ... ... ему придется согласовать это хранилище со значениями элемента управления во время сериализации ..." более подробно?

Конечно. Я просто пытался ответить на буквальное толкование вашего вопроса «почему дизайнер использует эту форму вместо ввода введенного мной значения ». По сути, все, что я хочу сказать, это то, что дизайнер не отслеживает точное введенное вами текстовое значение "-65535". Вместо этого он преобразует его в десятичную с чем-то вроде decimal.Parse (...). Затем он помещает это десятичное число в значение элемента управления, в данном случае NumericUpDown.Minimum. После слов он сериализует состояние элемента управления в файле xxxx.Designer.cs, считывая каждое значение свойства. Таким образом, у него больше нет копии исходного текста «-65535», который вы ввели, а только полученное десятичное значение.

Часть, относящаяся к «согласованию этого хранилища ...», заключалась в том, чтобы просто указать, что будет трудно не только отслеживать исходный текст, введенный пользователем, но и определять, было ли это значение изменено каким-либо другим означает, что исходный текстовый ввод.

Извините, если это все еще сбивает с толку, у меня проблемы с описанием. Английский - мой пятый язык, прямо за C #, C ++, SQL и JScript, все они гораздо более понятны по смыслу, чем английский:)

0 голосов
/ 07 октября 2009

Это может быть некоторая преждевременная оптимизация, приводящая экспоненциальную часть десятичного числа к 0 для более быстрого сравнения с другими десятичными числами без необходимости масштабирования или для более быстрых операций увеличения / уменьшения.

this.myNumericUpDown.Minimum = new decimal(new int[] {
    65535,
    0,
    0,
    -2147483648}); // -2147483648 == 10000000000000000000000000000000b
                   // => only sign bit is set
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...