Подтвердить что ты не робот

Какова цель Tuple (T1)/Singleton в .net?

Один из типов Tuple в .net 4 - это Single-Element Tuple. Я просто задаюсь вопросом, какова цель этой структуры?

Единственное, что я видел, это использовать в 8+ Tuple, поскольку его можно назначить TREST, где это действительно имеет смысл. Это оно? Или есть другая цель?

4b9b3361

Ответ 1

Вам нужно будет спросить дизайнеров BCL быть уверенными, но я подозреваю, что, поскольку в реальном мире есть 1-кортеж, авторы платформы .NET хотели бы обеспечить эквивалентную симметрию в их реализации.

Tuples - это реализация .NET того, что вы считаете математической концепцией кортежа .

Теперь, когда вы запрашиваете использование программирования для Tuple<T>, я бы ответил и, что существуют языки .NET(например, F #), которые могут использовать Tuple<> для представления таких вещей, как return значения из функций. Так как функция F # может, конечно, вернуть 1-кортеж в результате - она ​​добавляет симметрию и согласованность с поведением и чувством языка.

Ваш пример с 8+ кортежами также, вероятно, является законным, поскольку свойство Rest может быть 1-кортежем для представления "переполнения" .

Ответ 2

Кортежи автоматически реализуют IStructuralComparable и IStructuralEquatable, между прочим. Это позволяет сравнивать и сортировать кортежи прямо из коробки. Из статьи Билла Маккарти в выпуске журнала Visual Studio в декабре 2009 года "Типы и кортежи в .NET 4":

Хотя кортежи могут выглядеть простыми и незаметными, они обеспечивают надежную типизацию и важную функцию сравнения и равенства. Кортежи полезны для границ метода, класса или даже машины.

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

Ответ 3

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

Ответ 4

Хотя это старый поток, я готовил ответ для Зачем использовать 1-кортеж, Tuple <T1 > в С#?, который теперь помечен как дубликат.

Одним из возможных вариантов использования 1-Tuple является возврат нулевого экземпляра, если нет значения, но этот нуль самого значения элемента не означает, что результата нет.

Например (не очень хороший пример реальной жизни, но, надеюсь, он передает точку)

    static List<string> List = new List<string> {"a", "b", null, "c"};

    static Tuple<string> GetItemAtIndex(int index)
    {
        if (index < 0 || index >= List.Count)
            return null;
        return Tuple.Create(List[index]);
    }

Вызывающий код будет знать, что когда сам кортеж имеет значение NULL, он не существует в списке, но если Item1 имеет значение null, на самом деле в списке был нулевой элемент. Конечно, в этом примере существует множество лучших обходных путей, но оно также может применяться к результату из базы данных: результат не найден или результат не равен нулю.

Расширяя эту же логику, Tuple можно использовать для простого создания общих методов, которые могут возвращать null для любого типа. Например

    static Tuple<T> GetSomething<T, RecType>(RecType rec, Func<RecType, T> fn)
    {
        if (rec == null) return null;
        //extra example, access would be checked by something like CheckCurrentUserAccess(rec)
        bool AccesDenied = true;
        if (AccesDenied) return null; //sometimes you don't want to throw an exception ;)

        return Tuple.Create(fn(rec));
    }

Вы можете вернуть Nullable<T>, но это будет работать только для структур, где это работает с любым типом, хотя int, string, int?, MyClass и т.д.