使用索引引用另一个 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
对象副本。
在某些情况下这是有意义的,但在您的示例中这可能不是一个好主意,原因有两个:
例如,如果 someRestaurant
的 name
发生变化,则 favouriteRestaurant
的名称也应发生变化。如果 favouriteRestaurant
是副本,这不会自动发生。
太浪费内存了
在需要 "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
对象副本。
在某些情况下这是有意义的,但在您的示例中这可能不是一个好主意,原因有两个:
例如,如果
someRestaurant
的name
发生变化,则favouriteRestaurant
的名称也应发生变化。如果favouriteRestaurant
是副本,这不会自动发生。太浪费内存了