在规划我的程序时,我经常从一连串的想法开始:
足球队只是一个足球运动员名单.因此,我应该代表它:
Run Code Online (Sandbox Code Playgroud)var football_team = new List<FootballPlayer>();此列表的顺序表示球员在名单中列出的顺序.
但我后来才意识到,除了仅仅是球员名单之外,球队还有其他属性,必须记录下来.例如,本赛季的总得分,当前预算,统一颜色,string代表球队名称等等.
那么我认为:
好吧,足球队就像一个球员名单,但另外,它有一个名称(a
string)和一个总分(aint)..NET不提供用于存储足球队的类,所以我将创建自己的类.最相似和相关的现有结构是List<FootballPlayer>,所以我将继承它:Run Code Online (Sandbox Code Playgroud)class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
但事实证明,指南说你不应该继承List<T>.我在两个方面完全被这个指南搞糊涂了.
显然List是以某种方式针对性能进行了优化.怎么会这样?如果我延长会给我带来什么性能问题List?究竟会打破什么?
我看到的另一个原因List是微软提供的,我无法控制它,所以我在以后暴露"公共API"后无法改变它.但我很难理解这一点.什么是公共API,我为什么要关心?如果我当前的项目没有并且不太可能拥有此公共API,我可以放心地忽略此指南吗?如果我继承List 并且事实证明我需要一个公共API,那么我将遇到什么困难?
为什么它甚至重要?列表是一个列表.什么可能改变?我可能想要改变什么?
最后,如果微软不想让我继承List,他们为什么不上课sealed呢?
显然,对于自定义集合,Microsoft提供了一个Collection应该扩展的类而不是List.但这个类是非常裸露,并没有多少有用的东西,比如AddRange,例如.jvitor83的答案提供了该特定方法的性能原理,但是如何缓慢AddRange而不是没有AddRange?
继承Collection是比继承更多的工作List,我认为没有任何好处.当然微软不会告诉我无缘无故地做额外的工作,所以我不禁觉得我在某种程度上误解了某些东西,而继承Collection实际上并不是解决我问题的正确方法.
我见过如实施的建议IList …
我正在尝试监视一个值,当它发生更改时,在使用结果执行一些计算后更新文本字段。
我试图监视的值来自一个AGauge属性(自定义控件)。我想在AGauge.Value更改时更新文本字段。
我看过诸如This One这样的问题,但我真的不明白这是如何工作的,或者我需要改变什么才能得到我正在寻找的结果。
谁能更好地解释我需要做什么才能使其发挥作用?
这AGuage.Value是一种float类型,以防万一你想知道。
提前致谢。
更新 1
我现在已将以下代码添加到我的项目中:
public class AGuage
{
private float _value;
public float Value
{
get
{
return this._value;
}
set
{
this._value = value;
this.ValueChanged(this._value);
}
}
public void ValueChanged(float newValue)
{
}
}
Run Code Online (Sandbox Code Playgroud)
并且可以ValueChanged使用以下方法触发:
AGuage n = new AGuage();
n.Value = Pressure_Gauge.Value;
Run Code Online (Sandbox Code Playgroud)
每次Pressure_Gauge.Value更新时都会触发。
我现在面临的问题或最后一个障碍是这部分:
public void ValueChanged(float newValue)
{
Form1.Pressure_Raw.text = "Working";
}
Run Code Online (Sandbox Code Playgroud)
我想form1使用上述方法更新标签的文本,但是我收到一条错误消息:An object …