функция типа <type>() - PullRequest
       3

функция типа <type>()

3 голосов
/ 20 января 2011

Я видел что-то подобное в некоторых графических библиотеках сегодня, и кажется, что это может быть очень полезно.

В демонстрации я увидел, что это выглядело так:Предположим, что это функция, которая возвращает любой тип, определенный в скобках <>, и выполняет разные действия для разных типов.

Я хочу реализовать что-то подобное сам, как это используется?

Ответы [ 4 ]

9 голосов
/ 20 января 2011

Это называется generics .

Пример:

public T ConvertValue<T>(Object value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}

Ссылки:

Универсальные (Руководство по программированию в C #)

4 голосов
/ 20 января 2011

Метод 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 голосов
/ 20 января 2011

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

Простой пример стека:

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

0 голосов
/ 20 января 2011

Метод Load действительно определяет, что он должен возвращать, и поэтому он уже определен для вас. Внутри метода Load contentLoader решает, как его загрузить. Также есть пара примеров XNA для загрузки ваших собственных данных. Если вы создаете что-то вроде: .world -файла. Вы можете создать свой собственный AssetLoader, который определяет, как загружать ваши собственные данные.

  1. http://create.msdn.com/en-US/education/catalog/sample/custom_model_importer
  2. http://msdn.microsoft.com/library/bb447743.aspx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...