Ссылка на другой класс, используя индекс против хранения всего экземпляра - PullRequest
0 голосов
/ 24 сентября 2018

В классе, который должен «содержать информацию» о другом классе (извините, я не знаю терминов для этого), должен ли я хранить ссылку на этот другой класс как нечто вроде целого числа / идентификатора или хранитьэто как экземпляр другого класса?Как это называется, если для него есть имя?

В качестве очень простого примера, приложение, в котором мы хотим сохранить любимый ресторан пользователя:

public class User {
    public int id { get; set; }
    public string name { get; set; }

    // id of restaurant...
    // public int favoriteRestaurantId { get; set; }

    // ...or entire instance of Restaurant type
    // public Restaurant favoriteRestaurant { get; set; }
}

public class Restaurant {
    public int id { get; set; }
    public string name { get; set; }
}

Примечание:если вы считаете, что это не по теме, пожалуйста, объясните, почему этот вопрос будет разрешен и является высоко оцененным / полезным вопросом, но мой - нет: Интерфейс против базового класса Или, по крайней мере, скажите мне, что это«называется», чтобы я мог исследовать это больше сам.Насколько я могу судить из часто задаваемых вопросов Stackoverflow, этот вопрос по теме.

1 Ответ

0 голосов
/ 29 сентября 2018

Ваш первый вариант

public int favoriteRestaurantId { get; set; }

имеет смысл, только если вас интересует только id, а не другие атрибуты (name) объекта restaurant.В противном случае вам понадобится некоторый внешний контейнер, в котором хранятся все restaurant объекты, и вам придется искать в контейнере restaurant с указанным id.

Во втором варианте

public Restaurant favoriteRestaurant { get; set; }

если вы напишите

someUser.favouriteRestaurant = someRestaurant;

, это также сохранит ссылку на существующий someRestaurant.Это не скопирует весь объект.по крайней мере, не в таких языках, как C # и Java.

Только если вы сделаете что-то вроде

someUser.favouriteRestaurant = new Restaurant(someRestaurant);

, user будет иметь собственную копию объекта restaurant.

В некоторых случаях это имеет смысл, но в вашем примере это, вероятно, не очень хорошая идея по двум причинам:

  1. Если, например, name из someRestaurantизменения, это также должно изменить имя favouriteRestaurant.Это не произойдет автоматически, если favouriteRestaurant является копией.

  2. Это пустая трата памяти.

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