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 referenceClass = new ReferenceClass(); Assert.AreEqual(0, referenceClass.AProperty); ReferenceClassMutator.ChangeAProperty(ref referenceClass); //Fields are updated as we're updating the instance passed in Assert.AreEqual(1, referenceClass.AProperty); }
public void Passed_ByVal_instance_properties_can_be_mutated() { var referenceClass = new ReferenceClass(); Assert.AreEqual(0, referenceClass.AProperty); ReferenceClassMutator.ChangeAProperty(referenceClass); //Because the instance copied is a reference type, all we've copied is it's pointers to instances of value types //This means we end up sharing their pointers and updating them across both instances Assert.AreEqual(1, referenceClass.AProperty); }
public void Passed_ByVal_instance_cant_be_mutated() { var referenceClass = new ReferenceClass(); Assert.AreEqual(0, referenceClass.AField); Assert.AreEqual(0, referenceClass.AProperty); ReferenceClassMutator.ChangeTheInstanceOfReferenceClass(referenceClass); //Changing the instance has no effect as the instance has been copied Assert.AreEqual(0, referenceClass.AField); Assert.AreEqual(0, referenceClass.AProperty); }
public void Passed_ByRef_instance_can_be_mutated() { var referenceClass = new ReferenceClass(); Assert.AreEqual(0, referenceClass.AField); Assert.AreEqual(0, referenceClass.AProperty); ReferenceClassMutator.ChangeTheInstanceOfReferenceClass(ref referenceClass); //Changing the instance means that the current instance is "updated" Assert.AreEqual(1, referenceClass.AField); Assert.AreEqual(1, referenceClass.AProperty); }
public void Copied_classes_are_mutally_sharing_properties_or_fields() { var testSize = 1000000; var classArray = new ReferenceClass[testSize]; for (var i = 0; i < testSize; i++) { classArray[i] = new ReferenceClass { AProperty = 1, AField = 1 }; } var copied = new ReferenceClass[testSize]; classArray.CopyTo(copied, 0); for (var i = 0; i < testSize; i++) { copied[i].AField = 0; Assert.AreEqual(classArray[i].AField, copied[i].AField); copied[i].AProperty = 0; Assert.AreEqual(classArray[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); }