【发布时间】:2014-08-26 18:07:37
【问题描述】:
我正试图围绕 C# 中的所有列表接口(IEnumarable、IReadOnlyCollection)等。作为其中的一部分,我意识到我并不真正理解为什么下面的代码有效。毕竟,该方法有一个 IReadOnlyCollection 作为返回类型,但返回的变量是 Array (float[]) 类型。我意识到 Array 实现了 IReadOnlyCollection 接口,但我不知道它是如何从一个转换到另一个的。它是在后台以某种方式完成的吗?
private readonly float[] _location;
public Player()
{
_location = new float[3];
}
public IReadOnlyCollection<float> Location
{
get
{
_location[0] = Worker.Elements["lbXCoordinate"].Value;
_location[1] = Worker.Elements["lbYCoordinate"].Value;
_location[2] = Worker.Elements["lbZCoordinate"].Value;
return _location;
}
}
【问题讨论】:
-
没有转换 - 返回的
IReadOnlyCollection<float>引用将是对数组本身的引用。 (不,你不应该像这样实现属性......) -
@JonSkeet Jon,感谢您的回复。我试图确保消费者不会篡改 Property 的结果(以前它曾经返回一个简单的 float[],但我意识到可以写入 Array)。我在 get 访问器中编写变量的事实是为了确保每当有人请求它时,他们都会获得更新的值。请参阅我的另一篇文章:stackoverflow.com/questions/25506487/…。如果您能解释我应该做什么,我将不胜感激。谢谢一百万!
-
好吧,调用者总是可以转换回数组类型。我建议在每次调用时创建一个 new 数组......或者理想情况下,创建一个具有三个属性的单独结构,而不是一个集合。
-
@JonSkeet 有趣的是,您会这么说,因为在将 float[] 作为返回类型之前,我将 struct Waypoint 作为返回类型。但是,我的程序每秒可能不止一次地调用此访问器,因此每次创建一个新的 Waypoint(或新数组)实例都会损害性能,对吗?我的 Waypoint 结构相当大。我链接到的帖子解释得更好。
-
“每秒不止一次”几乎没有任何意义。你知道你每秒能做多少吗?但从根本上说,一个只有 3 个
float值的结构应该没问题 - 它只有 12 个字节,甚至不会在堆上。当然,这比返回一个数组要好,这样每次调用Location都会返回相同的引用,可能会为其他所有人更改数组...
标签: c# collections interface