DateTime可以在64位环境中破解吗?

在C#中,只要一个variables的值最多为native int (即在32位运行时环境中为4个字节,在64位中为8个字节), native int其设置为primefaces。 在包含所有引用types和大多数内置值types( byteshortintlong等)的64位环境中。

设置一个更大的值不是primefaces的,只会更新内存的一部分,会造成撕裂。

DateTime是一个只包含一个包含其所有数据( TicksDateTimeKind )的ulong字段的结构, ulong本身在64位环境中是primefaces的。

这是否意味着DateTime也是primefaces的? 或者下面的代码是否会导致在某个点上撕裂?

 static DateTime _value; static void Main() { for (int i = 0; i < 10; i++) { new Thread(_ => { var random = new Random(); while (true) { _value = new DateTime((long)random.Next() << 30 | (long)random.Next()); } }).Start(); } Console.ReadLine(); } 

从ECMA规范部分的“I.12.6.6primefaces读写”

一致性CLI应保证当所有的写入操作都访问到某个位置时,对正确alignment的内存位置的读写访问不会大于本地字大小( native inttypes的大小)是primefaces的(请参阅§1.12.6.2)相同的大小。 primefaces写入不应改变写入的内容。 除非使用明确的布局控制(请参阅分区II(控制实例布局))来更改默认行为,否则不得大于自然字大小( native int的大小)的数据元素才能正确alignment。 对象引用应被视为以原始字大小存储。

native int是C#中的IntPtr

只要sizeof(IntPtr) >= sizeof(DateTime)对于运行时环境(又名:以64位运行sizeof(IntPtr) >= sizeof(DateTime)为真,并且它们不会将内部结构改变为显式布局,而是使用未alignment的字节而不是[StructLayout(LayoutKind.Auto)]它现在有读取和写入DateTime结构(或遵循这些规则的任何其他结构)保证是由ECMA规范的primefaces。

您可以validation通过在64位环境中运行以下代码:

 public unsafe static void Main() { Console.WriteLine(sizeof(DateTime)); // Outputs 8 Console.WriteLine(sizeof(IntPtr)); // Outputs 8 Console.WriteLine(sizeof(ulong)); // Outputs 8 } 

运行一些testing,并基于上述答案 ,今天说它是primefaces是非常安全的。

我写了一个testing来validation在N个线程上的Int64,DateTime和3个128,192和256大小的自定义结构的X迭代期间可以find多less泪水 – 没有一个结构的StructLayout被搞乱了。

testing包括:

  1. 将一组值添加到数组中,以便知道它们。
  2. 为每个数组位置设置一个线程,该线程将把数组中的值赋给一个共享variables。
  3. 设置相同数量的线程(array.length)从该共享variables读取到本地。
  4. 检查这个本地是否包含在原始数组中。

结果如下我的机器(Core i7-4500U,Windows 10 x64,.NET 4.6,发布无debugging,平台目标:x64代码优化):

 -------------- Trying to Tear -------------- Running: 64bits Max Threads: 30 Max Reruns: 10 Iterations per Thread: 20000 -------------------------------------------- ----- Tears ------ | -------- Size --------- 0 Int64 (64bits) 0 DateTime (64bits) 23 Struct128 (128bits) 87 Struct192 (192bits) 43 Struct256 (256bits) ----- Tears ------ | -------- Size --------- 0 Int64 (64bits) 0 DateTime (64bits) 44 Struct128 (128bits) 59 Struct192 (192bits) 52 Struct256 (256bits) ----- Tears ------ | -------- Size --------- 0 Int64 (64bits) 0 DateTime (64bits) 26 Struct128 (128bits) 53 Struct192 (192bits) 45 Struct256 (256bits) ----- Tears ------ | -------- Size --------- 0 Int64 (64bits) 0 DateTime (64bits) 46 Struct128 (128bits) 57 Struct192 (192bits) 56 Struct256 (256bits) ------------------- End -------------------- 

testing的代码可以在这里find: https : //gist.github.com/Flash3001/da5bd3ca800f674082dd8030ef70cf4e

来自C#语言规范。

5.5variables引用的primefaces性读取和写入以下数据types是primefaces的: bool,char,byte,sbyte,short,ushort,uint,int,float和referencetypes 。 另外,在前面列表中读取和写入带有基础types的枚举types也是primefaces的。 其他types(包括long,ulong,double和decimal)以及用户定义types的读取和写入不保证是primefaces性的。 除了为此目的而devise的库函数之外,不能保证primefaces读 – 修改 – 写,例如在递增或递减的情况下。