【发布时间】:2017-05-19 19:05:04
【问题描述】:
在长时间使用 C++ 和 Qt 之后,我刚刚回到 C#。我目前被我认为是一个非常简单的问题难住了。
我有一个结构:
struct FontGlyph {
public uint codepoint;
public byte[] bmp;
...
}
还有一个这样的结构数组:
FontGlyph[] glyphs = new FontGlyph[100];
现在,我有几个函数可以设置和修改结构中的字段:
static void ConvertFont(Font fnt) {
...
if (fnt.IsSpaceCharacter) {
glyphs[idx].codepoint = 0x00FF;
glyphs[idx].bmp = null;
}
else {
RenderFontGlyph(glyphs[idx]);
// glyphs[idx].bmp is NOT ok here - it is null!
}
...
}
static void RenderFontGlyph(FontGlyph glyph) {
...
glyph.bmp = new byte[256];
// bmp is fine here, and can be populated as a normal array
...
}
这不是一个特别好的代码 sn-p,但是,在 RenderFontGlyph 函数中,我可以看到 bmp 数组在 RenderFontGlyph 函数返回时被正确分配,在检查 glyphs[idx] 变量时, bmp 恢复为空。
我很感激我可能正在做一些 n00bish 但已经有一段时间了。我是垃圾收集的受害者还是我很愚蠢?我突然想到该结构是按值而不是按引用传递给 RenderFontGlyph 函数的,但这也没有什么区别!
【问题讨论】:
-
structs,当按值传递时(这是默认值),正在被复制,因此您在方法中修改glyphs[idx]的副本,它对实例没有影响存储在数组中。通过引用传递值以使其工作。 -
@MarcinJuraszek,感谢您的评论。我再次尝试以
ref传递,但是当 RenderFontGlyph 返回时,bmp字段仍然为空 - 即使它在函数中正确初始化。