Как изменить атрибут публичной переменной вне класса - PullRequest
0 голосов
/ 01 августа 2010

Извините за название, я не думаю, что мог бы объяснить это правильно:

Это упрощенный пример класса, он работает нормально. (У меня также есть метод Save ())

   public class busItem
    {

        public Item vItem;

        public busItem(int pItem_Id)
        {
            DBDataContext db = new DBDataContext();

            Item vItemQuery = (from i in db.Items
                               where i.Id == pItem_Id
                               select i).FirstOrDefault();

            vItem = new Item();

            vItem.Id = vItemQuery.Id;
            vItem.Desc = vItemQuery.Desc;

        }
    }

А это мой кодовый вызов:

busItem item = new busItem(1);
item.vItem.Desc = "new description";

проблема в том, что когда я пытаюсь передать "новое описание", я получаю исключение "пустая ссылка". Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 01 августа 2010

Вы, вероятно, получаете исключение нулевой ссылки в конструкторе.FirstOrDefault() может вернуть ноль, если в IEnumerable нет элементов, в этом случае доступ к Id и Desc вызовет исключение.Если конструктор завершается нормально, item.vItem.Desc не должен завершиться ошибкой.

0 голосов
/ 01 августа 2010

Проблема, вероятно, в следующем коде:

   Item vItemQuery = (from i in db.Items
                           where i.Id == pItem_Id
                           select i).FirstOrDefault();

FirstOrDefault вернет первый элемент или значение по умолчанию. Поскольку Item является классом, значением по умолчанию является null, и вы не можете установить член в null. Вам нужно проверить на нулевое значение после вышеприведенного оператора, если оно пустое, создать экземпляр вручную. Кроме того, публичное поле, подобное этому, является очень плохой идеей.

0 голосов
/ 01 августа 2010

Я взял код, опубликованный Витором, и добавил две небольшие ложные реализации для DataContext и Item, чтобы у меня был запущенный код. Затем я добавил код, который не проходит тест. Тест прошел независимо от того, что я делаю с объектом Item, который добавляю в коллекцию, возвращаемую DataContext.

Единственное исключение, которое мне удалось воспроизвести, произошло в конструкторе. Строка, в которой задано новое описание, никогда не заканчивалась.

Я добавил свой код ниже.

На более общем замечании: переменные-члены-члены обычно являются признаком того, что дизайн может быть улучшен. Я бы предложил сделать эту переменную приватной и работать оттуда. В нашей команде есть правило, что переменные-члены не могут быть открытыми, так как они ведут к слабым проектам. Просто мои два цента.

  public class Item {
     public int Id;
     public string Desc;
  }

  public class DBDataContext {
     public System.Collections.Generic.List<Item> Items {
        get {
           var items = new System.Collections.Generic.List<Item> {
              new Item {
                 Desc = null,
                 Id = 1
              }
           };
           return items;
        }
     }
  }

  public class busItem {

     public Item vItem;

     public busItem(int pItem_Id) {
        DBDataContext db = new DBDataContext();

        Item vItemQuery = (from i in db.Items
                           where i.Id == pItem_Id
                           select i).FirstOrDefault();

        vItem = new Item();

        vItem.Id = vItemQuery.Id;
        vItem.Desc = vItemQuery.Desc;
     }
  }

  [Test]
  public void TestBusItem() {
     busItem item = new busItem(1);
     item.vItem.Desc = "new description";
  }
0 голосов
/ 01 августа 2010

Прежде всего, этот код выглядит неправильно по крайней мере по двум причинам. pItem в запросе не объявлен; Вы имели в виду pItem_Id? Кроме того, строка с «новым описанием» не заканчивается точкой с запятой. Если я не посмотрю на ваш точный код, есть большая вероятность, что настоящая проблема не будет видна. Во-вторых, я подозреваю, что ошибка на самом деле не при назначении «нового описания», а при назначении vItem.Desc = vItemQuery.Desc. Я не понимаю, как может возникнуть проблема с строкой «новое описание», но если запрос вернул null, поскольку не смог найти запрошенный объект, вы получите ошибку при попытке получить оригинальное описание / описание по умолчанию.

Редактировать: Вы уверены , что вы не исключили какой-то значительный фрагмент кода, например объявление локального экземпляра vItem в конструкторе?

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