2016-08-11 4 views
0

У меня есть класс под названием «Плитки».Передача массива объектов на функцию

public class Tiles 
{ 

    public int cordX, cordY, tileID; 
    Booleans someBooleans; 
    public constructor(int X,int Y,int ID) 
} 

Программа создает информацию 2D-сетки и сохраняет (XY-позиционный, tileID) в массиве объектов класса Tiles. Как это:

Создать новый массив объектов

Tiles[] tileArray = new Tiles[totalGridSize]; 

Loop через два раза, чтобы создать экземпляр отдельных элементов в массиве объектов

tileArray[X + Y] = new Tiles(xPos, yPos, ID); 

До сих пор все работает, как ожидалось. Но теперь я хочу передать элементы tileArray функции. (Это хорошо для функции статичным?)

public static void tileStatusChecker(Tiles x[])<--- 
{  

    Console.WriteLine("Position is {0}X and {1}Y. ID=={2}", x.cordX, x.cordY, x.tileID)  
} 

== Это дает мне ошибку:

Error CS1552 Array type specifier, [], must appear before parameter name

Справедливо, что должно быть легко исправить.

public static void tileStatusChecker(Tiles[] x) 
{ 

    Console.WriteLine("Position is {0}X and {1}Y. ID=={2}", x.cordX, x.cordY, x.tileID)  
} 

Теперь компилятор действительно сердитесь на меня: CS1061 «Плитки []» не содержит определение для «tileID» и без метода расширения «tileID» принимать первый аргумент типа "Плитка [] (вы не можете найти директиву или ссылку на сборку?)

Одновременно компилятор также злится на меня за вызов функции в первую очередь, объявление массива никогда не создавалось.

Tiles.tileStatusChecker(tileArray[7]); 

CS0103 The name 'tileArray' does not exist in the current context

У меня есть стандарт «узнать C# и Visual Studio» книги рядом со мной, но массивов объектов не охвачены вообще. И я думаю, что фактическая ошибка здесь заключается в том, что я не знаю, что я делаю. Так может ли кто-нибудь сказать мне, как передать массив объектов методу? Я не хочу просто скопировать + вставить код и попросить кого-нибудь его исправить. Я попытался найти решение здесь в stackoverflow, но в итоге получилось 10,214 результатов после поиска «массив объектов C# для работы» или аналогичный.

+0

Пожалуйста, уделите больше времени, чтобы отформатировать код. У вас нет отступов вообще, и в какой-то момент у вас есть тело метода в той же строке, что и '{'. Вы должны стремиться сделать этот вопрос максимально простым для чтения. –

+1

Но похоже, что вы действительно не заинтересованы в передаче целого массива, а в одной плите. Просто измените 'Tiles []' на 'Tile', и это должно исправить обе проблемы. В конце концов, значение 'tileArray [7]' является ссылкой «Tiles», а не массивом ... и идея распечатать «положение массива» бессмысленна. Теперь было бы подходящее время для поиска соглашений об именах .NET. –

+0

Ну, я предлагаю вам создать вашу среду IDE для форматирования кода и убедиться, что это похоже на вопрос. (Неясно, что такое Booleans ...) –

ответ

1

EDIT: Упс, я пропустил небольшую деталь и полностью ответил на ваш вопрос. Теперь ясно, что вы фактически не хотите передавать Array в свою функцию, учитывая, что вы вызвали вашу функцию с помощью правильной ссылки для доступа. Если вы переписываете свою функцию, чтобы взять , а не Tiles[], вам должно быть хорошо. Все ваши проблемы возникают из-за того, что ваш код ожидает, что x будет , в то время как ваше объявление функции ожидается x должно быть Tiles[].

Не стесняйтесь игнорировать следующий фрагмент кода, но определенно нажмите на заметку в конце.

Ваш второй выстрел был лучше, чем с первой попытки, вручая в массиве к функции действительно должна выглядеть

public static void tileStatusChecker(Tiles[] x) 

, но ваш следующий код, который пытается получить значения, как «x.cordX», будет не найти их - в массивах нет .CordX; Плитки (ы) имеют .CordX. Если вы хотите на самом деле получить Tiles, вам нужно, скажем, первый (или технически «нулевой») элемент в x, который является x [0]. НАПРИМЕР.первый шнур CordX будет x [0] .CordX.

Side-note: Это часто помогает мне писать и говорить о моем коде, чтобы выбрать имена, соответствующие грамматической структуре вещи, которую я называю. Если это объект, я обычно называю его чем-то вроде Object, например. если класс представляет собой плитку, я бы назвал ее «Плитка», а не «Плитки». Если у вас есть второй класс, представляющий коллекцию Tiles, как обертка вокруг двухмерного массива (как я буквально делал в прошлом), , то Я бы назвал его Tiles.

+0

Да, если я изменю его на tileStatusChecker (Tiles [int] x) и данные, к которым функция обращается к x [int] .cordY, это действительно работает. – Freeman0x5C

+0

Я уверен, что я попытался так выразиться, но по какой-то причине это не сработало, возможно, потому, что я слишком много играл с «статическими» аксессуарами. Теперь единственное, что мне нужно решить, - это [CS0119 «Плитки» - это тип, который недействителен в данном контексте], когда я действительно вызываю функцию. Но это стандартное устранение неполадок. В любом случае Thx много! Я застрял там 2-3 часа. наконец, я могу отправлять новые сообщения об ошибках Google. – Freeman0x5C

+0

http://cube-drone.com/comics/c/progress Tiles.functionName (args); работает только в том случае, если functionName является статической функцией, определенной внутри класса Tiles. Удачи! Рад был помочь. –

Смежные вопросы