Массивы классов данных в C # - PullRequest
0 голосов
/ 22 июня 2010

Я возился с этим целую вечность, и я не становлюсь ближе.Моя текущая версия, как показано ниже.Комментарии - это то, что я думаю я делаю.Семантика - это в основном порядковый номер (например, номер дома) и список атрибутов в массиве.Затем создайте массив 'улица'.Я хочу иметь возможность обновлять значения всех элементов в текущей области.Класс определен настолько высоко, насколько возможно, чтобы сделать область видимости глобальной.Мой окостеневший мозг «С» не совсем понимает такие вещи, как списки и IEnumerable, поэтому я не пытался идти по этому пути.Парсер кода в редакторе немного запутал это - извините.

public class house 
{

      // Ok, looking at this from the world of 'C' and thinking 'struct' like,
      // I put my variables here.

      public int my_id;
      public long [] pl_id;

      public house()
      {
         // I try to initialise the starting values, so I can carry out some tests later.
         my_id = 0;
         pl_id = new long[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
      }
  }

// I attempt to inform the compiler that I will be wanting an array of the house objects
// and call that array 'new_house'. Again, the code editor isn't keen.

  house [] new_house;

    private void button1_Click(object sender, EventArgs e)
    {
      // In the programs main routine (not *main*!), I then try to get the
      // array 'new_house' populated with initialised 'house' objects 
      for (int idx = 0; idx < 10; idx++)
       {
          new_house[idx] = new house();
       }

       // And at some point in the future I wish to set or update the values arbitrarily. eg:
        new_house[7].my_id = 123;
        new_house[7].pl_id = 345678;
        // any combination of attributes and id numbers is possible, so I use zero simply to see if they have been set, with -1 indicating failure / an absence of data-
    }
}

Верно.Как я уже сказал, я пробовал много разных способов сделать это, и главная проблема, которую я получаю, заключается в том, что я, кажется, никогда правильно не инициализирую массив 'new_house' и не получаю нулевые исключения, когда пытаюсь что-то назначить.Я не могу поверить, что то, что кажется настолько интуитивно простым, может быть настолько сложным для кодирования, поэтому, где я понял это неправильно (и я полностью согласен, что в приведенном выше тексте может быть более одной концептуальной ошибки или ошибки кодирования).

Комментарии о целесообразности подхода и помощи в кодировании, с благодарностью приняты.

Ответы [ 6 ]

1 голос
/ 22 июня 2010

Вам нужно создать экземпляр массива перед его инициализацией:

house[] new_house = new house[10];

Замените 10 на желаемое количество элементов.

Если вы этого не сделаетезнать число, использовать список:

List<house> new_house = new List<house>()

Затем вы можете динамически добавлять элементы, используя new_house.Add(item) и получать к ним доступ в цикле foreach или через индекс new_house[i]

1 голос
/ 22 июня 2010

Первая очевидная проблема с вашим кодом состоит в том, что ваш конструктор не имеет того же имени, что и класс. Должно быть так:

public house()
{
   // ...
}

Второй момент: вам вообще не нужен конструктор:

public int my_id = 0;   // The "= 0" is actually not needed here either.
public long[] pl_id = new long[10];

Я бы также предложил, чтобы вы не использовали массивы для таких вещей, как дома на улице, потому что номера домов не обязательно будут последовательными. Вы можете иметь пропуски и даже несколько домов с «номерами» 5А и 5В. Словарь может быть лучшим выбором.

IDictionary<string, house> houses = new Dictionary<string, house>();

Если вы действительно хотите иметь последовательную нумерацию, вы можете рассмотреть List<house> вместо массива, чтобы его можно было легко расширять при строительстве новых домов.

Наконец, я бы посоветовал использовать PascalCase для классов. Это сделает ваш код намного проще для чтения, если вы будете использовать те же стандарты, что и остальная часть .NET Framework.

0 голосов
/ 22 июня 2010

Используйте List<T> для этих коллекций.Старайтесь не говорить, что вы чего-то не понимаете, потому что вы 'c' зависимы.Попробуйте сами сказать, что хотите попробовать что-то новое и найти хорошее решение

namespace Myprog
{
// I attempt to inform the compiler that I will be wanting an array of the house objects
// and call that array 'new_house'

  List<house> houselist = new List<house>();

    private void button1_Click(object sender, EventArgs e)
    {
      // In the programs main routine (not *main*!), I then try to get the
      // array 'new_house' populated with initialised 'house' objects 
      for (int idx = 0; idx < 10; idx++)
       {
          houselist.add(new house());
       }

       // And at some point in the future I wish to set or update the values arbitrarily. eg:
        houselist[7].my_id = 123;
        // any combination of attributes and id numbers is possible, so I use zero simply to see if they have been set, with -1 indicating failure / an absence of data-
    }
  }
}
0 голосов
/ 22 июня 2010

не публичная игра ()

право: публичный дом ()

Всегда имя конструктора должно совпадать с именем класса.

0 голосов
/ 22 июня 2010

Пара вещей:

  1. new_house никогда не инициализируется. Вы не можете использовать его, пока не инициализируете его.
  2. pl_id - это массив, но вы пытаетесь сохранить в нем long (345678) - вы можете изменить его на новый int [] {345678}.
  3. У вас есть метод game () в классе, который выглядит и действует как конструктор. Вы должны были бы назвать его house (), если он предназначен для конструктора.
0 голосов
/ 22 июня 2010

Изменить публичную игру ()

в публичный дом ()

Ваш конструктор должен иметь то же имя, что и класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...