Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多次/跨不同图形恢复状态是否安全?_C#_.net_System.drawing - Fatal编程技术网

C# 多次/跨不同图形恢复状态是否安全?

C# 多次/跨不同图形恢复状态是否安全?,c#,.net,system.drawing,C#,.net,System.drawing,将一个图形对象的保存状态与另一个图形对象一起使用是否安全?例如,如以下示例中所示 Graphics g1 = ..; Graphics g2 = ..; GraphicsState state1 = g1.Save(); g2.Restore(state1); // state from the other Graphics 此外,多次恢复同一状态是否安全 Graphics g1 = ..; Graphics g2 = ..; GraphicsState state1 = g1.Save(

将一个
图形
对象的保存状态与另一个
图形
对象一起使用是否安全?例如,如以下示例中所示

Graphics g1 = ..;
Graphics g2 = ..;

GraphicsState state1 = g1.Save();
g2.Restore(state1); // state from the other Graphics
此外,多次恢复同一状态是否安全

Graphics g1 = ..;
Graphics g2 = ..;

GraphicsState state1 = g1.Save();
g2.Restore(state1);
g1.Restore(state1); // the same state used second time

我个人认为在我的代码中这两种技术都没有问题,但我想确保它们是安全的/允许的。

我非常怀疑这是否保证安全。如文档所述,当您调用
Save()
时,当前状态被推送到堆栈上(不是堆栈…只是一些堆栈),然后当您调用
Restore()
时,状态从堆栈中移除并应用到
图形
实例

两个
Graphics
实例是否共享同一堆栈值得怀疑。从另一个
Graphics
实例的堆栈中恢复一个
Graphics
实例的状态是否是一个好主意,同样值得怀疑

文档非常清楚地表明,预期用途是平衡
Save()
Restore()
调用,并将它们应用于相同的
图形
实例


编辑:

为了完整性,我继续仔细查看,事实上,虽然程序可能会或可能不会立即失败,但从不同的
图形
实例保存的还原状态肯定不是正确的用法:

  • 在托管代码中,文档引用的“堆栈”实际上是作为链表实现的。调用
    Restore()
    时,在应用要还原的状态对象后,代码会在堆栈中搜索该对象;找到该对象后,它将处理该对象以及在该对象之后保存但尚未恢复的所有其他状态对象
如果找不到对应的对象,它只会发出一条
Debug.Fail()
消息。因此,这不会使您的代码崩溃,但很明显,这是不可取的行为

  • 要实际还原状态,托管代码调用非托管的
    GdipRestoreGraphics()
    函数。从该调用(函数)的已批准OOP包装的文档中,参考32位整数“state”参数:“(以前调用此图形对象的Graphics::Save方法时返回)”[emphasis mine]

这无疑使意图更加明确。此外,该文档页还将详细介绍正在维护的状态堆栈,以及在恢复状态时如何对其进行管理。GDI+堆栈类似于托管堆栈,实现方式相同。与托管堆栈一样,如果您不为该
Graphics
实例还原状态,它将无法在堆栈中找到保存的状态。

我没有看到任何立即爆炸的情况,并且本地GDI+api的文档也没有明确禁止它。然而,所使用的语言强烈暗示它将使用相同的图形对象。不常尝试,最好避免。谢谢!我特别感谢这次编辑。