2015-02-18 7 views
2

Это может быть глупый вопрос, но здесь идет:Хорошая практика использования соответствующих типов данных?

Я не уверен, что это привычка, лень или правильная вещь. Но я нахожу себя в использовании типов данных, которые мне просто не нужны, для обеспечения последовательности, и сделать вещи немного проще для кода позже (например, для типов данных).

Позвольте мне показать вам пример:

public int Number1 { get; set; } 

Number1 просто обычный целое число, но представьте себе ситуацию, в которой он будет всегда (или должен быть) быть положительным числом, так Я мог бы использовать uint вместо int.

Однако одна из проблем с использованием большого количества разных типов данных - это риск использования явного литья, поэтому у меня будет много шумного кода. Использование общих типов данных, таких как int, позволяет уменьшить шум, но может ли это повлиять на общую производительность приложения по сравнению с литьем?

int one = 2; 
uint two = 1; 

one = (int)two; 

Этот шум не обязательно плохой, но это может быть неприятно. Также может возникнуть проблема, когда uint может быть выше максимального значения int.

Я нахожу, что во многих примерах int, по-видимому, является очень часто используемым типом данных для работы с целыми числами, я редко вижу другие используемые типы данных. Почему это?

Есть ли что-то неправильное в использовании «неправильных» типов данных, эффективнее ли использовать int, а не uint или короткий ect?

Заранее спасибо.

+0

Ваш вопрос конкретно о типах номеров или о типах вообще? – milleniumbug

+0

Мой вопрос в особенности о встроенных типах C#. –

ответ

4

Лучше всего, чтобы не просто использовать знак или без знака числа, основанного на природе объектов, которые вы хотите, чтобы представить, но на самом деле объявить совершенно новый тип данных для каждого типа объекта, который вам имеют дело с.

Так, например, температура требует знакового числа, но лучше всего объявить новый тип значения «Температура». (struct Temperature)

Красота C# является то, что:

  1. Если struct Temperature не содержит ничего, кроме float, она будет занимать ровно столько памяти, как поплавок будет, и это будет столь же эффективным, как float. (Весь struct будет роздан в реестре так же, как float бы.)

  2. Вы можете перегрузить операторы, в том числе операторов типа литых, включая оператор литых неявного типа, поэтому, если температура должна быть свободно взаимозаменяемы с каким-либо другим типом сущности, вы можете перегрузить соответствующие операторы и добиться этого без каких-либо тиков.(См https://msdn.microsoft.com/en-us/library/85w54y0a.aspx)

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

Поправка

Практик определение специального типа данных для каждого различного типа количества вы имеете дело с является производным от, и в соответствии с ними, практика Физики всегда следовать каждому члену уравнения с единицами этого термина. Таким образом, длина никогда не является просто значением 5, это всегда значение 5 metres (в SI), а также ускорение никогда не просто равное 9.8 значение, оно всегда является значением 9.8 metres per second squared. Это имеет тенденцию делать это очень очевидным, когда совершается ошибка, и, следовательно, минимизирует шансы на это. Например, пытаясь использовать значение в сантиметрах в уравнении, которое ожидает метры, а также (что еще более важно) пытается использовать значение скорости в уравнении, которое ожидает значение ускорения. Для получения дополнительной информации об этом, см, например, это: https://physics.stackexchange.com/q/138841

Совершение ошибок очевидно было также первоначальное намерение венгерской нотации (см https://en.wikipedia.org/wiki/Hungarian_notation), хотя в то время это не было действительно возможно с языком C, чтобы определить другое тип данных для каждого вида стоимости и поддержания производительности. Таким образом, они просто исказились именами переменных.

С современными языками, такими как C#, мы можем, наконец, объявить наши собственные эффективные типы, чтобы ошибки замены типа данных были не просто легче поймать, но на самом деле невозможно сделать.

+0

Я не согласен. Если вы начнете это делать, вы создадите целый беспорядок не-взаимодействующих типов, и вы добавите кучу шума с небольшой фактической выгодой. –

+0

Это интересная идея @Mike, можете ли вы предоставить какие-либо полезные учебные ресурсы, которые помогут укрепить мое понимание того, что вы предлагаете? –

+0

@ JonathonReinhart, конечно, каждый имеет право на собственное мнение. Я поправил свой ответ, объяснив немного больше моих рассуждений. –

2

Прежде чем взглянуть на производительность, увидеть, если правильность вашей программы скомпрометирован этим заданием:

one = (int)two; 

имеет потенциал перелива int, что гораздо хуже, чем просто потеря нескольких процессоров циклы.

Если вы знаете, что не будет переполнения, потому что вы продезинфицировать значения из unsigned переменных (в данном случае, two меньше или равна int.MaxValue), то вы можете также использовать int. Причины перехода на неподписанный тип данных состоят в том, чтобы получить дополнительный бит или заставить все операции обрабатывать число как unsigned, чтобы не повысить производительность или сделать неявное подтверждение.

0

В .NET Framework, даже для положительных или нулевых значений, Microsoft выбрала использование int или long вместо uint или ulong. Почему: потому что проще избежать приведения типов между подписанными и неподписанными типами и потенциальным исключением при изменении знака на подстроках, которые могут подразумевать целые числа без знака.

Итак, что использует только позитививные или нулевые значения для значения int: используется только 31 из 32 бит. Не проблема: у нас много памяти.

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

Какова хорошая практика: если вы используете значения от 0 до 2 000 000 000, используйте int, если вы хотите быть простым в использовании, используйте ints или longs. Если влияние использования памяти имеет решающее значение, использование данных носит двоичный характер (биты изображений, звуки, ...) или эффективность алгоритма требует использования uint или ulong, используйте их, но будьте осторожны во время субтракций: вычитая число выше, чем значение первый операнд будет генерировать исключение ArithmeticOverflowException.

Смежные вопросы