使用索引引用另一个 class 与存储整个实例

Reference another class using an index vs storing entire instance

在需要 "contain information" 关于另一个 class 的 class 中(抱歉,我不知道这方面的条款),我应该存储对另一个 class 作为 integer/id 之类的东西,还是应该将其存储为另一个 class 的实例?这个叫什么,有名字吗?

作为一个非常基本的示例,我们要在其中存储用户最喜欢的餐厅的应用:

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; }
}

注意:如果您认为这是题外话,请解释为什么这个问题会被允许并且是一个高度 rated/useful 的问题,但我的不是:Interface vs Base class 或者至少告诉我这是什么 "called" 所以我可以自己研究更多。据我从 Whosebug 的常见问题解答中可以看出,这个问题是关于主题的。

你的第一个变体

public int favoriteRestaurantId { get; set; }

仅当您只对 id 而不是 restaurant 对象的其他属性 (name) 感兴趣时才有意义。否则,您将需要一些存储所有 restaurant 对象的外部容器,并且必须使用给定的 id.

在容器中搜索 restaurant

在你的第二个变体中

public Restaurant favoriteRestaurant { get; set; }

如果你写

someUser.favouriteRestaurant = someRestaurant;

这还存储了对现有 someRestaurant 的引用。它不会复制整个对象。至少不是像 C# 和 Java.

这样的语言

只有当你做类似

的事情时
someUser.favouriteRestaurant = new Restaurant(someRestaurant);

user 将拥有自己的 restaurant 对象副本。

在某些情况下这是有意义的,但在您的示例中这可能不是一个好主意,原因有两个:

  1. 例如,如果 someRestaurantname 发生变化,则 favouriteRestaurant 的名称也应发生变化。如果 favouriteRestaurant 是副本,这不会自动发生。

  2. 太浪费内存了