在.Net(C#/VB.Net)中使用泛型的示例

在.Net(C#/VB.Net)中使用泛型的示例,c#,.net,vb.net,generics,C#,.net,Vb.net,Generics,在C#/VB.NET中使用泛型的示例有哪些?为什么要使用泛型?简单地说,您可以使用额外的标记声明一个类型或方法来指示泛型位: class Foo<T> { public Foo(T value) { Value = value; } public T Value {get;private set;} } 上面的Ts已替换为int。如有必要,您可以使用以下约束限制泛型参数: class Foo<T> where T : struct

在C#/VB.NET中使用泛型的示例有哪些?为什么要使用泛型?

简单地说,您可以使用额外的标记声明一个类型或方法来指示泛型位:

class Foo<T> {
    public Foo(T value) {
        Value = value;
    }
    public T Value {get;private set;}
}
上面的
T
s已替换为
int
。如有必要,您可以使用以下约束限制泛型参数:

class Foo<T> where T : struct {}
约束还可能涉及其他泛型类型参数,例如:

Foo<int> foo = new Foo<int>(27);
T : IComparable<T> // or another type argument
class Foo<T> {
    class Bar<TInner> {} // is effectively Bar<T,TInner>, for the outer T
}
T:IComparable//或其他类型的参数
您可以根据需要使用任意数量的泛型参数:

public struct KeyValuePair<TKey,TValue> {...}
public结构KeyValuePair{…}
其他需要注意的事项:

  • 静态成员etc是根据泛型类型组合定义的,因此
    Foo
    上的静态字段与
    Foo
    上的静态字段是分开的
  • 方法也可以是泛型的-尽量避免使用与类相同的名称,因为您将无法消除歧义
  • 嵌套类型从其父类继承泛型类型
例如:

Foo<int> foo = new Foo<int>(27);
T : IComparable<T> // or another type argument
class Foo<T> {
    class Bar<TInner> {} // is effectively Bar<T,TInner>, for the outer T
}
class-Foo{
类Bar{}//实际上是Bar,用于外部T
}

示例1:要创建三重类

Class Triple<T1, T2, T3>
{
   T1 _first;
   T2 _second;
   T3 _Third;
}
三级
{
T1_优先;
T2秒;
T3三分之一;
}
示例2:将解析给定数据类型的任何枚举值的帮助器类

static public class EnumHelper<T>
{
   static public T Parse(string value)
   {
       return (T)Enum.Parse(typeof(T), value);
   }
}
静态公共类EnumHelper
{
静态公共T解析(字符串值)
{
返回(T)Enum.Parse(typeof(T),value);
}
}

前面提到的MSDN文档中描述了泛型最常见的原因和用例。我想补充的泛型的一个好处是,它们可以增强开发过程中的工具支持。像那些集成在VisualStudio或ReSharper中的重构工具依赖于静态类型分析在编码时提供帮助。由于泛型通常会向对象模型添加更多类型信息,因此此类工具可以分析更多信息并帮助您编写代码


在概念层面上,泛型可以帮助您独立于应用程序领域解决“交叉”问题。无论您是在开发金融应用程序还是在开发书店,您迟早都需要维护物品的集合,无论是帐户、书籍还是其他。此类集合的实现通常需要对这些集合中要维护的内容知之甚少甚至一无所知。因此,.NET framework附带的泛型集合是泛型用例的主要示例。

泛型的一种常见且非常有用的用法是强类型集合类。传统上,所有集合类都必须传递对象,并在查询时返回对象。您必须自己处理所有类型转换。对于泛型,您不必这样做。您可以有一个(整数的)列表,当您从中请求值时,您将得到整数。您将无法获得随后必须转换为整数的对象。

私有无效按钮1\u单击\u 1(对象发送方,路由目标)
    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; }
    }
{ TextValue foo=新的TextValue(“,0); foo.Text=“你好”; foo.Value=3995; MessageBox.Show(foo.Text); } 类文本值 { 公共文本值(TText-text,TValue-value) { 文本=文本; 价值=价值; } 公共TText文本{get;set;} 公共TValue值{get;set;} }
私有无效按钮1\u单击1(对象发送者,路由目标)
{
TextValue foo;
List listTextValue=新列表();
对于(int k=0;k<5;++k)
{
foo=新文本值(“,0);
foo.Text=k.ToString();
foo.Value=k;
listTextValue.Add(foo);
其他列表。
MessageBox.Show(foo.Text);
}
}
类文本值
{
公共文本值(TText text,TValue value){text=text;value=value;}
公共TText文本{get;set;}
公共TValue值{get;set;}
}

一个基本的例子是:

class Other{
 class Generic<T>
{
  void met1(T x);
}
static void Main()
{
  Generic<int> g = new Generic<int>();
  Generic<string> s = new Generic<string>();
}
}
其他类{
类泛型
{
void-met1(tx);
}
静态void Main()
{
Generic g=新的Generic();
泛型s=新泛型();
}
}

这个问题太笼统了。你说的是开放泛型还是封闭泛型?主要是,一个人将如何“使用”它们或如何“制造”它们?或者两者都有?sambo99是怎么说的?所以需要一个“过于模糊”的答案来补充“过于本地化”的答案。出于好奇(泛型的新手)-为什么我们必须在类名后面加上?@JᴀʏMᴇᴇ 用作占位符,直到定义挂接为止up@JᴀʏMᴇᴇ 如果您愿意,它可以是
T
只是“它所属的事物”的惯例;例如,
列表
是类型为
T
的元素列表;
Dictionary
是一个包含
TKey
类型的键和
TValue
类型的值的字典,直到今天的复兴之前,我完全忘记了这个线程。从那时起,我已经使用了很多泛型,但仍然感谢您的回答——我相信它们对于其他有同样问题的人来说会很方便。