c # Инициализация массива определенного с помощью метода - PullRequest
0 голосов
/ 23 февраля 2012

Я пытаюсь инициализировать вновь созданный пустой массив с помощью метода.Пример ниже.Это структура кода, который я хочу создать.

var v = exClass[5,5];
v.ExtensionMethodThatWillInitilize();

То, что я хочу сделать ExtensionMethodThatWIllInitilize, следующее:

for(int y = 0 ; y < exClass.getLength(0); y++ ) {
for(int x = 0 ; x < exClass.getLength(1); x++ ) {
v[y,x] = new instanceObject();
}}

Итак, я придумал следующий код ...

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        var oldEx = new ExClass[10, 10];
        var newEx = oldEx.init();
    }
}
public class ExClass
{
    public string exString
    public ExClass() {
    exString = " I AM NEW! YES! ";
 }
}
public static class tools
{
    static public ExClass[,] init(this ExClass[,] start)
    {
        var newArray = new ExClass[start.GetLength(0), start.GetLength(1)];
        for (int y = 0; y < start.GetLength(0); y++)
        {
            for (int x = 0; x < start.GetLength(1); x++)
            {
              newArray[y, x] = new ExClass();
            }
        }
        return newArray;
    }
}

Но проблема в том, что я не знаю, как изменить мой метод init, чтобы он мог принимать любой тип массива и возвращать соответствующий массив, который был инициализирован.Я пытался использовать универсальный тип T, но мой недостаток опыта, похоже, не помог.

Summery:

1) как вы пришли к методу, который за один шаг инициализирует пустой массив.

2) как убедиться, что метод может инициализировать массив любого типа (при условии, что элемент в массиве имеет конструктор, который не принимает аргументов)

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Проверьте этот универсальный метод, который использует общее ограничение new:

 static public void Init<T>(this T[,] array) where T : new()
 {
    for (int y = 0; y < array.GetLength(0); y++)
    {
       for (int x = 0; x < array.GetLength(1); x++)
       {
          array[y, x] = new T();
       }
    }
  }

Основные отличия от вашего кода:

1) Метод Init для указания универсального параметра, а ограничение where T : new() гарантирует, что мы можем вызвать new T();

2) Вместо того, чтобы возвращать новый инициализированный массив, я просто инициализирую массив на месте. Кажется более логичным. Если хотите, можете использовать свою оригинальную версию, но я не понимаю, зачем вам это нужно.

1 голос
/ 23 февраля 2012

Дженерики работают. Вам необходимо объявить ваш метод как универсальный тип.

Я изменил приведенный выше пример следующим образом:

class Program
{
    static void Main(string[] args)
    {
        var oldEx = new ExClass[10, 10];
        var newEx = oldEx.init<ExClass>();
    }
}
public class ExClass
{
    public string exString = "I AM NEW";
}
public static class tools
{
    static public T[,] init<T>(this T[,] start)
    {
        var newArray = new T[start.GetLength(0), start.GetLength(1)];
        for (int y = 0; y < start.GetLength(0); y++)
        {
            for (int x = 0; x < start.GetLength(1); x++)
            {
                newArray[y, x] = Activator.CreateInstance<T>();
            }
        }
        return newArray;
    }
}

В качестве ответа на ваш комментарий ниже:

class Program
{
    static void Main(string[] args)
    {
        var oldEx = tools.init<ExClass>(10, 10);

    }
}
public class ExClass
{
    public string exString = "I AM NEW";
}
public static class tools
{
    static public T[,] init<T>(int x,int y)
    {
        var newArray = new T[x, y];
        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                newArray[i, j] = Activator.CreateInstance<T>();
            }
        }
        return newArray;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...