我实现IXmlSerializable了下面的类型,它将RGB颜色值编码为单个字符串:
public class SerializableColor : IXmlSerializable
{
public int R { get; set; }
public int G { get; set; }
public int B { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
var data = reader.ReadString();
reader.ReadEndElement();
var split = data.Split(' ');
R = int.Parse(split[0]);
G = int.Parse(split[1]);
B = int.Parse(split[2]);
}
public void WriteXml(XmlWriter writer)
{
writer.WriteString(R + " " + G + " " + B);
}
} …Run Code Online (Sandbox Code Playgroud) 如果以前曾经问过这个问题,我很抱歉,但我确实尝试了解可用的大量DataBinding问题,找不到符合我问题的问题.
我正在列表框索引和我的一个实体上的某个属性之间进行单向数据绑定,但是我还需要在数据绑定发生后运行一些额外的逻辑.我尝试这样做:
listBox.DataBindings.Add("SelectedIndex", entity, "Property", true, DataSourceUpdateMode.OnPropertyChanged);
listBox.SelectedIndexChanged += (s,e) => view.Refresh();
Run Code Online (Sandbox Code Playgroud)
问题是事件处理程序在数据绑定更新之前运行,但view.Refresh()取决于更新的值entity.Property.这导致我的视图在下次更改索引之前不会刷新.
有没有办法用数据绑定解决这个问题?目前,每当我遇到这种情况时,我都不会使用数据绑定,而是手动执行:
listBox.SelectedIndex = entity.Property;
listBox.SelectedIndexChanged += OnIndexChanged;
private void OnIndexChanged(object sender, EventArgs e)
{
entity.Property = listBox.SelectedIndex;
view.Refresh();
}
Run Code Online (Sandbox Code Playgroud)
但我宁愿避免这种情况,因为我正在使用数据绑定来保存其他所有内容并且希望保持一致性.
更新
我找到了解决方案.它看起来像Binding对象本身拥有BindingComplete事件,这是完美的.由于DataBindings.Add方法返回Binding对象,我可以将它们链接在一起.我的代码因此变成:
listBox.DataBindings.Add("SelectedIndex", entity, "Property", true, DataSourceUpdateMode.OnPropertyChanged).BindingComplete += (s,e) => view.Refresh();
Run Code Online (Sandbox Code Playgroud)
我现在唯一的问题是,如果需要手动取消注册此事件,或者我可以打电话listBox.DataBindings.Clear();并完成它.
public class Foo
{
public void Draw() // Called 60 times per second
{
spriteBatch.Draw(new Vector2(x, y), null, Color.White);
}
private float x, y;
}
Run Code Online (Sandbox Code Playgroud)
特别是,我想知道这个new Vector2(x, y)电话是否正在产生垃圾.
我的理解是,由于它Vector2是一个值类型,并且没有存储为引用类型的成员,因此它将在堆栈上创建.因此,一旦Draw方法返回,它的内存应该自动回收,不会产生垃圾.
那是对的吗?
编辑
如果我可以要求进一步澄清Eric Lippert的首发帖子.
问题1)
它取决于被调用函数的第一个形式参数是采用引用类型还是值类型.如果它采用值类型然后否,则此处不会生成垃圾.如果它采用引用类型,则该值将被加框.
然后,如果签名碰巧是这样的:
public void Draw()
{
Vector2 vector = new Vector2(x, y);
spriteBatch.Draw(ref vector, null, Color.White);
}
Run Code Online (Sandbox Code Playgroud)
它会从盒子中生成垃圾?
问题2)
仅仅因为它不在堆上并不逻辑上需要它在堆栈上生成.它可能在一个寄存器中.
但我认为存储在寄存器中的行为就像从垃圾收集器的角度存储在堆栈中一样.那是对的吗?