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

Примеры использования Generics в .Net(С#/VB.NET)

Каковы некоторые примеры использования генераторов в С#/VB.NET и почему вы хотите использовать дженерики?

4b9b3361

Ответ 1

Просто вы объявляете тип или метод с дополнительными тегами для указания общих битов:

class Foo<T> {
    public Foo(T value) {
        Value = value;
    }
    public T Value {get;private set;}
}

Вышеописанный тип Foo "T", где T предоставляется вызывающим. По соглашению, общие аргументы типа начинаются с T. Если есть только один, T в порядке - в противном случае назвать их все полезно: TSource, TValue, TListType и т.д.

В отличие от шаблонов С++, генерические файлы .NET предоставляются во время выполнения (а не в трюках компилятора). Например:

Foo<int> foo = new Foo<int>(27);

Все T были заменены на int в приведенном выше. При необходимости вы можете ограничить общие аргументы ограничениями:

class Foo<T> where T : struct {}

Теперь Foo<string> откажется компилировать - поскольку string не является структурой (value-type). Допустимые ограничения:

T : class // reference-type (class/interface/delegate)
T : struct // value-type except Nullable<T>
T : new() // has a public parameterless constructor
T : SomeClass // is SomeClass or inherited from SomeClass
T : ISomeInterface // implements ISomeInterface

Ограничения могут также включать другие общие аргументы типа, например:

T : IComparable<T> // or another type argument

У вас может быть столько общих аргументов, сколько вам нужно:

public struct KeyValuePair<TKey,TValue> {...}

Другие примечания:

  • статические члены и т.д. определены для общей комбинации типов - поэтому статическое поле на Foo<int> отличается от статического поля на Foo<float>. Методы
  • также могут быть общими - старайтесь избегать использования тех же имен, что и класс, поскольку вы не сможете устранить проблему
  • вложенные типы наследуют родовые типы от своих родителей.

например:

class Foo<T> {
    class Bar<TInner> {} // is effectively Bar<T,TInner>, for the outer T
}

Ответ 2

Пример 1: вы хотите создать трехлокальный класс

Class Triple<T1, T2, T3>
{
   T1 _first;
   T2 _second;
   T3 _Third;
}

Пример 2: Вспомогательный класс, который будет анализировать любое значение перечисления для заданного типа данных

static public class EnumHelper<T>
{
   static public T Parse(string value)
   {
       return (T)Enum.Parse(typeof(T), value);
   }
}

Ответ 3

Одно общее и чрезвычайно полезное использование дженериков - это строго типизированные классы коллекций. Традиционно всем классам коллекции пришлось передавать объекты и возвращать объекты при запросе. Вы должны были обработать все преобразования типов самостоятельно. С дженериками вам не обязательно это делать. Вы можете иметь List (Of Integer), и когда вы запрашиваете значения из него, вы получите целые числа. Вы не получите объекты, которые затем вам нужно преобразовать в целые числа.

Ответ 4

Наиболее распространенные причины и варианты использования дженериков описаны в документации MSDN, упомянутой ранее. Одно из преимуществ дженериков, которые я хотел бы добавить, заключается в том, что они могут улучшить поддержку инструмента в процессе разработки. Инструменты рефакторинга, такие как интегрированные в Visual Studio или ReSharper, основаны на анализе статического типа для предоставления помощи при кодировании. Поскольку генераторы обычно добавляют больше информации о типе к вашей объектной модели, есть больше информации для таких инструментов для анализа и для помощи в кодировании.

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

Ответ 5

    private void button1_Click_1(object sender, RoutedEventArgs e)
    {
        TextValue<string, int> foo = new TextValue<string, int>("",0);
        foo.Text = "Hi there";
        foo.Value = 3995;
        MessageBox.Show(foo.Text);
    }

    class TextValue<TText, TValue>
    {
        public TextValue(TText text, TValue value)
        {
            Text = text;
            Value = value;
        }
        public TText Text { get; set; }
        public TValue Value { get; set; }
    }

Ответ 6

Базовый пример:

class Other{
 class Generic<T>
{
  void met1(T x);
}
static void Main()
{
  Generic<int> g = new Generic<int>();
  Generic<string> s = new Generic<string>();
}
}

Ответ 7

    private void button1_Click_1(object sender, RoutedEventArgs e)
    {
        TextValue<string, int> foo;
        List<TextValue<string, int>> listTextValue = new List<TextValue<string, int>>();
        for (int k = 0; k < 5; ++k)
        {
            foo = new TextValue<string, int>("",0);
            foo.Text = k.ToString();
            foo.Value = k;
            listTextValue.Add(foo);
            otherList.
            MessageBox.Show(foo.Text);
        }

    }

    class TextValue<TText, TValue>
    {
        public TextValue(TText text, TValue value){Text = text; Value = value;}
        public TText Text { get; set; }
        public TValue Value { get; set; }
    }