public void Test_1000000_array_copy_time_classes_should_be_faster()
        {
            var testSize = 1000000;
            var structArray = new ValueStruct[testSize];
            for (var i = 0; i < testSize; i++)
            {
                structArray[i] = new ValueStruct { AProperty = 1, AField = 1 };
            }
            var start = DateTime.Now;
            var copied = new ValueStruct[testSize];
            structArray.CopyTo(copied, 0);
            var structsEnded = (DateTime.Now - start).TotalMilliseconds;

            var classArray = new ReferenceClass[testSize];
            for (var i = 0; i < testSize; i++)
            {
                classArray[i] = new ReferenceClass { AProperty = 1, AField = 1 };
            }
            start = DateTime.Now;
            var copied2 = new ReferenceClass[testSize];
            classArray.CopyTo(copied2, 0);
            var classesEnded = (DateTime.Now - start).TotalMilliseconds;

            Console.WriteLine($"Classes copied in:{classesEnded}ms");
            Console.WriteLine($"Structs copied in:{structsEnded}ms");
            Assert.IsTrue(classesEnded < structsEnded);
        }
 public void Passed_ByRef_instance_properties_can_be_mutated()
 {
     var valueStruct = new ValueStruct();
     Assert.AreEqual(0, valueStruct.AProperty);
     ValueStructMutator.ChangeAProperty(ref valueStruct);
     //Fields are updated as we're updating the instance passed in
     Assert.AreEqual(1, valueStruct.AProperty);
 }
 public void Passed_ByVal_instance_properties_cant_be_mutated()
 {
     var valueStruct = new ValueStruct();
     Assert.AreEqual(0, valueStruct.AProperty);
     ValueStructMutator.ChangeAProperty(valueStruct);
     //Because the instance copied is a value type we've copied all its values too
     //This means we end up copying all the values stopping them from being mutally shared
     Assert.AreEqual(0, valueStruct.AProperty);
 }
 public void Passed_ByVal_instance_cant_be_mutated()
 {
     var valueStruct = new ValueStruct();
     Assert.AreEqual(0, valueStruct.AField);
     Assert.AreEqual(0, valueStruct.AProperty);
     ValueStructMutator.ChangeTheInstanceOfValueStruct(valueStruct);
     //Changing the instance has no effect as the instance has been copied
     Assert.AreEqual(0, valueStruct.AField);
     Assert.AreEqual(0, valueStruct.AProperty);
 }
 public void Passed_ByRef_instance_can_be_mutated()
 {
     var valueStruct = new ValueStruct();
     Assert.AreEqual(0, valueStruct.AField);
     Assert.AreEqual(0, valueStruct.AProperty);
     ValueStructMutator.ChangeTheInstanceOfValueStruct(ref valueStruct);
     //Changing the instance means that the current instance is "updated"
     Assert.AreEqual(1, valueStruct.AField);
     Assert.AreEqual(1, valueStruct.AProperty);
 }
        public void Copied_structs_are_not_mutally_sharing_properties_or_fields()
        {
            var testSize = 1000000;
            var structArray = new ValueStruct[testSize];
            for (var i = 0; i < testSize; i++)
            {
                structArray[i] = new ValueStruct {AProperty = 1, AField = 1};
            }
            var copied = new ValueStruct[testSize];
            structArray.CopyTo(copied, 0);

            for (var i = 0; i < testSize; i++)
            {
                copied[i].AField = 0;
                Assert.AreNotEqual(structArray[i].AField, copied[i].AField);
                copied[i].AProperty = 0;
                Assert.AreNotEqual(structArray[i].AProperty, copied[i].AProperty);
            }
        }
        public void Test_1000000_instance_creation_time_structs_should_be_faster()
        {
            var testSize = 1000000;
            var structArray = new ValueStruct[testSize];
            var start = DateTime.Now;
            for (var i = 0; i < testSize; i++)
            {
                structArray[i] = new ValueStruct {AProperty = 1, AField = 1};
            }
            var structsEnded = (DateTime.Now - start).TotalMilliseconds;

            var classArray = new ReferenceClass[testSize];
            start = DateTime.Now;
            for (var i = 0; i < testSize; i++)
            {
                classArray[i] = new ReferenceClass { AProperty = 1, AField = 1 };
            }
            var classesEnded = (DateTime.Now - start).TotalMilliseconds;

            Console.WriteLine($"Classes creation:{classesEnded}ms");
            Console.WriteLine($"Structs creation:{structsEnded}ms");
            Assert.IsTrue(classesEnded > structsEnded);
        }