我今天在一些图形库中看到过这样的东西,看起来它可能非常有用。
在演示中,我看到它看起来像这样:
Texture2D texture = Content.Load<Texture2D>("Textures//Road");
Effect shader = Content.Load<Effect>("Effects//Road");
我认为它是一个函数,它返回&lt;&gt;中定义的任何类型。括号,并针对不同类型执行不同的操作。
我想自己实现类似的东西,它是如何使用的?
答案 0 :(得分:9)
它被称为泛型。
public T ConvertValue<T>(Object value)
{
return (T)Convert.ChangeType(value, typeof(T));
}
答案 1 :(得分:4)
Load
方法可用于加载大量不同类型的内容,包括图像和声音等内容。因此,它可能会返回不同类型的实例(例如您的Texture2d
和Effect
)。
创建可以执行此操作的方法有两种方法。首先,最简单的说,您可以返回Object
,这是.NET和XNA世界中每种类型的基类。
public object Load(string path) { /*...*/}
你必须这样使用它:
Texture2D texture = (Texture2D)Content.Load("Textures//Road");
第二种方法是使用泛型。使用泛型,您可以为用户处理强制转换,使其代码更简单。此方法的通用版本为:
public T Load<T>(string path)
{
return (T)Load(path);
}
你仍在使用旧的加载,但是在返回值之前你正在执行强制转换(对于任何类型的T)。
泛型非常有用,因为您可以使用它们来创建类型安全的代码,而无需创建大量特定于类型的方法版本,例如
public Texture2d LoadTexture2d(string path)
{
return (Texture2d)Load(path);
}
public Effect LoadEffect(string path)
{
return (Effect)Load(path);
}
//500 more versions omitted for brevity
答案 2 :(得分:2)
它称为Generics是为Type Independent编程指定方法和类的好方法。泛型允许您定义类型安全的数据结构,而无需提交实际的数据类型。这样可以显着提高性能并提高质量代码,因为您可以重用数据处理算法而无需复制特定于类型的代码。
public class Stack<T>
{
T[] m_Items;
public void Push(T item)
{...}
public T Pop()
{...}
}
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
int number = stack.Pop();
上面的类适用于任何类型的字符串或自定义类的对象 在这里查看完整描述
http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx#csharp_generics_topica
和
http://msdn.microsoft.com/en-us/library/512aeb7t%28VS.80%29.aspx
答案 3 :(得分:0)
Load方法确实定义了应该返回的内容,因此已经为您定义了。在Load方法中,contentLoader决定如何加载它。在加载您自己的数据类型时,还有一些XNA示例。如果您创建类似:.world
- 文件的内容。您可以创建自己的AssetLoader,指定如何加载您自己的数据类型。