【发布时间】:2010-05-02 06:48:34
【问题描述】:
我们知道,在 C# 中,结构是按值传递的,而不是按引用传递的。因此,如果我有一个包含以下数据成员的结构:
private struct MessageBox
{
// data members
private DateTime dm_DateTimeStamp; // a struct type
private TimeSpan dm_TimeSpanInterval; // also a struct
private ulong dm_MessageID; // System.Int64 type, struct
private String dm_strMessage; // an object (hence a reference is stored here)
// more methods, properties, etc ...
}
所以当 MessageBox 作为参数传递时,会在堆栈上生成一个 COPY,对吗? 就数据成员的复制方式而言,这意味着什么? 前两个是结构类型,因此应复制 DateTime 和 TimeSpan。第三种是原语,所以也被复制了。但是 dm_strMessage 呢,它是对对象的引用?当它被复制时,会创建另一个对相同字符串的引用,对吗?对象本身驻留在堆中,并且不会被复制(堆上只有一个实例。)所以现在我们必须引用同一个 String 类型的对象。如果这两个引用是从不同的线程访问的,那么可以想象,String 对象可能会因同时从两个不同的方向修改而损坏。 MSDN 文档说 System.String 是线程安全的。这是否意味着 String 类有一个内置机制来防止对象在此处描述的那种情况下被破坏? 我试图弄清楚我的 MessageBox 结构是否有任何潜在的缺陷/陷阱是结构与类。 感谢您的任何意见。
源.能量。
【问题讨论】:
-
这是一个类似的问题,Jon Skeet 在最后的回复bytes.com/topic/c-sharp/answers/…
标签: c# struct thread-safety