Что мне следует использовать - структуру или класс?

Я нахожусь в дилемме классического дизайна. Я пишу структуру данных C # для содержания кортежа значений и единиц измерения (например, 7,0 миллиметра), и мне интересно, следует ли использовать ссылочный тип или тип значения.

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

Кортеж является частью довольно общей структуры результатов анализа, где результаты по-разному представляются в приложении WPF в зависимости от типа значения результата. Этот вид слабой типизации исключительно хорошо обрабатывается WPF со всеми его шаблонами данных, преобразованием значений и селекторами шаблонов. Подразумевается, что значение будет подвергаться множеству упаковок / распаковок, если мой кортеж представлен как структура. Фактически использование кортежа в выражениях будет второстепенным по сравнению с использованием в сценариях бокса. Чтобы избежать всего этого, я рассматриваю возможность объявления своего типа как класса. Еще одно беспокойство по поводу структуры заключается в том, что при двусторонней привязке в WPF могут быть подводные камни, поскольку было бы легче получить копии кортежей где-нибудь в коде, чем ссылочные копии.

У меня также есть несколько удобных операторов. перегрузка. Я могу без проблем сравнивать миллиметры с сантиметрами, используя перегруженные операторы сравнения. Однако мне не нравится идея перегрузки == и! =, Если мой кортеж является классом, поскольку по соглашению == и! = Являются ReferenceEquals для ссылочных типов (в отличие от System.String, что является еще одним классическим обсуждением). Если == и! = Перегружено, кто-то напишет if (myValue == null) и получит неприятное исключение времени выполнения, когда myValue однажды окажется нулевым.

Еще один аспект заключается в том, что существует В C # (в отличие, например, от C ++) нет четкого способа различать ссылочные типы и типы значений при использовании кода, но семантика сильно различается. Я беспокоюсь, что пользователи моего кортежа (если объявлена ​​структура) предполагают, что тип является классом, поскольку большинство настраиваемых структур данных являются и предполагают ссылочную семантику. Это еще один аргумент, почему следует отдавать предпочтение классам просто потому, что это то, чего ожидает пользователь, а "." / "->", чтобы различить их. В общем, я бы почти всегда использовал класс, если мой профилировщик не сказал мне использовать структуру, просто потому, что семантика класса наиболее вероятна для других программистов, а C # дает лишь туманные намеки на то, одно это или другое.

у меня следующие вопросы:

Какие еще соображения мне следует учесть при принятии решения о выборе значения или ссылки?

Может ли == /! = перегрузка в классе быть оправдана в любых обстоятельствах?

Программисты предполагают разные вещи. Большинство, вероятно, предположит, что нечто, называемое «Точкой», является типом значения. Что бы вы подумали, если бы прочитали какой-то код с "UnitValue" функция show_keys ($ ar) {foreach ($ ar as $ k => $ v) {$ temp [] = $ k; если (is_array ($ ar [$ k])) {show_keys ($ ar [$ k]); }} ...

$temp = array();
function show_keys($ar)
{
    foreach ($ar as $k => $v )
    {
        $temp[] = $k;
        if (is_array($ar[$k]))
        {
            show_keys ($ar[$k]);
        }
    }

    return $temp;
}

Я пробовал использовать эту функцию, но она все равно возвращает только первый ключ.

6
задан HyderA 6 October 2010 в 13:17
поделиться