From cb4ba81dccf166a0551743d11606e9d68d2be494 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Mon, 23 Jan 2023 09:31:23 -0800 Subject: [PATCH 01/17] Temporarily relocate original files --- ....04.SubtleBoxAndUnboxInstructions.Tests.cs | 0 ...g09.06.SubtleBoxingIdiosyncrasies.Tests.cs | 0 ...g09.07.AvoidingUnboxingAndCopying.Tests.cs | 0 ...ingAStringToAnEnumUsingEnum.Parse.Tests.cs | 0 ...AStringToAnEnumUsingEnum.TryParse.Tests.cs | 0 ...UsingBitwiseORandANDWithFlagEnums.Tests.cs | 0 .../Listing09.17.UsingFlagsAttribute.Tests.cs | 0 .../Listing09.01.DeclaringAStruct.cs | 69 +++++++------ ...eldWithinADeclarationResultingInAnError.cs | 97 +++++++++---------- ...ngPropertiesBeforeInitializingAllFields.cs | 65 ------------- ...ting09.04.SubtleBoxAndUnboxInstructions.cs | 53 ---------- ...09.05.UnboxingMustBeToTheUnderlyingType.cs | 23 ----- ...Listing09.06.SubtleBoxingIdiosyncrasies.cs | 77 --------------- ...Listing09.07.AvoidingUnboxingAndCopying.cs | 24 ----- ....ComparingAnIntegerSwitchToAnEnumSwitch.cs | 59 ----------- src/Chapter09/Listing09.09.DefiningAnEnum.cs | 12 --- .../Listing09.10.DefiningAnEnumType.cs | 13 --- ...isting09.11.CastingBetweenArraysOfEnums.cs | 31 ------ ...onvertingAStringToAnEnumUsingEnum.Parse.cs | 17 ---- ...ertingAStringToAnEnumUsingEnum.TryParse.cs | 18 ---- .../Listing09.14.UsingEnumsAsFlags.cs | 26 ----- ...09.15.UsingBitwiseORandANDWithFlagEnums.cs | 63 ------------ ...finingEnumValuesforFrequentCombinations.cs | 19 ---- .../Listing09.17.UsingFlagsAttribute.cs | 49 ---------- ...ngPropertiesBeforeInitializingAllFields.cs | 64 ++++++++++++ ...ting09.04.SubtleBoxAndUnboxInstructions.cs | 52 ++++++++++ ...09.05.UnboxingMustBeToTheUnderlyingType.cs | 22 +++++ ...Listing09.06.SubtleBoxingIdiosyncrasies.cs | 76 +++++++++++++++ ...Listing09.07.AvoidingUnboxingAndCopying.cs | 23 +++++ ....ComparingAnIntegerSwitchToAnEnumSwitch.cs | 58 +++++++++++ .../Original09/Listing09.09.DefiningAnEnum.cs | 11 +++ .../Listing09.10.DefiningAnEnumType.cs | 12 +++ ...isting09.11.CastingBetweenArraysOfEnums.cs | 30 ++++++ ...onvertingAStringToAnEnumUsingEnum.Parse.cs | 16 +++ ...ertingAStringToAnEnumUsingEnum.TryParse.cs | 17 ++++ .../Listing09.14.UsingEnumsAsFlags.cs | 25 +++++ ...09.15.UsingBitwiseORandANDWithFlagEnums.cs | 62 ++++++++++++ ...finingEnumValuesforFrequentCombinations.cs | 18 ++++ .../Listing09.17.UsingFlagsAttribute.cs | 48 +++++++++ 39 files changed, 616 insertions(+), 633 deletions(-) rename src/Chapter09.Tests/{ => Original09}/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs (100%) rename src/Chapter09.Tests/{ => Original09}/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs (100%) rename src/Chapter09.Tests/{ => Original09}/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs (100%) rename src/Chapter09.Tests/{ => Original09}/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs (100%) rename src/Chapter09.Tests/{ => Original09}/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs (100%) rename src/Chapter09.Tests/{ => Original09}/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs (100%) rename src/Chapter09.Tests/{ => Original09}/Listing09.17.UsingFlagsAttribute.Tests.cs (100%) delete mode 100644 src/Chapter09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs delete mode 100644 src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs delete mode 100644 src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs delete mode 100644 src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs delete mode 100644 src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs delete mode 100644 src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs delete mode 100644 src/Chapter09/Listing09.09.DefiningAnEnum.cs delete mode 100644 src/Chapter09/Listing09.10.DefiningAnEnumType.cs delete mode 100644 src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs delete mode 100644 src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs delete mode 100644 src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs delete mode 100644 src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs delete mode 100644 src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs delete mode 100644 src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs delete mode 100644 src/Chapter09/Listing09.17.UsingFlagsAttribute.cs create mode 100644 src/Chapter09/Original09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs create mode 100644 src/Chapter09/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.cs create mode 100644 src/Chapter09/Original09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs create mode 100644 src/Chapter09/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.cs create mode 100644 src/Chapter09/Original09/Listing09.07.AvoidingUnboxingAndCopying.cs create mode 100644 src/Chapter09/Original09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs create mode 100644 src/Chapter09/Original09/Listing09.09.DefiningAnEnum.cs create mode 100644 src/Chapter09/Original09/Listing09.10.DefiningAnEnumType.cs create mode 100644 src/Chapter09/Original09/Listing09.11.CastingBetweenArraysOfEnums.cs create mode 100644 src/Chapter09/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs create mode 100644 src/Chapter09/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs create mode 100644 src/Chapter09/Original09/Listing09.14.UsingEnumsAsFlags.cs create mode 100644 src/Chapter09/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs create mode 100644 src/Chapter09/Original09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs create mode 100644 src/Chapter09/Original09/Listing09.17.UsingFlagsAttribute.cs diff --git a/src/Chapter09.Tests/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs rename to src/Chapter09.Tests/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs diff --git a/src/Chapter09.Tests/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs rename to src/Chapter09.Tests/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs diff --git a/src/Chapter09.Tests/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs rename to src/Chapter09.Tests/Original09/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs diff --git a/src/Chapter09.Tests/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs rename to src/Chapter09.Tests/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs diff --git a/src/Chapter09.Tests/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs rename to src/Chapter09.Tests/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs diff --git a/src/Chapter09.Tests/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs rename to src/Chapter09.Tests/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs diff --git a/src/Chapter09.Tests/Listing09.17.UsingFlagsAttribute.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.17.UsingFlagsAttribute.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing09.17.UsingFlagsAttribute.Tests.cs rename to src/Chapter09.Tests/Original09/Listing09.17.UsingFlagsAttribute.Tests.cs diff --git a/src/Chapter09/Listing09.01.DeclaringAStruct.cs b/src/Chapter09/Listing09.01.DeclaringAStruct.cs index 8ad9d186d..da018760f 100644 --- a/src/Chapter09/Listing09.01.DeclaringAStruct.cs +++ b/src/Chapter09/Listing09.01.DeclaringAStruct.cs @@ -1,39 +1,38 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01 -{ - #region INCLUDE - // Use keyword struct to declare a value type - #region HIGHLIGHT - readonly public struct Angle - #endregion HIGHLIGHT - { - public Angle(int degrees, int minutes, int seconds) - { - Degrees = degrees; - Minutes = minutes; - Seconds = seconds; - } +//namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; - public int Degrees { get; } - public int Minutes { get; } - public int Seconds { get; } +//#region INCLUDE +//// Use keyword struct to declare a value type +//#region HIGHLIGHT +//readonly public struct Angle +//#endregion HIGHLIGHT +//{ +// public Angle(int degrees, int minutes, int seconds) +// { +// Degrees = degrees; +// Minutes = minutes; +// Seconds = seconds; +// } - public Angle Move(int degrees, int minutes, int seconds) - { - return new Angle( - Degrees + degrees, - Minutes + minutes, - Seconds + seconds); - } - } +// public int Degrees { get; } +// public int Minutes { get; } +// public int Seconds { get; } - // Declaring a class as a reference type - // (declaring it as a struct would create a value type - // larger than 16 bytes.) - class Coordinate - { - public Angle Longitude { get; set; } +// public Angle Move(int degrees, int minutes, int seconds) +// { +// return new Angle( +// Degrees + degrees, +// Minutes + minutes, +// Seconds + seconds); +// } +//} - public Angle Latitude { get; set; } - } - #endregion INCLUDE -} \ No newline at end of file +//// Declaring a class as a reference type +//// (declaring it as a struct would create a value type +//// larger than 16 bytes.) +//class Coordinate +//{ +// public Angle Longitude { get; set; } + +// public Angle Latitude { get; set; } +//} +//#endregion INCLUDE diff --git a/src/Chapter09/Listing09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs b/src/Chapter09/Listing09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs index 3414a1a9f..1ac3511f5 100644 --- a/src/Chapter09/Listing09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs +++ b/src/Chapter09/Listing09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs @@ -1,53 +1,52 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_02 -{ - // Use keyword struct to declare a value type - #region INCLUDE - struct Angle - { - #region EXCLUDE - public Angle(int degrees, int minutes, int seconds) - { - Degrees = degrees; - Minutes = minutes; - Seconds = seconds; - } - #endregion EXCLUDE - // ERROR: Fields cannot be initialized at declaration time - // private int _Degrees = 42; - #region EXCLUDE - public int Degrees { get; } +//namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_02; - public int Minutes { get; } - public int Seconds { get; } +//// Use keyword struct to declare a value type +//#region INCLUDE +//struct Angle +//{ +// #region EXCLUDE +// public Angle(int degrees, int minutes, int seconds) +// { +// Degrees = degrees; +// Minutes = minutes; +// Seconds = seconds; +// } +// #endregion EXCLUDE +// // ERROR: Fields cannot be initialized at declaration time +// // private int _Degrees = 42; +// #region EXCLUDE +// public int Degrees { get; } - public Angle Move(int degrees, int minutes, int seconds) - { - return new Angle( - Degrees + degrees, - Minutes + minutes, - Seconds + seconds); - } - #endregion EXCLUDE - } - #endregion INCLUDE +// public int Minutes { get; } +// public int Seconds { get; } - // Declaring a class as a reference type - // (declaring it as a struct would create a value type - // larger than 16 bytes.) - class Coordinate - { - public Angle Longitude - { - get { return _Longitude; } - set { _Longitude = value; } - } - private Angle _Longitude; +// public Angle Move(int degrees, int minutes, int seconds) +// { +// return new Angle( +// Degrees + degrees, +// Minutes + minutes, +// Seconds + seconds); +// } +// #endregion EXCLUDE +//} +//#endregion INCLUDE - public Angle Latitude - { - get { return _Latitude; } - set { _Latitude = value; } - } - private Angle _Latitude; - } -} \ No newline at end of file +//// Declaring a class as a reference type +//// (declaring it as a struct would create a value type +//// larger than 16 bytes.) +//class Coordinate +//{ +// public Angle Longitude +// { +// get { return _Longitude; } +// set { _Longitude = value; } +// } +// private Angle _Longitude; + +// public Angle Latitude +// { +// get { return _Latitude; } +// set { _Latitude = value; } +// } +// private Angle _Latitude; +//} \ No newline at end of file diff --git a/src/Chapter09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs b/src/Chapter09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs deleted file mode 100644 index e2be57565..000000000 --- a/src/Chapter09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs +++ /dev/null @@ -1,65 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03 -{ - // Use keyword struct to declare a value type - #region INCLUDE - struct Angle - { - // ERROR: The 'this' object cannot be used before - // all of its fields are assigned to - // public Angle(int degrees, int minutes, int seconds) - // { - #region HIGHLIGHT - // Degrees = degrees; // Shorthand for this.Hours = hours; - // Minutes = minutes; // Shorthand for this.Minutes = ...; - // Seconds = seconds; // Shorthand for this.Seconds = ...; - #endregion HIGHLIGHT - // } - - public Angle(int degrees, int minutes, int seconds) - { - _Degrees = degrees; // Shorthand for this.Degrees = ...; - _Minutes = minutes; // Shorthand for this.Minutes = ...; - _Seconds = seconds; // Shorthand for this.Seconds = ...; - } - - public int Degrees { get { return _Degrees; } } - readonly private int _Degrees; - - public int Minutes { get { return _Minutes; } } - readonly private int _Minutes; - - public int Seconds { get { return _Seconds; } } - readonly private int _Seconds; - - #region EXCLUDE - public Angle Move(int degrees, int minutes, int seconds) - { - return new Angle( - Degrees + degrees, - Minutes + minutes, - Seconds + seconds); - } - #endregion EXCLUDE - } - #endregion INCLUDE - - // Declaring a class as a reference type - // (declaring it as a struct would create a value type - // larger than 16 bytes.) - class Coordinate - { - public Angle Longitude - { - get { return _Longitude; } - set { _Longitude = value; } - } - private Angle _Longitude; - - public Angle Latitude - { - get { return _Latitude; } - set { _Latitude = value; } - } - private Angle _Latitude; - } -} \ No newline at end of file diff --git a/src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs b/src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs deleted file mode 100644 index aa3db76e0..000000000 --- a/src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04 -{ - using System; - #region INCLUDE - public class DisplayFibonacci - { - public static void Main() - { - int totalCount; - // Intentionally using ArrayList to demonstrate boxing - System.Collections.ArrayList list = - new System.Collections.ArrayList(); - - Console.Write("Enter an integer between 2 and 1000: "); - string? inputText = Console.ReadLine(); - if (!int.TryParse(inputText, out totalCount)) - { - Console.WriteLine($"'{inputText}' is not a valid integer."); - return; - } - - if (totalCount == 7) // Magic number used for testing - { - // Triggers exception when retrieving value as double. - list.Add(0); // Cast to double or 'D' suffix required. - // Whether cast or using 'D' suffix, - // CIL is identical. - - } - else - { - list.Add((double)0); - } - - list.Add((double)1); - - for(int count = 2; count < totalCount; count++) - { - list.Add( - (double)list[count - 1]! + - (double)list[count - 2]!); - } - - // Using a foreach to clarify the box operation rather than - // Console.WriteLine(string.Join(", ", list.ToArray())); - foreach (double? count in list) - { - Console.Write("{0}, ", count); - } - } - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs b/src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs deleted file mode 100644 index c0f42f7d0..000000000 --- a/src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05 -{ - public class DisplayFibonacci - { - static void Main() - { - #region INCLUDE - // ... - - int number; - object thing; - double bigNumber; - - number = 42; - thing = number; - // ERROR: InvalidCastException - // bigNumber = (double)thing; - bigNumber = (double)(int)thing; - // ... - #endregion INCLUDE - } - } -} diff --git a/src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs b/src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs deleted file mode 100644 index cf08734fa..000000000 --- a/src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06 -{ - using System; - - #region INCLUDE - interface IAngle - { - void MoveTo(int degrees, int minutes, int seconds); - } - - struct Angle : IAngle - { - #region EXCLUDE - public Angle(int degrees, int minutes, int seconds) - { - _Degrees = degrees; - _Minutes = minutes; - _Seconds = seconds; - } - #endregion EXCLUDE - - // NOTE: This makes Angle mutable, against the general - // guideline - public void MoveTo(int degrees, int minutes, int seconds) - { - _Degrees = degrees; - _Minutes = minutes; - _Seconds = seconds; - } - #region EXCLUDE - public int Degrees - { - get { return _Degrees; } - } - private int _Degrees; - - public int Minutes - { - get { return _Minutes; } - } - private int _Minutes; - - public int Seconds - { - get { return _Seconds; } - } - private int _Seconds; - #endregion EXCLUDE - } - public class Program - { - public static void Main() - { - // ... - - Angle angle = new Angle(25, 58, 23); - // Example 1: Simple box operation - object objectAngle = angle; // Box - Console.Write(((Angle)objectAngle).Degrees); - - // Example 2: Unbox, modify unboxed value, and discard value - ((Angle)objectAngle).MoveTo(26, 58, 23); - Console.Write(", " + ((Angle)objectAngle).Degrees); - - // Example 3: Box, modify boxed value, and discard reference to box - ((IAngle)angle).MoveTo(26, 58, 23); - Console.Write(", " + ((Angle)angle).Degrees); - - // Example 4: Modify boxed value directly - ((IAngle)objectAngle).MoveTo(26, 58, 23); - Console.WriteLine(", " + ((Angle)objectAngle).Degrees); - - // ... - } - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs b/src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs deleted file mode 100644 index 2ba59c454..000000000 --- a/src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07 -{ - using System; - - public class Program - { - public static void Main() - { - #region INCLUDE - int number; - object thing; - number = 42; - // Boxing - thing = number; - #region HIGHLIGHT - // No unboxing conversion - #endregion HIGHLIGHT - string text = ((IFormattable)thing).ToString( - "X", null); - Console.WriteLine(text); - #endregion INCLUDE - } - } -} diff --git a/src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs b/src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs deleted file mode 100644 index 7afeca66f..000000000 --- a/src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_08 -{ - using Listing09_10; - - public class Program - { - public static void SwitchInt() - { - #region INCLUDE - int connectionState; - #region EXCLUDE - // initialize connectionState for example - connectionState = 2; - #endregion EXCLUDE - switch (connectionState) - { - case 0: - // ... - break; - case 1: - // ... - break; - case 2: - // ... - break; - case 3: - // ... - break; - } - #region EXCLUDE - } - - public static void SwitchEnum() - { - #endregion EXCLUDE - ConnectionState connectionState; - #region EXCLUDE - // initialize connectionState for example - connectionState = ConnectionState.Connecting; - #endregion EXCLUDE - switch (connectionState) - { - case ConnectionState.Connected: - // ... - break; - case ConnectionState.Connecting: - // ... - break; - case ConnectionState.Disconnected: - // ... - break; - case ConnectionState.Disconnecting: - // ... - break; - } - #endregion INCLUDE - } - } -} diff --git a/src/Chapter09/Listing09.09.DefiningAnEnum.cs b/src/Chapter09/Listing09.09.DefiningAnEnum.cs deleted file mode 100644 index a74c73959..000000000 --- a/src/Chapter09/Listing09.09.DefiningAnEnum.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09 -{ - #region INCLUDE - enum ConnectionState - { - Disconnected, - Connecting, - Connected, - Disconnecting - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Listing09.10.DefiningAnEnumType.cs b/src/Chapter09/Listing09.10.DefiningAnEnumType.cs deleted file mode 100644 index 972027eb1..000000000 --- a/src/Chapter09/Listing09.10.DefiningAnEnumType.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_10 -{ - #region INCLUDE - enum ConnectionState : short - { - Disconnected, - Connecting = 10, - Connected, - Joined = Connected, - Disconnecting - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs b/src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs deleted file mode 100644 index c42dc1997..000000000 --- a/src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_11 -{ - using System; - #region INCLUDE - enum ConnectionState1 - { - Disconnected, - Connecting, - Connected, - Disconnecting - } - - enum ConnectionState2 - { - Disconnected, - Connecting, - Connected, - Disconnecting - } - public class Program - { - public static void Main() - { - ConnectionState1[] states = - #region HIGHLIGHT - (ConnectionState1[])(Array)new ConnectionState2[42]; - #endregion HIGHLIGHT - } - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs b/src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs deleted file mode 100644 index 3a91dc8f4..000000000 --- a/src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12 -{ - using System; - using System.Diagnostics; - - public class Program - { - public static void Main() - { - #region INCLUDE - ThreadPriorityLevel priority = (ThreadPriorityLevel)Enum.Parse( - typeof(ThreadPriorityLevel), "Idle"); - Console.WriteLine(priority); - #endregion INCLUDE - } - } -} diff --git a/src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs b/src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs deleted file mode 100644 index b8b009bad..000000000 --- a/src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_13 -{ - using System; - - public class Program - { - public static void Main() - { - #region INCLUDE - System.Diagnostics.ThreadPriorityLevel priority; - if(Enum.TryParse("Idle", out priority)) - { - Console.WriteLine(priority); - } - #endregion INCLUDE - } - } -} diff --git a/src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs b/src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs deleted file mode 100644 index 7bca3dd71..000000000 --- a/src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_14 -{ - using System; - - #region INCLUDE - [Flags] - public enum FileAttributes - { - None = 0, // 000000000000000 - ReadOnly = 1 << 0, // 000000000000001 - Hidden = 1 << 1, // 000000000000010 - System = 1 << 2, // 000000000000100 - Directory = 1 << 4, // 000000000010000 - Archive = 1 << 5, // 000000000100000 - Device = 1 << 6, // 000000001000000 - Normal = 1 << 7, // 000000010000000 - Temporary = 1 << 8, // 000000100000000 - SparseFile = 1 << 9, // 000001000000000 - ReparsePoint = 1 << 10, // 000010000000000 - Compressed = 1 << 11, // 000100000000000 - Offline = 1 << 12, // 001000000000000 - NotContentIndexed = 1 << 13, // 010000000000000 - Encrypted = 1 << 14, // 100000000000000 - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs b/src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs deleted file mode 100644 index 999857c06..000000000 --- a/src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs +++ /dev/null @@ -1,63 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15 -{ - #region INCLUDE - using System; - using System.IO; - - public class Program - { - public static void Main() - { - // ... - - string fileName = @"enumtest.txt"; - - #region EXCLUDE - System.IO.FileInfo enumFile = - new System.IO.FileInfo(fileName); - if (!enumFile.Exists) - { - enumFile.Create().Dispose(); - } - - try - { - #endregion EXCLUDE - System.IO.FileInfo file = - new System.IO.FileInfo(fileName); - - file.Attributes = FileAttributes.Hidden | - FileAttributes.ReadOnly; - - Console.WriteLine($"{file.Attributes} = {(int)file.Attributes}"); - - // Only the ReadOnly attribute works on Linux (The Hidden attribute does not work on Linux) - if (!System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Linux)) - { - // Added in C# 4.0/Microsoft .NET Framework 4.0 - if (!file.Attributes.HasFlag(FileAttributes.Hidden)) - { - throw new Exception("File is not hidden."); - } - } - - if ((file.Attributes & FileAttributes.ReadOnly) != - FileAttributes.ReadOnly) - { - throw new Exception("File is not read-only."); - } - #region EXCLUDE - } - finally - { - if (enumFile.Exists) - { - enumFile.Attributes = FileAttributes.Normal; - enumFile.Delete(); - } - } - #endregion EXCLUDE - } - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs b/src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs deleted file mode 100644 index c8419e900..000000000 --- a/src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_16 -{ - using System; - #region INCLUDE - [Flags] - enum DistributedChannel - { - None = 0, - Transacted = 1, - Queued = 2, - Encrypted = 4, - Persisted = 16, - #region HIGHLIGHT - FaultTolerant = - Transacted | Queued | Persisted - #endregion HIGHLIGHT - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Listing09.17.UsingFlagsAttribute.cs b/src/Chapter09/Listing09.17.UsingFlagsAttribute.cs deleted file mode 100644 index fd26be49f..000000000 --- a/src/Chapter09/Listing09.17.UsingFlagsAttribute.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17 -{ - #region INCLUDE - //FileAttributes are defined in System.IO - - using System; - using System.IO; - - public class Program - { - public static void Main() - { - string fileName = @"enumtest.txt"; - #region EXCLUDE - // Cleanup in case the file is left in read-only state - // and can't get created. - if (File.Exists(fileName)) - { - FileAttributes attrs = File.GetAttributes(fileName); - if (attrs.HasFlag(FileAttributes.ReadOnly)) - File.SetAttributes(fileName, attrs & ~FileAttributes.ReadOnly); - } - #endregion EXCLUDE - FileInfo file = new FileInfo(fileName); - file.Open(FileMode.OpenOrCreate).Dispose(); - - FileAttributes startingAttributes = - file.Attributes; - - file.Attributes = FileAttributes.Hidden | - FileAttributes.ReadOnly; - - Console.WriteLine("\"{0}\" outputs as \"{1}\"", - file.Attributes.ToString().Replace(",", " |"), - file.Attributes); - - FileAttributes attributes = - (FileAttributes)Enum.Parse(typeof(FileAttributes), - file.Attributes.ToString()); - - Console.WriteLine(attributes); - - File.SetAttributes(fileName, - startingAttributes); - file.Delete(); - } - } - #endregion INCLUDE -} diff --git a/src/Chapter09/Original09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs b/src/Chapter09/Original09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs new file mode 100644 index 000000000..4f3c73b33 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs @@ -0,0 +1,64 @@ +//namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03; + +//// Use keyword struct to declare a value type +//#region INCLUDE +//struct Angle +//{ +// // ERROR: The 'this' object cannot be used before +// // all of its fields are assigned to +// // public Angle(int degrees, int minutes, int seconds) +// // { +// #region HIGHLIGHT +// // Degrees = degrees; // Shorthand for this.Hours = hours; +// // Minutes = minutes; // Shorthand for this.Minutes = ...; +// // Seconds = seconds; // Shorthand for this.Seconds = ...; +// #endregion HIGHLIGHT +// // } + +// public Angle(int degrees, int minutes, int seconds) +// { +// _Degrees = degrees; // Shorthand for this.Degrees = ...; +// _Minutes = minutes; // Shorthand for this.Minutes = ...; +// _Seconds = seconds; // Shorthand for this.Seconds = ...; +// } + +// public int Degrees { get { return _Degrees; } } +// readonly private int _Degrees; + +// public int Minutes { get { return _Minutes; } } +// readonly private int _Minutes; + +// public int Seconds { get { return _Seconds; } } +// readonly private int _Seconds; + +// #region EXCLUDE +// public Angle Move(int degrees, int minutes, int seconds) +// { +// return new Angle( +// Degrees + degrees, +// Minutes + minutes, +// Seconds + seconds); +// } +// #endregion EXCLUDE +//} +//#endregion INCLUDE + +//// Declaring a class as a reference type +//// (declaring it as a struct would create a value type +//// larger than 16 bytes.) +//class Coordinate +//{ +// public Angle Longitude +// { +// get { return _Longitude; } +// set { _Longitude = value; } +// } +// private Angle _Longitude; + +// public Angle Latitude +// { +// get { return _Latitude; } +// set { _Latitude = value; } +// } +// private Angle _Latitude; +//} \ No newline at end of file diff --git a/src/Chapter09/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.cs b/src/Chapter09/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.cs new file mode 100644 index 000000000..42e4203df --- /dev/null +++ b/src/Chapter09/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.cs @@ -0,0 +1,52 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; + +using System; +#region INCLUDE +public class DisplayFibonacci +{ + public static void Main() + { + int totalCount; + // Intentionally using ArrayList to demonstrate boxing + System.Collections.ArrayList list = + new System.Collections.ArrayList(); + + Console.Write("Enter an integer between 2 and 1000: "); + string? inputText = Console.ReadLine(); + if (!int.TryParse(inputText, out totalCount)) + { + Console.WriteLine($"'{inputText}' is not a valid integer."); + return; + } + + if (totalCount == 7) // Magic number used for testing + { + // Triggers exception when retrieving value as double. + list.Add(0); // Cast to double or 'D' suffix required. + // Whether cast or using 'D' suffix, + // CIL is identical. + + } + else + { + list.Add((double)0); + } + + list.Add((double)1); + + for(int count = 2; count < totalCount; count++) + { + list.Add( + (double)list[count - 1]! + + (double)list[count - 2]!); + } + + // Using a foreach to clarify the box operation rather than + // Console.WriteLine(string.Join(", ", list.ToArray())); + foreach (double? count in list) + { + Console.Write("{0}, ", count); + } + } +} +#endregion INCLUDE diff --git a/src/Chapter09/Original09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs b/src/Chapter09/Original09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs new file mode 100644 index 000000000..7df5cfab8 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs @@ -0,0 +1,22 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05; + +public class DisplayFibonacci +{ + static void Main() + { + #region INCLUDE + // ... + + int number; + object thing; + double bigNumber; + + number = 42; + thing = number; + // ERROR: InvalidCastException + // bigNumber = (double)thing; + bigNumber = (double)(int)thing; + // ... + #endregion INCLUDE + } +} diff --git a/src/Chapter09/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.cs b/src/Chapter09/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.cs new file mode 100644 index 000000000..961b263dc --- /dev/null +++ b/src/Chapter09/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.cs @@ -0,0 +1,76 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06; + +using System; + +#region INCLUDE +interface IAngle +{ + void MoveTo(int degrees, int minutes, int seconds); +} + +struct Angle : IAngle +{ + #region EXCLUDE + public Angle(int degrees, int minutes, int seconds) + { + _Degrees = degrees; + _Minutes = minutes; + _Seconds = seconds; + } + #endregion EXCLUDE + + // NOTE: This makes Angle mutable, against the general + // guideline + public void MoveTo(int degrees, int minutes, int seconds) + { + _Degrees = degrees; + _Minutes = minutes; + _Seconds = seconds; + } + #region EXCLUDE + public int Degrees + { + get { return _Degrees; } + } + private int _Degrees; + + public int Minutes + { + get { return _Minutes; } + } + private int _Minutes; + + public int Seconds + { + get { return _Seconds; } + } + private int _Seconds; + #endregion EXCLUDE +} +public class Program +{ + public static void Main() + { + // ... + + Angle angle = new Angle(25, 58, 23); + // Example 1: Simple box operation + object objectAngle = angle; // Box + Console.Write(((Angle)objectAngle).Degrees); + + // Example 2: Unbox, modify unboxed value, and discard value + ((Angle)objectAngle).MoveTo(26, 58, 23); + Console.Write(", " + ((Angle)objectAngle).Degrees); + + // Example 3: Box, modify boxed value, and discard reference to box + ((IAngle)angle).MoveTo(26, 58, 23); + Console.Write(", " + ((Angle)angle).Degrees); + + // Example 4: Modify boxed value directly + ((IAngle)objectAngle).MoveTo(26, 58, 23); + Console.WriteLine(", " + ((Angle)objectAngle).Degrees); + + // ... + } +} +#endregion INCLUDE diff --git a/src/Chapter09/Original09/Listing09.07.AvoidingUnboxingAndCopying.cs b/src/Chapter09/Original09/Listing09.07.AvoidingUnboxingAndCopying.cs new file mode 100644 index 000000000..2bd1c5534 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.07.AvoidingUnboxingAndCopying.cs @@ -0,0 +1,23 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07; + +using System; + +public class Program +{ + public static void Main() + { + #region INCLUDE + int number; + object thing; + number = 42; + // Boxing + thing = number; + #region HIGHLIGHT + // No unboxing conversion + #endregion HIGHLIGHT + string text = ((IFormattable)thing).ToString( + "X", null); + Console.WriteLine(text); + #endregion INCLUDE + } +} diff --git a/src/Chapter09/Original09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs b/src/Chapter09/Original09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs new file mode 100644 index 000000000..d62ae3c2c --- /dev/null +++ b/src/Chapter09/Original09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs @@ -0,0 +1,58 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_08; + +using Listing09_10; + +public class Program +{ + public static void SwitchInt() + { + #region INCLUDE + int connectionState; + #region EXCLUDE + // initialize connectionState for example + connectionState = 2; + #endregion EXCLUDE + switch (connectionState) + { + case 0: + // ... + break; + case 1: + // ... + break; + case 2: + // ... + break; + case 3: + // ... + break; + } + #region EXCLUDE + } + + public static void SwitchEnum() + { + #endregion EXCLUDE + ConnectionState connectionState; + #region EXCLUDE + // initialize connectionState for example + connectionState = ConnectionState.Connecting; + #endregion EXCLUDE + switch (connectionState) + { + case ConnectionState.Connected: + // ... + break; + case ConnectionState.Connecting: + // ... + break; + case ConnectionState.Disconnected: + // ... + break; + case ConnectionState.Disconnecting: + // ... + break; + } + #endregion INCLUDE + } +} diff --git a/src/Chapter09/Original09/Listing09.09.DefiningAnEnum.cs b/src/Chapter09/Original09/Listing09.09.DefiningAnEnum.cs new file mode 100644 index 000000000..d2ec04ff1 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.09.DefiningAnEnum.cs @@ -0,0 +1,11 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09; + +#region INCLUDE +enum ConnectionState +{ + Disconnected, + Connecting, + Connected, + Disconnecting +} +#endregion INCLUDE diff --git a/src/Chapter09/Original09/Listing09.10.DefiningAnEnumType.cs b/src/Chapter09/Original09/Listing09.10.DefiningAnEnumType.cs new file mode 100644 index 000000000..a1222ea19 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.10.DefiningAnEnumType.cs @@ -0,0 +1,12 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_10; + +#region INCLUDE +enum ConnectionState : short +{ + Disconnected, + Connecting = 10, + Connected, + Joined = Connected, + Disconnecting +} +#endregion INCLUDE diff --git a/src/Chapter09/Original09/Listing09.11.CastingBetweenArraysOfEnums.cs b/src/Chapter09/Original09/Listing09.11.CastingBetweenArraysOfEnums.cs new file mode 100644 index 000000000..b1321ee58 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.11.CastingBetweenArraysOfEnums.cs @@ -0,0 +1,30 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_11; + +using System; +#region INCLUDE +enum ConnectionState1 +{ + Disconnected, + Connecting, + Connected, + Disconnecting +} + +enum ConnectionState2 +{ + Disconnected, + Connecting, + Connected, + Disconnecting +} +public class Program +{ + public static void Main() + { + ConnectionState1[] states = + #region HIGHLIGHT + (ConnectionState1[])(Array)new ConnectionState2[42]; + #endregion HIGHLIGHT + } +} +#endregion INCLUDE diff --git a/src/Chapter09/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs b/src/Chapter09/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs new file mode 100644 index 000000000..1d3b6cfe4 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs @@ -0,0 +1,16 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12; + +using System; +using System.Diagnostics; + +public class Program +{ + public static void Main() + { + #region INCLUDE + ThreadPriorityLevel priority = (ThreadPriorityLevel)Enum.Parse( + typeof(ThreadPriorityLevel), "Idle"); + Console.WriteLine(priority); + #endregion INCLUDE + } +} diff --git a/src/Chapter09/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs b/src/Chapter09/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs new file mode 100644 index 000000000..648910a8c --- /dev/null +++ b/src/Chapter09/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs @@ -0,0 +1,17 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_13; + +using System; + +public class Program +{ + public static void Main() + { + #region INCLUDE + System.Diagnostics.ThreadPriorityLevel priority; + if(Enum.TryParse("Idle", out priority)) + { + Console.WriteLine(priority); + } + #endregion INCLUDE + } +} diff --git a/src/Chapter09/Original09/Listing09.14.UsingEnumsAsFlags.cs b/src/Chapter09/Original09/Listing09.14.UsingEnumsAsFlags.cs new file mode 100644 index 000000000..5d731f54f --- /dev/null +++ b/src/Chapter09/Original09/Listing09.14.UsingEnumsAsFlags.cs @@ -0,0 +1,25 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_14; + +using System; + +#region INCLUDE +[Flags] +public enum FileAttributes +{ + None = 0, // 000000000000000 + ReadOnly = 1 << 0, // 000000000000001 + Hidden = 1 << 1, // 000000000000010 + System = 1 << 2, // 000000000000100 + Directory = 1 << 4, // 000000000010000 + Archive = 1 << 5, // 000000000100000 + Device = 1 << 6, // 000000001000000 + Normal = 1 << 7, // 000000010000000 + Temporary = 1 << 8, // 000000100000000 + SparseFile = 1 << 9, // 000001000000000 + ReparsePoint = 1 << 10, // 000010000000000 + Compressed = 1 << 11, // 000100000000000 + Offline = 1 << 12, // 001000000000000 + NotContentIndexed = 1 << 13, // 010000000000000 + Encrypted = 1 << 14, // 100000000000000 +} +#endregion INCLUDE diff --git a/src/Chapter09/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs b/src/Chapter09/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs new file mode 100644 index 000000000..b0230f185 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs @@ -0,0 +1,62 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15; + +#region INCLUDE +using System; +using System.IO; + +public class Program +{ + public static void Main() + { + // ... + + string fileName = @"enumtest.txt"; + + #region EXCLUDE + System.IO.FileInfo enumFile = + new System.IO.FileInfo(fileName); + if (!enumFile.Exists) + { + enumFile.Create().Dispose(); + } + + try + { + #endregion EXCLUDE + System.IO.FileInfo file = + new System.IO.FileInfo(fileName); + + file.Attributes = FileAttributes.Hidden | + FileAttributes.ReadOnly; + + Console.WriteLine($"{file.Attributes} = {(int)file.Attributes}"); + + // Only the ReadOnly attribute works on Linux (The Hidden attribute does not work on Linux) + if (!System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Linux)) + { + // Added in C# 4.0/Microsoft .NET Framework 4.0 + if (!file.Attributes.HasFlag(FileAttributes.Hidden)) + { + throw new Exception("File is not hidden."); + } + } + + if ((file.Attributes & FileAttributes.ReadOnly) != + FileAttributes.ReadOnly) + { + throw new Exception("File is not read-only."); + } + #region EXCLUDE + } + finally + { + if (enumFile.Exists) + { + enumFile.Attributes = FileAttributes.Normal; + enumFile.Delete(); + } + } + #endregion EXCLUDE + } +} +#endregion INCLUDE diff --git a/src/Chapter09/Original09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs b/src/Chapter09/Original09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs new file mode 100644 index 000000000..d4de8bb8a --- /dev/null +++ b/src/Chapter09/Original09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs @@ -0,0 +1,18 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_16; + +using System; +#region INCLUDE +[Flags] +enum DistributedChannel +{ + None = 0, + Transacted = 1, + Queued = 2, + Encrypted = 4, + Persisted = 16, + #region HIGHLIGHT + FaultTolerant = + Transacted | Queued | Persisted + #endregion HIGHLIGHT +} +#endregion INCLUDE diff --git a/src/Chapter09/Original09/Listing09.17.UsingFlagsAttribute.cs b/src/Chapter09/Original09/Listing09.17.UsingFlagsAttribute.cs new file mode 100644 index 000000000..498c299f7 --- /dev/null +++ b/src/Chapter09/Original09/Listing09.17.UsingFlagsAttribute.cs @@ -0,0 +1,48 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17; + +#region INCLUDE +//FileAttributes are defined in System.IO + +using System; +using System.IO; + +public class Program +{ + public static void Main() + { + string fileName = @"enumtest.txt"; + #region EXCLUDE + // Cleanup in case the file is left in read-only state + // and can't get created. + if (File.Exists(fileName)) + { + FileAttributes attrs = File.GetAttributes(fileName); + if (attrs.HasFlag(FileAttributes.ReadOnly)) + File.SetAttributes(fileName, attrs & ~FileAttributes.ReadOnly); + } + #endregion EXCLUDE + FileInfo file = new FileInfo(fileName); + file.Open(FileMode.OpenOrCreate).Dispose(); + + FileAttributes startingAttributes = + file.Attributes; + + file.Attributes = FileAttributes.Hidden | + FileAttributes.ReadOnly; + + Console.WriteLine("\"{0}\" outputs as \"{1}\"", + file.Attributes.ToString().Replace(",", " |"), + file.Attributes); + + FileAttributes attributes = + (FileAttributes)Enum.Parse(typeof(FileAttributes), + file.Attributes.ToString()); + + Console.WriteLine(attributes); + + File.SetAttributes(fileName, + startingAttributes); + file.Delete(); + } +} +#endregion INCLUDE From 2fbf58cc68c7b3b0674097de9d1297ce8713e712 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Mon, 23 Jan 2023 09:32:08 -0800 Subject: [PATCH 02/17] Record Struct Code Listings Added --- src/Chapter09.Tests/Listing.09.01.Tests.cs | 23 +++++ src/Chapter09.Tests/Listing.09.02.Tests.cs | 17 ++++ src/Chapter09.Tests/Listing.09.04.Tests.cs | 38 +++++++++ src/Chapter09/Listing.09.01.BasicStruct.cs | 7 ++ ...ting.09.02.ProgrammingWithARecordStruct.cs | 38 +++++++++ .../Listing.09.03.EquivalentNonRecordCode.cs | 85 +++++++++++++++++++ .../Listing.09.04.CustomizingARecord.cs | 55 ++++++++++++ ...ngPropertiesBeforeInitializingAllFields.cs | 64 -------------- 8 files changed, 263 insertions(+), 64 deletions(-) create mode 100644 src/Chapter09.Tests/Listing.09.01.Tests.cs create mode 100644 src/Chapter09.Tests/Listing.09.02.Tests.cs create mode 100644 src/Chapter09.Tests/Listing.09.04.Tests.cs create mode 100644 src/Chapter09/Listing.09.01.BasicStruct.cs create mode 100644 src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs create mode 100644 src/Chapter09/Listing.09.03.EquivalentNonRecordCode.cs create mode 100644 src/Chapter09/Listing.09.04.CustomizingARecord.cs delete mode 100644 src/Chapter09/Original09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs diff --git a/src/Chapter09.Tests/Listing.09.01.Tests.cs b/src/Chapter09.Tests/Listing.09.01.Tests.cs new file mode 100644 index 000000000..6b2800942 --- /dev/null +++ b/src/Chapter09.Tests/Listing.09.01.Tests.cs @@ -0,0 +1,23 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01.Tests; + +[TestClass] +public class AngleTests +{ + [TestMethod] + public void Create_AngleArray_ElementsAreUninitialized() + { + Angle angle = default; + Angle[] angles = new Angle[1]; + Assert.AreEqual(angle, angles[0]); + } + + [TestMethod] + public void Equals_CopyWithSameDegreesMinutesSeconds_AreEqual() + { + Angle angle1 = new(0, 0, 0); + Angle angle2 = new(0, 0, 0); + Assert.AreEqual(angle1, angle2); + } +} diff --git a/src/Chapter09.Tests/Listing.09.02.Tests.cs b/src/Chapter09.Tests/Listing.09.02.Tests.cs new file mode 100644 index 000000000..e5b30403e --- /dev/null +++ b/src/Chapter09.Tests/Listing.09.02.Tests.cs @@ -0,0 +1,17 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_02.Tests; + +[TestClass] +public class AngleProgramTests +{ + [TestMethod] + public void Create_Angle_Success() + { + string expected = + "Angle { Degrees = 90, Minutes = 0, Seconds = 0, Name = }"; + IntelliTect.TestTools.Console.ConsoleAssert.Expect( + expected, Program.Main); + } + +} diff --git a/src/Chapter09.Tests/Listing.09.04.Tests.cs b/src/Chapter09.Tests/Listing.09.04.Tests.cs new file mode 100644 index 000000000..cfa2e32d9 --- /dev/null +++ b/src/Chapter09.Tests/Listing.09.04.Tests.cs @@ -0,0 +1,38 @@ +using System.Diagnostics; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; + +[TestClass] +public class BookTests +{ + [TestMethod] + public void Title_Null_ThrowsArgumentNullException() => _ = new Angle(0,0,0); + + [TestMethod] + public void ToString_90Degrees_90DegreesFormatted() + { + string expected = $"90° 0' 0\""; + string actual = new Angle(90, 0, 0).ToString(); + Assert.AreEqual( + expected, + actual); + } + [TestMethod] + public void ToString_90DegreesWithName_90DegreesFormatted() + { + string expected = $"RightAngle: 90° 0' 0\""; + string actual = new Angle(90, 0, 0, "RightAngle").ToString(); + Assert.AreEqual( + expected, + actual); + } + + [TestMethod] + public void Equals_CopyWithSameDegreesMinutesSecondsBut_AreEqual() + { + Angle book1 = new(0,0,0, "90 degrees"); + Angle book2 = new(0, 0, 0); + Assert.AreEqual(book1, book2); + } +} diff --git a/src/Chapter09/Listing.09.01.BasicStruct.cs b/src/Chapter09/Listing.09.01.BasicStruct.cs new file mode 100644 index 000000000..ba4d2bd2a --- /dev/null +++ b/src/Chapter09/Listing.09.01.BasicStruct.cs @@ -0,0 +1,7 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; + +#region INCLUDE +// Use the record struct construct to declare a value type +public readonly record struct Angle( + int Degrees, int Minutes, int Seconds, string? Name = null); +#endregion INCLUDE \ No newline at end of file diff --git a/src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs b/src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs new file mode 100644 index 000000000..ecaaa6f35 --- /dev/null +++ b/src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs @@ -0,0 +1,38 @@ + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_02; + +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; +#region INCLUDE +using System.Diagnostics; + +public class Program +{ + public static void Main() + { + (int degrees, int minutes, int seconds) = ( + 90, 0, 0); + + // The constructor is generated using positional parameters + Angle angle = new(degrees, minutes, seconds); + + // Records include a ToString() implementation + // that returns: + // "Angle { Degrees = 90, Minutes = 0, Seconds = 0, Name = }" + Console.WriteLine(angle.ToString()); + + // Records have a deconstructor using the + // positional parameters. + if (angle is (int, int, int, string) angleData) + { + Trace.Assert(angle.Degrees == angleData.Degrees); + Trace.Assert(angle.Minutes == angleData.Minutes); + Trace.Assert(angle.Seconds == angleData.Seconds); + } + + Angle copy = new(degrees, minutes, seconds); + + // Records provide a custom equality operator. + Trace.Assert(angle == copy); + } +} +#endregion INCLUDE diff --git a/src/Chapter09/Listing.09.03.EquivalentNonRecordCode.cs b/src/Chapter09/Listing.09.03.EquivalentNonRecordCode.cs new file mode 100644 index 000000000..b29ea1b65 --- /dev/null +++ b/src/Chapter09/Listing.09.03.EquivalentNonRecordCode.cs @@ -0,0 +1,85 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03; + + +#region INCLUDE +using System.Runtime.CompilerServices; +using System.Text; + +[CompilerGenerated] +public readonly struct Angle : IEquatable +{ + public int Degrees { get; init; } + public int Minutes { get; init; } + public int Seconds { get; init; } + public string? Name { get; init; } + + public Angle(int Degrees, int Minutes, int Seconds, string? Name) + { + this.Degrees = Degrees; + this.Minutes = Minutes; + this.Seconds = Seconds; + this.Name = Name; + } + + public override string ToString() + { + StringBuilder stringBuilder = new(); + stringBuilder.Append("Angle"); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(' '); + } + stringBuilder.Append('}'); + return stringBuilder.ToString(); + } + + private bool PrintMembers(StringBuilder builder) + { + builder.Append("Degrees = "); + builder.Append(Degrees); + builder.Append(", Minutes = "); + builder.Append(Minutes); + builder.Append(", Seconds = "); + builder.Append(Seconds); + builder.Append(", Name = "); + builder.Append(Name); + return true; + } + + public static bool operator !=(Angle left, Angle right) => + !(left == right); + + public static bool operator ==(Angle left, Angle right) => + left.Equals(right); + + public override int GetHashCode() + { + static int GetHashCode(int integer) => + EqualityComparer.Default.GetHashCode(integer); + + return GetHashCode(Degrees) * -1521134295 + + GetHashCode(Minutes) * -1521134295 + + GetHashCode(Seconds) * -1521134295 + + EqualityComparer.Default.GetHashCode(Name!); + } + + public override bool Equals(object? obj) => + obj is Angle angle && Equals(angle); + + public bool Equals(Angle other) => + EqualityComparer.Default.Equals(Degrees, other.Degrees) + && EqualityComparer.Default.Equals(Minutes, other.Minutes) + && EqualityComparer.Default.Equals(Seconds, other.Seconds) + && EqualityComparer.Default.Equals(Name, other.Name); + + public void Deconstruct( + out int Degrees, out int Minutes, out int Seconds, string? Name) + { + Degrees = this.Degrees; + Minutes = this.Minutes; + Seconds = this.Seconds; + Name = this.Name; + } +} +#endregion INCLUDE \ No newline at end of file diff --git a/src/Chapter09/Listing.09.04.CustomizingARecord.cs b/src/Chapter09/Listing.09.04.CustomizingARecord.cs new file mode 100644 index 000000000..cdc826681 --- /dev/null +++ b/src/Chapter09/Listing.09.04.CustomizingARecord.cs @@ -0,0 +1,55 @@ +using System.Text; + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; + +public readonly record struct Angle(int Degrees, int Minutes, int Seconds, string? Name = null) +{ + // Default constructor is not invoked unless + // called explicitly by the instantiation. + public Angle() : this(-42, 0, 0, null) { } + + public Angle(string degrees, string? minutes, string seconds) + : this(degrees.Length, minutes!.Length, seconds.Length) + { + } + + public int Degrees { get; } = Degrees; + + private readonly int _Minutes = Minutes; + public int Minutes + { + get => _Minutes; + init => _Minutes=value; + } + + private readonly int _Seconds = Seconds; + public int Seconds + { + get => _Seconds; + init => _Seconds=value; + } + + public override readonly string ToString() + { + string prefix = + string.IsNullOrWhiteSpace(Name)?string.Empty : Name+": "; + return $"{prefix}{Degrees}° {Minutes}' {Seconds}\""; + } + + public bool Equals(Angle other) + { + return EqualityComparer.Default.Equals(Degrees, other.Degrees) + && EqualityComparer.Default.Equals(_Minutes, other._Minutes) + && EqualityComparer.Default.Equals(_Seconds, other._Seconds); + } + + public override int GetHashCode() => + HashCode.Combine(Degrees.GetHashCode(), + Minutes.GetHashCode(), Seconds.GetHashCode); + +#if UsingTupleToGenerateHashCode + public override int GetHashCode() => + (Degrees, Minutes, Seconds).GetHashCode(); +#endif // UsingTupleToGenerateHashCode +} + diff --git a/src/Chapter09/Original09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs b/src/Chapter09/Original09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs deleted file mode 100644 index 4f3c73b33..000000000 --- a/src/Chapter09/Original09/Listing09.03.AccessingPropertiesBeforeInitializingAllFields.cs +++ /dev/null @@ -1,64 +0,0 @@ -//namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03; - -//// Use keyword struct to declare a value type -//#region INCLUDE -//struct Angle -//{ -// // ERROR: The 'this' object cannot be used before -// // all of its fields are assigned to -// // public Angle(int degrees, int minutes, int seconds) -// // { -// #region HIGHLIGHT -// // Degrees = degrees; // Shorthand for this.Hours = hours; -// // Minutes = minutes; // Shorthand for this.Minutes = ...; -// // Seconds = seconds; // Shorthand for this.Seconds = ...; -// #endregion HIGHLIGHT -// // } - -// public Angle(int degrees, int minutes, int seconds) -// { -// _Degrees = degrees; // Shorthand for this.Degrees = ...; -// _Minutes = minutes; // Shorthand for this.Minutes = ...; -// _Seconds = seconds; // Shorthand for this.Seconds = ...; -// } - -// public int Degrees { get { return _Degrees; } } -// readonly private int _Degrees; - -// public int Minutes { get { return _Minutes; } } -// readonly private int _Minutes; - -// public int Seconds { get { return _Seconds; } } -// readonly private int _Seconds; - -// #region EXCLUDE -// public Angle Move(int degrees, int minutes, int seconds) -// { -// return new Angle( -// Degrees + degrees, -// Minutes + minutes, -// Seconds + seconds); -// } -// #endregion EXCLUDE -//} -//#endregion INCLUDE - -//// Declaring a class as a reference type -//// (declaring it as a struct would create a value type -//// larger than 16 bytes.) -//class Coordinate -//{ -// public Angle Longitude -// { -// get { return _Longitude; } -// set { _Longitude = value; } -// } -// private Angle _Longitude; - -// public Angle Latitude -// { -// get { return _Latitude; } -// set { _Latitude = value; } -// } -// private Angle _Latitude; -//} \ No newline at end of file From c88c48e2c7efbd6d244202d5b33b624d928c79f3 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Mon, 30 Jan 2023 02:18:56 -0800 Subject: [PATCH 03/17] More C# 9.0 changes --- src/Chapter09.Tests/GeoCoordinate.cs | 10 ++ src/Chapter09.Tests/Listing.09.01.Tests.cs | 12 +- src/Chapter09.Tests/Listing.09.02.Tests.cs | 4 +- src/Chapter09.Tests/Listing.09.04.Tests.cs | 57 +++++---- src/Chapter09.Tests/Listing.09.05B.Tests.cs | 42 +++++++ src/Chapter09.Tests/Listing.09.05C.Tests.cs | 35 ++++++ ....04.SubtleBoxAndUnboxInstructions.Tests.cs | 2 - ...g09.06.SubtleBoxingIdiosyncrasies.Tests.cs | 2 - ...g09.07.AvoidingUnboxingAndCopying.Tests.cs | 2 - ...ingAStringToAnEnumUsingEnum.Parse.Tests.cs | 2 - ...AStringToAnEnumUsingEnum.TryParse.Tests.cs | 2 - ...UsingBitwiseORandANDWithFlagEnums.Tests.cs | 1 - .../Listing09.17.UsingFlagsAttribute.Tests.cs | 1 - ...ting.09.02.ProgrammingWithARecordStruct.cs | 2 +- ...sting.09.03.EquivalentRecordStructCode.cs} | 0 .../Listing.09.04.DeclaringRecordClass.cs | 14 +++ ...isting.09.05B.EquivalentRecordClassCode.cs | 95 +++++++++++++++ ...s => Listing.09.05C.CustomizingARecord.cs} | 13 +- .../Listing09.01.DeclaringAStruct.cs | 38 ------ ...ldWithinADeclarationResultingInAnError.cs} | 0 .../Listing10.05.OverridingEquals.cs | 115 ------------------ src/ChapterTests.props | 3 +- src/Shared/CompilerAssert.cs | 1 - 23 files changed, 249 insertions(+), 204 deletions(-) create mode 100644 src/Chapter09.Tests/GeoCoordinate.cs create mode 100644 src/Chapter09.Tests/Listing.09.05B.Tests.cs create mode 100644 src/Chapter09.Tests/Listing.09.05C.Tests.cs rename src/Chapter09/{Listing.09.03.EquivalentNonRecordCode.cs => Listing.09.03.EquivalentRecordStructCode.cs} (100%) create mode 100644 src/Chapter09/Listing.09.04.DeclaringRecordClass.cs create mode 100644 src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs rename src/Chapter09/{Listing.09.04.CustomizingARecord.cs => Listing.09.05C.CustomizingARecord.cs} (81%) delete mode 100644 src/Chapter09/Listing09.01.DeclaringAStruct.cs rename src/Chapter09/{Listing09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs => Original09/Listing.09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs} (100%) delete mode 100644 src/Chapter10/Listing10.05.OverridingEquals.cs diff --git a/src/Chapter09.Tests/GeoCoordinate.cs b/src/Chapter09.Tests/GeoCoordinate.cs new file mode 100644 index 000000000..1417bc354 --- /dev/null +++ b/src/Chapter09.Tests/GeoCoordinate.cs @@ -0,0 +1,10 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; + +public partial class CoordinateTests +{ + public record class GeoCoordinate(Angle Longitude, Angle Latitude, string Name) : Coordinate(Longitude, Latitude) + { + public new Type ExternalEqualityContract => EqualityContract; + } +} diff --git a/src/Chapter09.Tests/Listing.09.01.Tests.cs b/src/Chapter09.Tests/Listing.09.01.Tests.cs index 6b2800942..bc718eca6 100644 --- a/src/Chapter09.Tests/Listing.09.01.Tests.cs +++ b/src/Chapter09.Tests/Listing.09.01.Tests.cs @@ -1,6 +1,4 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01.Tests; [TestClass] public class AngleTests @@ -20,4 +18,12 @@ public void Equals_CopyWithSameDegreesMinutesSeconds_AreEqual() Angle angle2 = new(0, 0, 0); Assert.AreEqual(angle1, angle2); } + + [TestMethod] + public void With_CopyWithSameDegreesMinutesSeconds_AreEqual() + { + Angle angle1 = new(0, 0, 0); + Angle angle2 = angle1 with { }; + Assert.AreEqual(angle1, angle2); + } } diff --git a/src/Chapter09.Tests/Listing.09.02.Tests.cs b/src/Chapter09.Tests/Listing.09.02.Tests.cs index e5b30403e..5a812d97f 100644 --- a/src/Chapter09.Tests/Listing.09.02.Tests.cs +++ b/src/Chapter09.Tests/Listing.09.02.Tests.cs @@ -1,6 +1,4 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_02.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_02.Tests; [TestClass] public class AngleProgramTests diff --git a/src/Chapter09.Tests/Listing.09.04.Tests.cs b/src/Chapter09.Tests/Listing.09.04.Tests.cs index cfa2e32d9..90bd688a6 100644 --- a/src/Chapter09.Tests/Listing.09.04.Tests.cs +++ b/src/Chapter09.Tests/Listing.09.04.Tests.cs @@ -1,38 +1,51 @@ -using System.Diagnostics; -using Microsoft.VisualStudio.TestTools.UnitTesting; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; [TestClass] -public class BookTests +public partial class CoordinateTests { - [TestMethod] - public void Title_Null_ThrowsArgumentNullException() => _ = new Angle(0,0,0); + [TestMethod] - public void ToString_90Degrees_90DegreesFormatted() + public void Create_Coordinate_IsReadOnly() { - string expected = $"90° 0' 0\""; - string actual = new Angle(90, 0, 0).ToString(); - Assert.AreEqual( - expected, - actual); + Coordinate coordinate = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + // coordinate.Lattitudce = new(0, 0, 0); } + [TestMethod] - public void ToString_90DegreesWithName_90DegreesFormatted() + public void With_Coordinate_IsReadOnly() { - string expected = $"RightAngle: 90° 0' 0\""; - string actual = new Angle(90, 0, 0, "RightAngle").ToString(); - Assert.AreEqual( - expected, - actual); + Coordinate coordinate1 = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + Coordinate coordinate2 = coordinate1 with { }; + + Assert.AreEqual(coordinate1, coordinate2); } [TestMethod] - public void Equals_CopyWithSameDegreesMinutesSecondsBut_AreEqual() + public void EqualityContract_GetType() { - Angle book1 = new(0,0,0, "90 degrees"); - Angle book2 = new(0, 0, 0); - Assert.AreEqual(book1, book2); + Coordinate coordinate1 = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + GeoCoordinate coordinate2 = new( + coordinate1.Longitude, coordinate1.Latitude, "Test"); + + + Assert.AreNotEqual(coordinate1.GetType(), coordinate2.GetType()); + } + + [TestMethod] + public void GetHashCode_ChangeData_GetHashCodeChanges() + { + Coordinate coordinate = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + int hashCode1 = coordinate.GetHashCode(); + //coordinate.Latitude = new(0, 0, 0); + + + // Assert.AreNotEqual(coordinate.GetType(), coordinate2.GetType()); } } diff --git a/src/Chapter09.Tests/Listing.09.05B.Tests.cs b/src/Chapter09.Tests/Listing.09.05B.Tests.cs new file mode 100644 index 000000000..e1526263d --- /dev/null +++ b/src/Chapter09.Tests/Listing.09.05B.Tests.cs @@ -0,0 +1,42 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05B.Tests; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; + +[TestClass] +public class CoordinateTests +{ + [TestMethod] + public void Create_Coordinate_IsReadOnly() + { + Coordinate coordinate = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + // coordinate.Lattitudce = new(0, 0, 0); + } + + [TestMethod] + public void With_Coordinate_IsReadOnly() + { + Coordinate coordinate1 = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + Coordinate coordinate2 = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + + Assert.AreEqual(coordinate1, coordinate2); + } + + [TestMethod] + public void EqualityContract_GetType() + { + Coordinate coordinate1 = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + Coordinate coordinate2 = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + GeoCoordinate geoCoordinate = new( + new Angle(180, 0, 0), new Angle(180, 0, 0), "GeoCoordinate"); + + Assert.AreEqual(coordinate1.ExternalEqualityContract, coordinate1.GetType()); + + Assert.AreEqual(geoCoordinate.ExternalEqualityContract, geoCoordinate.GetType()); + Assert.AreEqual(((Coordinate)geoCoordinate).ExternalEqualityContract, ((Coordinate)geoCoordinate).GetType()); + } +} diff --git a/src/Chapter09.Tests/Listing.09.05C.Tests.cs b/src/Chapter09.Tests/Listing.09.05C.Tests.cs new file mode 100644 index 000000000..541ef368a --- /dev/null +++ b/src/Chapter09.Tests/Listing.09.05C.Tests.cs @@ -0,0 +1,35 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05C.Tests; + +[TestClass] +public class AngleTests +{ + [TestMethod] + public void Title_Null_ThrowsArgumentNullException() => _ = new Angle(0,0,0); + + [TestMethod] + public void ToString_90Degrees_90DegreesFormatted() + { + string expected = $"90° 0' 0\""; + string actual = new Angle(90, 0, 0).ToString(); + Assert.AreEqual( + expected, + actual); + } + [TestMethod] + public void ToString_90DegreesWithName_90DegreesFormatted() + { + string expected = $"RightAngle: 90° 0' 0\""; + string actual = new Angle(90, 0, 0, "RightAngle").ToString(); + Assert.AreEqual( + expected, + actual); + } + + [TestMethod] + public void Equals_CopyWithSameDegreesMinutesSecondsBut_AreEqual() + { + Angle angle1 = new(0,0,0, "90 degrees"); + Angle angle2 = new(0, 0, 0); + Assert.AreEqual(angle1, angle2); + } +} diff --git a/src/Chapter09.Tests/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs index 9cbd31ecb..f13887754 100644 --- a/src/Chapter09.Tests/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs +++ b/src/Chapter09.Tests/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs @@ -1,5 +1,3 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; [TestClass] diff --git a/src/Chapter09.Tests/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs index 2e59c3f57..a34cedece 100644 --- a/src/Chapter09.Tests/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs +++ b/src/Chapter09.Tests/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs @@ -1,5 +1,3 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06.Tests; [TestClass] diff --git a/src/Chapter09.Tests/Original09/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs index d043354af..5b29e39e6 100644 --- a/src/Chapter09.Tests/Original09/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs +++ b/src/Chapter09.Tests/Original09/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs @@ -1,5 +1,3 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07.Tests; [TestClass] diff --git a/src/Chapter09.Tests/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs index e17766dc5..a6669561c 100644 --- a/src/Chapter09.Tests/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs +++ b/src/Chapter09.Tests/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs @@ -1,5 +1,3 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12.Tests; [TestClass] diff --git a/src/Chapter09.Tests/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs index 0197c3409..316875328 100644 --- a/src/Chapter09.Tests/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs +++ b/src/Chapter09.Tests/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs @@ -1,5 +1,3 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_13.Tests; [TestClass] diff --git a/src/Chapter09.Tests/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs index 46402b68a..a3fa96a7c 100644 --- a/src/Chapter09.Tests/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs +++ b/src/Chapter09.Tests/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs @@ -1,4 +1,3 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Runtime.InteropServices; namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15.Tests; diff --git a/src/Chapter09.Tests/Original09/Listing09.17.UsingFlagsAttribute.Tests.cs b/src/Chapter09.Tests/Original09/Listing09.17.UsingFlagsAttribute.Tests.cs index 34b22c849..f440f3f3f 100644 --- a/src/Chapter09.Tests/Original09/Listing09.17.UsingFlagsAttribute.Tests.cs +++ b/src/Chapter09.Tests/Original09/Listing09.17.UsingFlagsAttribute.Tests.cs @@ -1,5 +1,4 @@ using System.Runtime.InteropServices; -using Microsoft.VisualStudio.TestTools.UnitTesting; namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17.Tests; diff --git a/src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs b/src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs index ecaaa6f35..d5ab00a49 100644 --- a/src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs +++ b/src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs @@ -30,7 +30,7 @@ public static void Main() } Angle copy = new(degrees, minutes, seconds); - + // Records provide a custom equality operator. Trace.Assert(angle == copy); } diff --git a/src/Chapter09/Listing.09.03.EquivalentNonRecordCode.cs b/src/Chapter09/Listing.09.03.EquivalentRecordStructCode.cs similarity index 100% rename from src/Chapter09/Listing.09.03.EquivalentNonRecordCode.cs rename to src/Chapter09/Listing.09.03.EquivalentRecordStructCode.cs diff --git a/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs b/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs new file mode 100644 index 000000000..cea7e2faa --- /dev/null +++ b/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs @@ -0,0 +1,14 @@ +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; + +public record class Coordinate(Angle Longitude, Angle Latitude) +{ + public Type ExternalEqualityContract => EqualityContract; +} + + +public record class GeoCoordinate(Angle Longitude, Angle Latitude, string Name) : Coordinate(Longitude, Latitude) +{ + public new Type ExternalEqualityContract => EqualityContract; +} diff --git a/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs b/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs new file mode 100644 index 000000000..373f9d9fa --- /dev/null +++ b/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs @@ -0,0 +1,95 @@ +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05B; +#region INCLUDE +using System.Runtime.CompilerServices; +using System.Text; + +[CompilerGenerated] +public class Coordinate : IEquatable +{ + public Angle Longitude { get; init; } + public Angle Latitude { get; init; } + + public Coordinate Foo = null; + + + + + + public Coordinate(Angle Longitude, Angle Latitude) : + base() + { + this.Longitude = Longitude; + this.Latitude = Latitude; + } + + public override string ToString() + { + StringBuilder stringBuilder = new (); + stringBuilder.Append("Coordinate"); + stringBuilder.Append(" { "); + if (PrintMembers(stringBuilder)) + { + stringBuilder.Append(' '); + } + stringBuilder.Append('}'); + return stringBuilder.ToString(); + } + + protected virtual bool PrintMembers(StringBuilder builder) + { + RuntimeHelpers.EnsureSufficientExecutionStack(); + builder.Append("Longitude = "); + builder.Append(Longitude.ToString()); + builder.Append(", Latitude = "); + builder.Append(Latitude.ToString()); + return true; + } + + public static bool operator !=(Coordinate? left, Coordinate? right) => + !(left == right); + + public static bool operator ==(Coordinate? left, Coordinate? right) => + left == right || (left?.Equals(right) ?? false); + + public override int GetHashCode() + { + static int GetHashCode(Angle angle) => + EqualityComparer.Default.GetHashCode(angle); + + return (EqualityComparer.Default.GetHashCode(EqualityContract()) + * -1521134295 + + GetHashCode(Longitude)) * -1521134295 + + GetHashCode(Latitude); + } + + public override bool Equals(object? obj) => + Equals(obj as Coordinate); + + public virtual bool Equals(Coordinate? other) => + (object)this == other || (other is not null + && EqualityContract() == other!.EqualityContract() + && EqualityComparer.Default.Equals(Longitude, other!.Longitude) + && EqualityComparer.Default.Equals(Latitude, other!.Latitude)); + + public void Deconstruct(out Angle Longitude, out Angle Latitude) + { + Longitude = this.Longitude; + Latitude = this.Latitude; + } + + protected virtual Type EqualityContract() => typeof(Coordinate); + + public Type ExternalEqualityContract => EqualityContract(); + + public Coordinate Foo1 => Foo; + + protected Coordinate(Coordinate original) + { + Longitude = original.Longitude; + Latitude = original.Latitude; + } +} + +#endregion INCLUDE \ No newline at end of file diff --git a/src/Chapter09/Listing.09.04.CustomizingARecord.cs b/src/Chapter09/Listing.09.05C.CustomizingARecord.cs similarity index 81% rename from src/Chapter09/Listing.09.04.CustomizingARecord.cs rename to src/Chapter09/Listing.09.05C.CustomizingARecord.cs index cdc826681..477cc4f28 100644 --- a/src/Chapter09/Listing.09.04.CustomizingARecord.cs +++ b/src/Chapter09/Listing.09.05C.CustomizingARecord.cs @@ -1,6 +1,6 @@ using System.Text; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05C; public readonly record struct Angle(int Degrees, int Minutes, int Seconds, string? Name = null) { @@ -35,13 +35,10 @@ public override readonly string ToString() string.IsNullOrWhiteSpace(Name)?string.Empty : Name+": "; return $"{prefix}{Degrees}° {Minutes}' {Seconds}\""; } - - public bool Equals(Angle other) - { - return EqualityComparer.Default.Equals(Degrees, other.Degrees) - && EqualityComparer.Default.Equals(_Minutes, other._Minutes) - && EqualityComparer.Default.Equals(_Seconds, other._Seconds); - } + + public bool Equals(Angle other) => + (Degrees, Minutes, Seconds).Equals( + (other.Degrees, other.Minutes, other.Seconds)); public override int GetHashCode() => HashCode.Combine(Degrees.GetHashCode(), diff --git a/src/Chapter09/Listing09.01.DeclaringAStruct.cs b/src/Chapter09/Listing09.01.DeclaringAStruct.cs deleted file mode 100644 index da018760f..000000000 --- a/src/Chapter09/Listing09.01.DeclaringAStruct.cs +++ /dev/null @@ -1,38 +0,0 @@ -//namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; - -//#region INCLUDE -//// Use keyword struct to declare a value type -//#region HIGHLIGHT -//readonly public struct Angle -//#endregion HIGHLIGHT -//{ -// public Angle(int degrees, int minutes, int seconds) -// { -// Degrees = degrees; -// Minutes = minutes; -// Seconds = seconds; -// } - -// public int Degrees { get; } -// public int Minutes { get; } -// public int Seconds { get; } - -// public Angle Move(int degrees, int minutes, int seconds) -// { -// return new Angle( -// Degrees + degrees, -// Minutes + minutes, -// Seconds + seconds); -// } -//} - -//// Declaring a class as a reference type -//// (declaring it as a struct would create a value type -//// larger than 16 bytes.) -//class Coordinate -//{ -// public Angle Longitude { get; set; } - -// public Angle Latitude { get; set; } -//} -//#endregion INCLUDE diff --git a/src/Chapter09/Listing09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs b/src/Chapter09/Original09/Listing.09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs similarity index 100% rename from src/Chapter09/Listing09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs rename to src/Chapter09/Original09/Listing.09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs diff --git a/src/Chapter10/Listing10.05.OverridingEquals.cs b/src/Chapter10/Listing10.05.OverridingEquals.cs deleted file mode 100644 index b823c5307..000000000 --- a/src/Chapter10/Listing10.05.OverridingEquals.cs +++ /dev/null @@ -1,115 +0,0 @@ -// Justification: Listing is incomplete for purposes of elucidation. -#pragma warning disable IDE0060 // Remove unused parameter -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_05 -{ - using System; - - public class Program - { - public static void Main() - { - //... - - Coordinate coordinate1 = - new Coordinate(new Longitude(48, 52), - new Latitude(-2, -20)); - } - } - - #region INCLUDE - public struct Longitude - { - #region EXCLUDE - public Longitude(int x, int y) { } - #endregion EXCLUDE - } - - public struct Latitude - { - #region EXCLUDE - public Latitude(int x, int y) { } - #endregion EXCLUDE - } - - public struct Coordinate : IEquatable - { - public Coordinate(Longitude longitude, Latitude latitude) - { - Longitude = longitude; - Latitude = latitude; - } - - public Longitude Longitude { get; } - public Latitude Latitude { get; } - - public override bool Equals(object? obj) - { - // STEP 1: Check for null - if (obj is null) - { - return false; - } - // STEP 2: Equivalent data types - // can be avoided if type is sealed - if (this.GetType() != obj.GetType()) - { - return false; - } - - // STEP 3: Invoked strongly type helper version of Equals() - return Equals((Coordinate)obj); - } - - public bool Equals(Coordinate obj) - { - // STEP 1: Check for null if a reference type - // (e.g., a reference type) - // if (obj is null) - // { - // return false; - // } - - // STEP 4: Possibly check for equivalent hash codes - // but not if the identity properties are mutable - // and the hash code is cached. - // if (GetHashCode() != obj.GetHashCode()) - // { - // return false; - // } - - // STEP 5: Check base.Equals if base overrides Equals(). - if (!base.Equals(obj)) - { - return false; - } - - // STEP 6: Compare identifying fields for equality - // using an overload of Equals on Longitude - return ((Longitude.Equals(obj.Longitude)) && - (Latitude.Equals(obj.Latitude))); - } - - // STEP 7: Override GetHashCode - public override int GetHashCode() => - #region EXCLUDE - HashCode.Combine(Longitude.GetHashCode(), Latitude.GetHashCode()); - - // STEP 8: Override the ==/!= operators - public static bool operator ==( - Coordinate leftHandSide, - Coordinate rightHandSide) - { - return (leftHandSide.Equals(rightHandSide)); - } - - // STEP 8: Override the ==/!= operators - public static bool operator !=( - Coordinate leftHandSide, - Coordinate rightHandSide) - { - return !(leftHandSide.Equals(rightHandSide)); - } - #endregion EXCLUDE - } - #endregion INCLUDE -} \ No newline at end of file diff --git a/src/ChapterTests.props b/src/ChapterTests.props index f81d48c55..c76851570 100644 --- a/src/ChapterTests.props +++ b/src/ChapterTests.props @@ -18,7 +18,8 @@ - + + diff --git a/src/Shared/CompilerAssert.cs b/src/Shared/CompilerAssert.cs index cfb872d88..be62e568d 100644 --- a/src/Shared/CompilerAssert.cs +++ b/src/Shared/CompilerAssert.cs @@ -3,7 +3,6 @@ using Microsoft.CodeAnalysis.CSharp.Scripting; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Scripting; -using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Globalization; using System.Diagnostics; From 359fd4d2e1786bbc6ad1cd80e94c2376c7cca31b Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Tue, 31 Jan 2023 12:24:37 -0800 Subject: [PATCH 04/17] Draft code for Chapter 9 --- src/Chapter09.Tests/GeoCoordinate.cs | 11 +++++------ src/Chapter09.Tests/Listing.09.04.Tests.cs | 9 +-------- src/Chapter09.Tests/Listing.09.05B.Tests.cs | 2 +- ...isting.09.03.EquivalentRecordStructCode.cs | 2 +- .../Listing.09.04.DeclaringRecordClass.cs | 6 ------ ...isting.09.05B.EquivalentRecordClassCode.cs | 19 +++++++------------ .../Listing.09.05C.CustomizingARecord.cs | 17 +++++------------ 7 files changed, 20 insertions(+), 46 deletions(-) diff --git a/src/Chapter09.Tests/GeoCoordinate.cs b/src/Chapter09.Tests/GeoCoordinate.cs index 1417bc354..3d9c8cab6 100644 --- a/src/Chapter09.Tests/GeoCoordinate.cs +++ b/src/Chapter09.Tests/GeoCoordinate.cs @@ -1,10 +1,9 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; -public partial class CoordinateTests +public record class GeoCoordinate(Angle Longitude, Angle Latitude, string Name) + : Coordinate(Longitude, Latitude) { - public record class GeoCoordinate(Angle Longitude, Angle Latitude, string Name) : Coordinate(Longitude, Latitude) - { - public new Type ExternalEqualityContract => EqualityContract; - } + public new Type ExternalEqualityContract => EqualityContract; } diff --git a/src/Chapter09.Tests/Listing.09.04.Tests.cs b/src/Chapter09.Tests/Listing.09.04.Tests.cs index 90bd688a6..b383b606f 100644 --- a/src/Chapter09.Tests/Listing.09.04.Tests.cs +++ b/src/Chapter09.Tests/Listing.09.04.Tests.cs @@ -1,18 +1,15 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; - +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; [TestClass] public partial class CoordinateTests { - - [TestMethod] public void Create_Coordinate_IsReadOnly() { Coordinate coordinate = new( new Angle(180, 0, 0), new Angle(180, 0, 0)); - // coordinate.Lattitudce = new(0, 0, 0); } [TestMethod] @@ -43,9 +40,5 @@ public void GetHashCode_ChangeData_GetHashCodeChanges() Coordinate coordinate = new( new Angle(180, 0, 0), new Angle(180, 0, 0)); int hashCode1 = coordinate.GetHashCode(); - //coordinate.Latitude = new(0, 0, 0); - - - // Assert.AreNotEqual(coordinate.GetType(), coordinate2.GetType()); } } diff --git a/src/Chapter09.Tests/Listing.09.05B.Tests.cs b/src/Chapter09.Tests/Listing.09.05B.Tests.cs index e1526263d..68ff46cfa 100644 --- a/src/Chapter09.Tests/Listing.09.05B.Tests.cs +++ b/src/Chapter09.Tests/Listing.09.05B.Tests.cs @@ -1,6 +1,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05B.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; [TestClass] public class CoordinateTests @@ -10,7 +11,6 @@ public void Create_Coordinate_IsReadOnly() { Coordinate coordinate = new( new Angle(180, 0, 0), new Angle(180, 0, 0)); - // coordinate.Lattitudce = new(0, 0, 0); } [TestMethod] diff --git a/src/Chapter09/Listing.09.03.EquivalentRecordStructCode.cs b/src/Chapter09/Listing.09.03.EquivalentRecordStructCode.cs index b29ea1b65..84983ff55 100644 --- a/src/Chapter09/Listing.09.03.EquivalentRecordStructCode.cs +++ b/src/Chapter09/Listing.09.03.EquivalentRecordStructCode.cs @@ -74,7 +74,7 @@ public bool Equals(Angle other) => && EqualityComparer.Default.Equals(Name, other.Name); public void Deconstruct( - out int Degrees, out int Minutes, out int Seconds, string? Name) + out int Degrees, out int Minutes, out int Seconds, out string? Name) { Degrees = this.Degrees; Minutes = this.Minutes; diff --git a/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs b/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs index cea7e2faa..b93b673e8 100644 --- a/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs +++ b/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs @@ -6,9 +6,3 @@ public record class Coordinate(Angle Longitude, Angle Latitude) { public Type ExternalEqualityContract => EqualityContract; } - - -public record class GeoCoordinate(Angle Longitude, Angle Latitude, string Name) : Coordinate(Longitude, Latitude) -{ - public new Type ExternalEqualityContract => EqualityContract; -} diff --git a/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs b/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs index 373f9d9fa..b736bc8da 100644 --- a/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs +++ b/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs @@ -8,15 +8,10 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05B; [CompilerGenerated] public class Coordinate : IEquatable { + public Angle Longitude { get; init; } public Angle Latitude { get; init; } - public Coordinate Foo = null; - - - - - public Coordinate(Angle Longitude, Angle Latitude) : base() { @@ -58,8 +53,8 @@ public override int GetHashCode() static int GetHashCode(Angle angle) => EqualityComparer.Default.GetHashCode(angle); - return (EqualityComparer.Default.GetHashCode(EqualityContract()) - * -1521134295 + return (EqualityComparer.Default.GetHashCode( + EqualityContract()) * -1521134295 + GetHashCode(Longitude)) * -1521134295 + GetHashCode(Latitude); } @@ -70,8 +65,10 @@ public override bool Equals(object? obj) => public virtual bool Equals(Coordinate? other) => (object)this == other || (other is not null && EqualityContract() == other!.EqualityContract() - && EqualityComparer.Default.Equals(Longitude, other!.Longitude) - && EqualityComparer.Default.Equals(Latitude, other!.Latitude)); + && EqualityComparer.Default.Equals( + Longitude, other!.Longitude) + && EqualityComparer.Default.Equals( + Latitude, other!.Latitude)); public void Deconstruct(out Angle Longitude, out Angle Latitude) { @@ -83,8 +80,6 @@ public void Deconstruct(out Angle Longitude, out Angle Latitude) public Type ExternalEqualityContract => EqualityContract(); - public Coordinate Foo1 => Foo; - protected Coordinate(Coordinate original) { Longitude = original.Longitude; diff --git a/src/Chapter09/Listing.09.05C.CustomizingARecord.cs b/src/Chapter09/Listing.09.05C.CustomizingARecord.cs index 477cc4f28..90d874ac1 100644 --- a/src/Chapter09/Listing.09.05C.CustomizingARecord.cs +++ b/src/Chapter09/Listing.09.05C.CustomizingARecord.cs @@ -1,18 +1,8 @@ -using System.Text; - -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05C; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05C; public readonly record struct Angle(int Degrees, int Minutes, int Seconds, string? Name = null) { - // Default constructor is not invoked unless - // called explicitly by the instantiation. - public Angle() : this(-42, 0, 0, null) { } - public Angle(string degrees, string? minutes, string seconds) - : this(degrees.Length, minutes!.Length, seconds.Length) - { - } - public int Degrees { get; } = Degrees; private readonly int _Minutes = Minutes; @@ -28,6 +18,10 @@ public int Seconds get => _Seconds; init => _Seconds=value; } + public Angle(string degrees, string minutes, string seconds) + : this(int.Parse(degrees), int.Parse(minutes), int.Parse(seconds)) + { + } public override readonly string ToString() { @@ -49,4 +43,3 @@ public override int GetHashCode() => (Degrees, Minutes, Seconds).GetHashCode(); #endif // UsingTupleToGenerateHashCode } - From 9955efbf2f3966a7433e50e0749fb1e047287ca1 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Tue, 31 Jan 2023 12:33:08 -0800 Subject: [PATCH 05/17] Renumbering --- src/Chapter09.Tests/Chapter09.Tests.csproj | 3 +++ src/Chapter09.Tests/GeoCoordinate.cs | 2 +- .../{Listing.09.04.Tests.cs => Listing.09.03A.Tests.cs} | 2 +- .../{Listing.09.05B.Tests.cs => Listing.09.03B.Tests.cs} | 8 +++----- .../{Listing.09.05C.Tests.cs => Listing.09.03C.Tests.cs} | 2 +- .../Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs | 0 .../Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs | 0 .../Listing09.07.AvoidingUnboxingAndCopying.Tests.cs | 0 ...9.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs | 0 ...3.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs | 0 ...isting09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs | 0 .../Listing09.17.UsingFlagsAttribute.Tests.cs | 0 ...ordClass.cs => Listing.09.03A.DeclaringRecordClass.cs} | 2 +- ...ode.cs => Listing.09.03B.EquivalentRecordClassCode.cs} | 2 +- ...ingARecord.cs => Listing.09.03C.CustomizingARecord.cs} | 2 +- .../Listing09.04.SubtleBoxAndUnboxInstructions.cs | 6 ++---- .../Listing09.05.UnboxingMustBeToTheUnderlyingType.cs | 0 .../Listing09.06.SubtleBoxingIdiosyncrasies.cs | 0 .../Listing09.07.AvoidingUnboxingAndCopying.cs | 0 ...Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs | 0 .../{Original09 => }/Listing09.09.DefiningAnEnum.cs | 0 .../{Original09 => }/Listing09.10.DefiningAnEnumType.cs | 0 .../Listing09.11.CastingBetweenArraysOfEnums.cs | 0 ...sting09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs | 0 ...ng09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs | 0 .../{Original09 => }/Listing09.14.UsingEnumsAsFlags.cs | 0 .../Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs | 0 ...ting09.16.DefiningEnumValuesforFrequentCombinations.cs | 0 .../{Original09 => }/Listing09.17.UsingFlagsAttribute.cs | 0 29 files changed, 14 insertions(+), 15 deletions(-) rename src/Chapter09.Tests/{Listing.09.04.Tests.cs => Listing.09.03A.Tests.cs} (98%) rename src/Chapter09.Tests/{Listing.09.05B.Tests.cs => Listing.09.03B.Tests.cs} (89%) rename src/Chapter09.Tests/{Listing.09.05C.Tests.cs => Listing.09.03C.Tests.cs} (98%) rename src/Chapter09.Tests/{Original09 => }/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs (100%) rename src/Chapter09.Tests/{Original09 => }/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs (100%) rename src/Chapter09.Tests/{Original09 => }/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs (100%) rename src/Chapter09.Tests/{Original09 => }/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs (100%) rename src/Chapter09.Tests/{Original09 => }/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs (100%) rename src/Chapter09.Tests/{Original09 => }/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs (100%) rename src/Chapter09.Tests/{Original09 => }/Listing09.17.UsingFlagsAttribute.Tests.cs (100%) rename src/Chapter09/{Listing.09.04.DeclaringRecordClass.cs => Listing.09.03A.DeclaringRecordClass.cs} (96%) rename src/Chapter09/{Listing.09.05B.EquivalentRecordClassCode.cs => Listing.09.03B.EquivalentRecordClassCode.cs} (99%) rename src/Chapter09/{Listing.09.05C.CustomizingARecord.cs => Listing.09.03C.CustomizingARecord.cs} (98%) rename src/Chapter09/{Original09 => }/Listing09.04.SubtleBoxAndUnboxInstructions.cs (88%) rename src/Chapter09/{Original09 => }/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.06.SubtleBoxingIdiosyncrasies.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.07.AvoidingUnboxingAndCopying.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.09.DefiningAnEnum.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.10.DefiningAnEnumType.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.11.CastingBetweenArraysOfEnums.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.14.UsingEnumsAsFlags.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs (100%) rename src/Chapter09/{Original09 => }/Listing09.17.UsingFlagsAttribute.cs (100%) diff --git a/src/Chapter09.Tests/Chapter09.Tests.csproj b/src/Chapter09.Tests/Chapter09.Tests.csproj index fda2cccda..97d7ab7bf 100644 --- a/src/Chapter09.Tests/Chapter09.Tests.csproj +++ b/src/Chapter09.Tests/Chapter09.Tests.csproj @@ -21,4 +21,7 @@ + + + diff --git a/src/Chapter09.Tests/GeoCoordinate.cs b/src/Chapter09.Tests/GeoCoordinate.cs index 3d9c8cab6..d42d855fb 100644 --- a/src/Chapter09.Tests/GeoCoordinate.cs +++ b/src/Chapter09.Tests/GeoCoordinate.cs @@ -1,6 +1,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03A; public record class GeoCoordinate(Angle Longitude, Angle Latitude, string Name) : Coordinate(Longitude, Latitude) diff --git a/src/Chapter09.Tests/Listing.09.04.Tests.cs b/src/Chapter09.Tests/Listing.09.03A.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing.09.04.Tests.cs rename to src/Chapter09.Tests/Listing.09.03A.Tests.cs index b383b606f..9a49db6f6 100644 --- a/src/Chapter09.Tests/Listing.09.04.Tests.cs +++ b/src/Chapter09.Tests/Listing.09.03A.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03A.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; diff --git a/src/Chapter09.Tests/Listing.09.05B.Tests.cs b/src/Chapter09.Tests/Listing.09.03B.Tests.cs similarity index 89% rename from src/Chapter09.Tests/Listing.09.05B.Tests.cs rename to src/Chapter09.Tests/Listing.09.03B.Tests.cs index 68ff46cfa..e3ac25f4b 100644 --- a/src/Chapter09.Tests/Listing.09.05B.Tests.cs +++ b/src/Chapter09.Tests/Listing.09.03B.Tests.cs @@ -1,6 +1,6 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05B.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03B.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03A; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; [TestClass] @@ -9,7 +9,7 @@ public class CoordinateTests [TestMethod] public void Create_Coordinate_IsReadOnly() { - Coordinate coordinate = new( + _ = new Coordinate( new Angle(180, 0, 0), new Angle(180, 0, 0)); } @@ -29,8 +29,6 @@ public void EqualityContract_GetType() { Coordinate coordinate1 = new( new Angle(180, 0, 0), new Angle(180, 0, 0)); - Coordinate coordinate2 = new( - new Angle(180, 0, 0), new Angle(180, 0, 0)); GeoCoordinate geoCoordinate = new( new Angle(180, 0, 0), new Angle(180, 0, 0), "GeoCoordinate"); diff --git a/src/Chapter09.Tests/Listing.09.05C.Tests.cs b/src/Chapter09.Tests/Listing.09.03C.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing.09.05C.Tests.cs rename to src/Chapter09.Tests/Listing.09.03C.Tests.cs index 541ef368a..bf9486230 100644 --- a/src/Chapter09.Tests/Listing.09.05C.Tests.cs +++ b/src/Chapter09.Tests/Listing.09.03C.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05C.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03C.Tests; [TestClass] public class AngleTests diff --git a/src/Chapter09.Tests/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs b/src/Chapter09.Tests/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs rename to src/Chapter09.Tests/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs diff --git a/src/Chapter09.Tests/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs b/src/Chapter09.Tests/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs rename to src/Chapter09.Tests/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs diff --git a/src/Chapter09.Tests/Original09/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs b/src/Chapter09.Tests/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Original09/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs rename to src/Chapter09.Tests/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs diff --git a/src/Chapter09.Tests/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs b/src/Chapter09.Tests/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs rename to src/Chapter09.Tests/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs diff --git a/src/Chapter09.Tests/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs b/src/Chapter09.Tests/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs rename to src/Chapter09.Tests/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs diff --git a/src/Chapter09.Tests/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs b/src/Chapter09.Tests/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs rename to src/Chapter09.Tests/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs diff --git a/src/Chapter09.Tests/Original09/Listing09.17.UsingFlagsAttribute.Tests.cs b/src/Chapter09.Tests/Listing09.17.UsingFlagsAttribute.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Original09/Listing09.17.UsingFlagsAttribute.Tests.cs rename to src/Chapter09.Tests/Listing09.17.UsingFlagsAttribute.Tests.cs diff --git a/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs b/src/Chapter09/Listing.09.03A.DeclaringRecordClass.cs similarity index 96% rename from src/Chapter09/Listing.09.04.DeclaringRecordClass.cs rename to src/Chapter09/Listing.09.03A.DeclaringRecordClass.cs index b93b673e8..ab5d035aa 100644 --- a/src/Chapter09/Listing.09.04.DeclaringRecordClass.cs +++ b/src/Chapter09/Listing.09.03A.DeclaringRecordClass.cs @@ -1,6 +1,6 @@ using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03A; public record class Coordinate(Angle Longitude, Angle Latitude) { diff --git a/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs b/src/Chapter09/Listing.09.03B.EquivalentRecordClassCode.cs similarity index 99% rename from src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs rename to src/Chapter09/Listing.09.03B.EquivalentRecordClassCode.cs index b736bc8da..d802516e4 100644 --- a/src/Chapter09/Listing.09.05B.EquivalentRecordClassCode.cs +++ b/src/Chapter09/Listing.09.03B.EquivalentRecordClassCode.cs @@ -1,6 +1,6 @@ using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05B; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03B; #region INCLUDE using System.Runtime.CompilerServices; using System.Text; diff --git a/src/Chapter09/Listing.09.05C.CustomizingARecord.cs b/src/Chapter09/Listing.09.03C.CustomizingARecord.cs similarity index 98% rename from src/Chapter09/Listing.09.05C.CustomizingARecord.cs rename to src/Chapter09/Listing.09.03C.CustomizingARecord.cs index 90d874ac1..9d6aa95a7 100644 --- a/src/Chapter09/Listing.09.05C.CustomizingARecord.cs +++ b/src/Chapter09/Listing.09.03C.CustomizingARecord.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05C; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03C; public readonly record struct Angle(int Degrees, int Minutes, int Seconds, string? Name = null) { diff --git a/src/Chapter09/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.cs b/src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs similarity index 88% rename from src/Chapter09/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.cs rename to src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs index 42e4203df..f125ff456 100644 --- a/src/Chapter09/Original09/Listing09.04.SubtleBoxAndUnboxInstructions.cs +++ b/src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs @@ -6,14 +6,12 @@ public class DisplayFibonacci { public static void Main() { - int totalCount; // Intentionally using ArrayList to demonstrate boxing - System.Collections.ArrayList list = - new System.Collections.ArrayList(); + System.Collections.ArrayList list = new(); Console.Write("Enter an integer between 2 and 1000: "); string? inputText = Console.ReadLine(); - if (!int.TryParse(inputText, out totalCount)) + if (!int.TryParse(inputText, out int totalCount)) { Console.WriteLine($"'{inputText}' is not a valid integer."); return; diff --git a/src/Chapter09/Original09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs b/src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs rename to src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs diff --git a/src/Chapter09/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.cs b/src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.06.SubtleBoxingIdiosyncrasies.cs rename to src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs diff --git a/src/Chapter09/Original09/Listing09.07.AvoidingUnboxingAndCopying.cs b/src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.07.AvoidingUnboxingAndCopying.cs rename to src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs diff --git a/src/Chapter09/Original09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs b/src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs rename to src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs diff --git a/src/Chapter09/Original09/Listing09.09.DefiningAnEnum.cs b/src/Chapter09/Listing09.09.DefiningAnEnum.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.09.DefiningAnEnum.cs rename to src/Chapter09/Listing09.09.DefiningAnEnum.cs diff --git a/src/Chapter09/Original09/Listing09.10.DefiningAnEnumType.cs b/src/Chapter09/Listing09.10.DefiningAnEnumType.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.10.DefiningAnEnumType.cs rename to src/Chapter09/Listing09.10.DefiningAnEnumType.cs diff --git a/src/Chapter09/Original09/Listing09.11.CastingBetweenArraysOfEnums.cs b/src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.11.CastingBetweenArraysOfEnums.cs rename to src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs diff --git a/src/Chapter09/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs b/src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs rename to src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs diff --git a/src/Chapter09/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs b/src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs rename to src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs diff --git a/src/Chapter09/Original09/Listing09.14.UsingEnumsAsFlags.cs b/src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.14.UsingEnumsAsFlags.cs rename to src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs diff --git a/src/Chapter09/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs b/src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs rename to src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs diff --git a/src/Chapter09/Original09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs b/src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs rename to src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs diff --git a/src/Chapter09/Original09/Listing09.17.UsingFlagsAttribute.cs b/src/Chapter09/Listing09.17.UsingFlagsAttribute.cs similarity index 100% rename from src/Chapter09/Original09/Listing09.17.UsingFlagsAttribute.cs rename to src/Chapter09/Listing09.17.UsingFlagsAttribute.cs From 408aa482280d234987efae101b4d53a963830cde Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Tue, 31 Jan 2023 12:53:15 -0800 Subject: [PATCH 06/17] Fix incorrect naming convention --- .../{Listing.09.01.Tests.cs => Listing09.01.Tests.cs} | 0 .../{Listing.09.02.Tests.cs => Listing09.02.Tests.cs} | 0 .../{Listing.09.03A.Tests.cs => Listing09.03A.Tests.cs} | 0 .../{Listing.09.03B.Tests.cs => Listing09.03B.Tests.cs} | 0 .../{Listing.09.03C.Tests.cs => Listing09.03C.Tests.cs} | 0 .../{Listing.09.01.BasicStruct.cs => Listing09.01.BasicStruct.cs} | 0 ...cordStruct.cs => Listing09.02.ProgrammingWithARecordStruct.cs} | 0 ...rdStructCode.cs => Listing09.03.EquivalentRecordStructCode.cs} | 0 ...laringRecordClass.cs => Listing09.03A.DeclaringRecordClass.cs} | 0 ...ordClassCode.cs => Listing09.03B.EquivalentRecordClassCode.cs} | 0 ....CustomizingARecord.cs => Listing09.03C.CustomizingARecord.cs} | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename src/Chapter09.Tests/{Listing.09.01.Tests.cs => Listing09.01.Tests.cs} (100%) rename src/Chapter09.Tests/{Listing.09.02.Tests.cs => Listing09.02.Tests.cs} (100%) rename src/Chapter09.Tests/{Listing.09.03A.Tests.cs => Listing09.03A.Tests.cs} (100%) rename src/Chapter09.Tests/{Listing.09.03B.Tests.cs => Listing09.03B.Tests.cs} (100%) rename src/Chapter09.Tests/{Listing.09.03C.Tests.cs => Listing09.03C.Tests.cs} (100%) rename src/Chapter09/{Listing.09.01.BasicStruct.cs => Listing09.01.BasicStruct.cs} (100%) rename src/Chapter09/{Listing.09.02.ProgrammingWithARecordStruct.cs => Listing09.02.ProgrammingWithARecordStruct.cs} (100%) rename src/Chapter09/{Listing.09.03.EquivalentRecordStructCode.cs => Listing09.03.EquivalentRecordStructCode.cs} (100%) rename src/Chapter09/{Listing.09.03A.DeclaringRecordClass.cs => Listing09.03A.DeclaringRecordClass.cs} (100%) rename src/Chapter09/{Listing.09.03B.EquivalentRecordClassCode.cs => Listing09.03B.EquivalentRecordClassCode.cs} (100%) rename src/Chapter09/{Listing.09.03C.CustomizingARecord.cs => Listing09.03C.CustomizingARecord.cs} (100%) diff --git a/src/Chapter09.Tests/Listing.09.01.Tests.cs b/src/Chapter09.Tests/Listing09.01.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing.09.01.Tests.cs rename to src/Chapter09.Tests/Listing09.01.Tests.cs diff --git a/src/Chapter09.Tests/Listing.09.02.Tests.cs b/src/Chapter09.Tests/Listing09.02.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing.09.02.Tests.cs rename to src/Chapter09.Tests/Listing09.02.Tests.cs diff --git a/src/Chapter09.Tests/Listing.09.03A.Tests.cs b/src/Chapter09.Tests/Listing09.03A.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing.09.03A.Tests.cs rename to src/Chapter09.Tests/Listing09.03A.Tests.cs diff --git a/src/Chapter09.Tests/Listing.09.03B.Tests.cs b/src/Chapter09.Tests/Listing09.03B.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing.09.03B.Tests.cs rename to src/Chapter09.Tests/Listing09.03B.Tests.cs diff --git a/src/Chapter09.Tests/Listing.09.03C.Tests.cs b/src/Chapter09.Tests/Listing09.03C.Tests.cs similarity index 100% rename from src/Chapter09.Tests/Listing.09.03C.Tests.cs rename to src/Chapter09.Tests/Listing09.03C.Tests.cs diff --git a/src/Chapter09/Listing.09.01.BasicStruct.cs b/src/Chapter09/Listing09.01.BasicStruct.cs similarity index 100% rename from src/Chapter09/Listing.09.01.BasicStruct.cs rename to src/Chapter09/Listing09.01.BasicStruct.cs diff --git a/src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs b/src/Chapter09/Listing09.02.ProgrammingWithARecordStruct.cs similarity index 100% rename from src/Chapter09/Listing.09.02.ProgrammingWithARecordStruct.cs rename to src/Chapter09/Listing09.02.ProgrammingWithARecordStruct.cs diff --git a/src/Chapter09/Listing.09.03.EquivalentRecordStructCode.cs b/src/Chapter09/Listing09.03.EquivalentRecordStructCode.cs similarity index 100% rename from src/Chapter09/Listing.09.03.EquivalentRecordStructCode.cs rename to src/Chapter09/Listing09.03.EquivalentRecordStructCode.cs diff --git a/src/Chapter09/Listing.09.03A.DeclaringRecordClass.cs b/src/Chapter09/Listing09.03A.DeclaringRecordClass.cs similarity index 100% rename from src/Chapter09/Listing.09.03A.DeclaringRecordClass.cs rename to src/Chapter09/Listing09.03A.DeclaringRecordClass.cs diff --git a/src/Chapter09/Listing.09.03B.EquivalentRecordClassCode.cs b/src/Chapter09/Listing09.03B.EquivalentRecordClassCode.cs similarity index 100% rename from src/Chapter09/Listing.09.03B.EquivalentRecordClassCode.cs rename to src/Chapter09/Listing09.03B.EquivalentRecordClassCode.cs diff --git a/src/Chapter09/Listing.09.03C.CustomizingARecord.cs b/src/Chapter09/Listing09.03C.CustomizingARecord.cs similarity index 100% rename from src/Chapter09/Listing.09.03C.CustomizingARecord.cs rename to src/Chapter09/Listing09.03C.CustomizingARecord.cs From 974badef1671d4edca42548299fe83289c13b19e Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Tue, 31 Jan 2023 13:05:03 -0800 Subject: [PATCH 07/17] Completed renumbering --- src/Chapter09.Tests/GeoCoordinate.cs | 2 +- ...isting09.04.DeclaringRecordClass.Tests.cs} | 2 +- ...g09.05.EquivalentRecordClassCode.Tests.cs} | 4 +- ... Listing09.06.CustomizingARecord.Tests.cs} | 2 +- ...07.SubtleBoxAndUnboxInstructions.Tests.cs} | 2 +- ...09.09.SubtleBoxingIdiosyncrasies.Tests.cs} | 2 +- ...09.10.AvoidingUnboxingAndCopying.Tests.cs} | 2 +- ...ngAStringToAnEnumUsingEnum.Parse.Tests.cs} | 2 +- ...StringToAnEnumUsingEnum.TryParse.Tests.cs} | 2 +- ...singBitwiseORandANDWithFlagEnums.Tests.cs} | 2 +- ...Listing09.20.UsingFlagsAttribute.Tests.cs} | 2 +- ...s => Listing09.04.DeclaringRecordClass.cs} | 4 +- ...Listing09.05.EquivalentRecordClassCode.cs} | 6 +-- ....cs => Listing09.06.CustomizingARecord.cs} | 2 +- ...ing09.07.SubtleBoxAndUnboxInstructions.cs} | 2 +- ...9.08.UnboxingMustBeToTheUnderlyingType.cs} | 2 +- ...isting09.09.SubtleBoxingIdiosyncrasies.cs} | 2 +- ...isting09.10.AvoidingUnboxingAndCopying.cs} | 2 +- ...ComparingAnIntegerSwitchToAnEnumSwitch.cs} | 4 +- ...Enum.cs => Listing09.12.DefiningAnEnum.cs} | 2 +- ....cs => Listing09.13.DefiningAnEnumType.cs} | 2 +- ...sting09.14.CastingBetweenArraysOfEnums.cs} | 2 +- ...nvertingAStringToAnEnumUsingEnum.Parse.cs} | 2 +- ...rtingAStringToAnEnumUsingEnum.TryParse.cs} | 2 +- ...s.cs => Listing09.17.UsingEnumsAsFlags.cs} | 2 +- ...9.18.UsingBitwiseORandANDWithFlagEnums.cs} | 2 +- ...iningEnumValuesforFrequentCombinations.cs} | 2 +- ...cs => Listing09.20.UsingFlagsAttribute.cs} | 2 +- ...eldWithinADeclarationResultingInAnError.cs | 52 ------------------- 29 files changed, 33 insertions(+), 85 deletions(-) rename src/Chapter09.Tests/{Listing09.03A.Tests.cs => Listing09.04.DeclaringRecordClass.Tests.cs} (93%) rename src/Chapter09.Tests/{Listing09.03B.Tests.cs => Listing09.05.EquivalentRecordClassCode.Tests.cs} (93%) rename src/Chapter09.Tests/{Listing09.03C.Tests.cs => Listing09.06.CustomizingARecord.Tests.cs} (91%) rename src/Chapter09.Tests/{Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs => Listing09.07.SubtleBoxAndUnboxInstructions.Tests.cs} (98%) rename src/Chapter09.Tests/{Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs => Listing09.09.SubtleBoxingIdiosyncrasies.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.07.AvoidingUnboxingAndCopying.Tests.cs => Listing09.10.AvoidingUnboxingAndCopying.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs => Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs => Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs => Listing09.18.UsingBitwiseORandANDWithFlagEnums.Tests.cs} (98%) rename src/Chapter09.Tests/{Listing09.17.UsingFlagsAttribute.Tests.cs => Listing09.20.UsingFlagsAttribute.Tests.cs} (97%) rename src/Chapter09/{Listing09.03A.DeclaringRecordClass.cs => Listing09.04.DeclaringRecordClass.cs} (70%) rename src/Chapter09/{Listing09.03B.EquivalentRecordClassCode.cs => Listing09.05.EquivalentRecordClassCode.cs} (96%) rename src/Chapter09/{Listing09.03C.CustomizingARecord.cs => Listing09.06.CustomizingARecord.cs} (94%) rename src/Chapter09/{Listing09.04.SubtleBoxAndUnboxInstructions.cs => Listing09.07.SubtleBoxAndUnboxInstructions.cs} (99%) rename src/Chapter09/{Listing09.05.UnboxingMustBeToTheUnderlyingType.cs => Listing09.08.UnboxingMustBeToTheUnderlyingType.cs} (97%) rename src/Chapter09/{Listing09.06.SubtleBoxingIdiosyncrasies.cs => Listing09.09.SubtleBoxingIdiosyncrasies.cs} (99%) rename src/Chapter09/{Listing09.07.AvoidingUnboxingAndCopying.cs => Listing09.10.AvoidingUnboxingAndCopying.cs} (98%) rename src/Chapter09/{Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs => Listing09.11.ComparingAnIntegerSwitchToAnEnumSwitch.cs} (97%) rename src/Chapter09/{Listing09.09.DefiningAnEnum.cs => Listing09.12.DefiningAnEnum.cs} (95%) rename src/Chapter09/{Listing09.10.DefiningAnEnumType.cs => Listing09.13.DefiningAnEnumType.cs} (95%) rename src/Chapter09/{Listing09.11.CastingBetweenArraysOfEnums.cs => Listing09.14.CastingBetweenArraysOfEnums.cs} (98%) rename src/Chapter09/{Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs => Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.cs} (97%) rename src/Chapter09/{Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs => Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.cs} (97%) rename src/Chapter09/{Listing09.14.UsingEnumsAsFlags.cs => Listing09.17.UsingEnumsAsFlags.cs} (98%) rename src/Chapter09/{Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs => Listing09.18.UsingBitwiseORandANDWithFlagEnums.cs} (99%) rename src/Chapter09/{Listing09.16.DefiningEnumValuesforFrequentCombinations.cs => Listing09.19.DefiningEnumValuesforFrequentCombinations.cs} (97%) rename src/Chapter09/{Listing09.17.UsingFlagsAttribute.cs => Listing09.20.UsingFlagsAttribute.cs} (99%) delete mode 100644 src/Chapter09/Original09/Listing.09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs diff --git a/src/Chapter09.Tests/GeoCoordinate.cs b/src/Chapter09.Tests/GeoCoordinate.cs index d42d855fb..3d9c8cab6 100644 --- a/src/Chapter09.Tests/GeoCoordinate.cs +++ b/src/Chapter09.Tests/GeoCoordinate.cs @@ -1,6 +1,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03A; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; public record class GeoCoordinate(Angle Longitude, Angle Latitude, string Name) : Coordinate(Longitude, Latitude) diff --git a/src/Chapter09.Tests/Listing09.03A.Tests.cs b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs similarity index 93% rename from src/Chapter09.Tests/Listing09.03A.Tests.cs rename to src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs index 9a49db6f6..25ab16c5a 100644 --- a/src/Chapter09.Tests/Listing09.03A.Tests.cs +++ b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03A.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; diff --git a/src/Chapter09.Tests/Listing09.03B.Tests.cs b/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs similarity index 93% rename from src/Chapter09.Tests/Listing09.03B.Tests.cs rename to src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs index e3ac25f4b..feb47a466 100644 --- a/src/Chapter09.Tests/Listing09.03B.Tests.cs +++ b/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs @@ -1,6 +1,6 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03B.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03A; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; [TestClass] diff --git a/src/Chapter09.Tests/Listing09.03C.Tests.cs b/src/Chapter09.Tests/Listing09.06.CustomizingARecord.Tests.cs similarity index 91% rename from src/Chapter09.Tests/Listing09.03C.Tests.cs rename to src/Chapter09.Tests/Listing09.06.CustomizingARecord.Tests.cs index bf9486230..e52c1c6cd 100644 --- a/src/Chapter09.Tests/Listing09.03C.Tests.cs +++ b/src/Chapter09.Tests/Listing09.06.CustomizingARecord.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03C.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06.Tests; [TestClass] public class AngleTests diff --git a/src/Chapter09.Tests/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs b/src/Chapter09.Tests/Listing09.07.SubtleBoxAndUnboxInstructions.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs rename to src/Chapter09.Tests/Listing09.07.SubtleBoxAndUnboxInstructions.Tests.cs index f13887754..cc8740c51 100644 --- a/src/Chapter09.Tests/Listing09.04.SubtleBoxAndUnboxInstructions.Tests.cs +++ b/src/Chapter09.Tests/Listing09.07.SubtleBoxAndUnboxInstructions.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs b/src/Chapter09.Tests/Listing09.09.SubtleBoxingIdiosyncrasies.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs rename to src/Chapter09.Tests/Listing09.09.SubtleBoxingIdiosyncrasies.Tests.cs index a34cedece..a9aa8609e 100644 --- a/src/Chapter09.Tests/Listing09.06.SubtleBoxingIdiosyncrasies.Tests.cs +++ b/src/Chapter09.Tests/Listing09.09.SubtleBoxingIdiosyncrasies.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs b/src/Chapter09.Tests/Listing09.10.AvoidingUnboxingAndCopying.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs rename to src/Chapter09.Tests/Listing09.10.AvoidingUnboxingAndCopying.Tests.cs index 5b29e39e6..cb6a0d6a7 100644 --- a/src/Chapter09.Tests/Listing09.07.AvoidingUnboxingAndCopying.Tests.cs +++ b/src/Chapter09.Tests/Listing09.10.AvoidingUnboxingAndCopying.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_10.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs b/src/Chapter09.Tests/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs rename to src/Chapter09.Tests/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs index a6669561c..a56cc91d5 100644 --- a/src/Chapter09.Tests/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs +++ b/src/Chapter09.Tests/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs b/src/Chapter09.Tests/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs rename to src/Chapter09.Tests/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs index 316875328..7685fbb16 100644 --- a/src/Chapter09.Tests/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs +++ b/src/Chapter09.Tests/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_13.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_16.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs b/src/Chapter09.Tests/Listing09.18.UsingBitwiseORandANDWithFlagEnums.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs rename to src/Chapter09.Tests/Listing09.18.UsingBitwiseORandANDWithFlagEnums.Tests.cs index a3fa96a7c..8cb62bddf 100644 --- a/src/Chapter09.Tests/Listing09.15.UsingBitwiseORandANDWithFlagEnums.Tests.cs +++ b/src/Chapter09.Tests/Listing09.18.UsingBitwiseORandANDWithFlagEnums.Tests.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.17.UsingFlagsAttribute.Tests.cs b/src/Chapter09.Tests/Listing09.20.UsingFlagsAttribute.Tests.cs similarity index 97% rename from src/Chapter09.Tests/Listing09.17.UsingFlagsAttribute.Tests.cs rename to src/Chapter09.Tests/Listing09.20.UsingFlagsAttribute.Tests.cs index f440f3f3f..76e852eb0 100644 --- a/src/Chapter09.Tests/Listing09.17.UsingFlagsAttribute.Tests.cs +++ b/src/Chapter09.Tests/Listing09.20.UsingFlagsAttribute.Tests.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09/Listing09.03A.DeclaringRecordClass.cs b/src/Chapter09/Listing09.04.DeclaringRecordClass.cs similarity index 70% rename from src/Chapter09/Listing09.03A.DeclaringRecordClass.cs rename to src/Chapter09/Listing09.04.DeclaringRecordClass.cs index ab5d035aa..86df01243 100644 --- a/src/Chapter09/Listing09.03A.DeclaringRecordClass.cs +++ b/src/Chapter09/Listing09.04.DeclaringRecordClass.cs @@ -1,6 +1,6 @@ -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03A; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; public record class Coordinate(Angle Longitude, Angle Latitude) { diff --git a/src/Chapter09/Listing09.03B.EquivalentRecordClassCode.cs b/src/Chapter09/Listing09.05.EquivalentRecordClassCode.cs similarity index 96% rename from src/Chapter09/Listing09.03B.EquivalentRecordClassCode.cs rename to src/Chapter09/Listing09.05.EquivalentRecordClassCode.cs index d802516e4..677208bf6 100644 --- a/src/Chapter09/Listing09.03B.EquivalentRecordClassCode.cs +++ b/src/Chapter09/Listing09.05.EquivalentRecordClassCode.cs @@ -1,6 +1,6 @@ -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03B; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05; #region INCLUDE using System.Runtime.CompilerServices; using System.Text; @@ -87,4 +87,4 @@ protected Coordinate(Coordinate original) } } -#endregion INCLUDE \ No newline at end of file +#endregion INCLUDE diff --git a/src/Chapter09/Listing09.03C.CustomizingARecord.cs b/src/Chapter09/Listing09.06.CustomizingARecord.cs similarity index 94% rename from src/Chapter09/Listing09.03C.CustomizingARecord.cs rename to src/Chapter09/Listing09.06.CustomizingARecord.cs index 9d6aa95a7..39fa26b4b 100644 --- a/src/Chapter09/Listing09.03C.CustomizingARecord.cs +++ b/src/Chapter09/Listing09.06.CustomizingARecord.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_03C; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06; public readonly record struct Angle(int Degrees, int Minutes, int Seconds, string? Name = null) { diff --git a/src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs b/src/Chapter09/Listing09.07.SubtleBoxAndUnboxInstructions.cs similarity index 99% rename from src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs rename to src/Chapter09/Listing09.07.SubtleBoxAndUnboxInstructions.cs index f125ff456..587ed532b 100644 --- a/src/Chapter09/Listing09.04.SubtleBoxAndUnboxInstructions.cs +++ b/src/Chapter09/Listing09.07.SubtleBoxAndUnboxInstructions.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07; using System; #region INCLUDE diff --git a/src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs b/src/Chapter09/Listing09.08.UnboxingMustBeToTheUnderlyingType.cs similarity index 97% rename from src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs rename to src/Chapter09/Listing09.08.UnboxingMustBeToTheUnderlyingType.cs index 7df5cfab8..52c8fddbf 100644 --- a/src/Chapter09/Listing09.05.UnboxingMustBeToTheUnderlyingType.cs +++ b/src/Chapter09/Listing09.08.UnboxingMustBeToTheUnderlyingType.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_08; public class DisplayFibonacci { diff --git a/src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs b/src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs similarity index 99% rename from src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs rename to src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs index 961b263dc..bbd035dec 100644 --- a/src/Chapter09/Listing09.06.SubtleBoxingIdiosyncrasies.cs +++ b/src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09; using System; diff --git a/src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs b/src/Chapter09/Listing09.10.AvoidingUnboxingAndCopying.cs similarity index 98% rename from src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs rename to src/Chapter09/Listing09.10.AvoidingUnboxingAndCopying.cs index 2bd1c5534..4cf2adc45 100644 --- a/src/Chapter09/Listing09.07.AvoidingUnboxingAndCopying.cs +++ b/src/Chapter09/Listing09.10.AvoidingUnboxingAndCopying.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_10; using System; diff --git a/src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs b/src/Chapter09/Listing09.11.ComparingAnIntegerSwitchToAnEnumSwitch.cs similarity index 97% rename from src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs rename to src/Chapter09/Listing09.11.ComparingAnIntegerSwitchToAnEnumSwitch.cs index d62ae3c2c..4c207cf3b 100644 --- a/src/Chapter09/Listing09.08.ComparingAnIntegerSwitchToAnEnumSwitch.cs +++ b/src/Chapter09/Listing09.11.ComparingAnIntegerSwitchToAnEnumSwitch.cs @@ -1,6 +1,6 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_08; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_11; -using Listing09_10; +using Listing09_13; public class Program { diff --git a/src/Chapter09/Listing09.09.DefiningAnEnum.cs b/src/Chapter09/Listing09.12.DefiningAnEnum.cs similarity index 95% rename from src/Chapter09/Listing09.09.DefiningAnEnum.cs rename to src/Chapter09/Listing09.12.DefiningAnEnum.cs index d2ec04ff1..e54335924 100644 --- a/src/Chapter09/Listing09.09.DefiningAnEnum.cs +++ b/src/Chapter09/Listing09.12.DefiningAnEnum.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12; #region INCLUDE enum ConnectionState diff --git a/src/Chapter09/Listing09.10.DefiningAnEnumType.cs b/src/Chapter09/Listing09.13.DefiningAnEnumType.cs similarity index 95% rename from src/Chapter09/Listing09.10.DefiningAnEnumType.cs rename to src/Chapter09/Listing09.13.DefiningAnEnumType.cs index a1222ea19..11da1bf66 100644 --- a/src/Chapter09/Listing09.10.DefiningAnEnumType.cs +++ b/src/Chapter09/Listing09.13.DefiningAnEnumType.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_10; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_13; #region INCLUDE enum ConnectionState : short diff --git a/src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs b/src/Chapter09/Listing09.14.CastingBetweenArraysOfEnums.cs similarity index 98% rename from src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs rename to src/Chapter09/Listing09.14.CastingBetweenArraysOfEnums.cs index b1321ee58..5af48f0eb 100644 --- a/src/Chapter09/Listing09.11.CastingBetweenArraysOfEnums.cs +++ b/src/Chapter09/Listing09.14.CastingBetweenArraysOfEnums.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_11; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_14; using System; #region INCLUDE diff --git a/src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs b/src/Chapter09/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.cs similarity index 97% rename from src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs rename to src/Chapter09/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.cs index 1d3b6cfe4..32a4d7f9c 100644 --- a/src/Chapter09/Listing09.12.ConvertingAStringToAnEnumUsingEnum.Parse.cs +++ b/src/Chapter09/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15; using System; using System.Diagnostics; diff --git a/src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs b/src/Chapter09/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.cs similarity index 97% rename from src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs rename to src/Chapter09/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.cs index 648910a8c..34a2823cf 100644 --- a/src/Chapter09/Listing09.13.ConvertingAStringToAnEnumUsingEnum.TryParse.cs +++ b/src/Chapter09/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_13; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_16; using System; diff --git a/src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs b/src/Chapter09/Listing09.17.UsingEnumsAsFlags.cs similarity index 98% rename from src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs rename to src/Chapter09/Listing09.17.UsingEnumsAsFlags.cs index 5d731f54f..194d5c265 100644 --- a/src/Chapter09/Listing09.14.UsingEnumsAsFlags.cs +++ b/src/Chapter09/Listing09.17.UsingEnumsAsFlags.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_14; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17; using System; diff --git a/src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs b/src/Chapter09/Listing09.18.UsingBitwiseORandANDWithFlagEnums.cs similarity index 99% rename from src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs rename to src/Chapter09/Listing09.18.UsingBitwiseORandANDWithFlagEnums.cs index b0230f185..c6c32ba26 100644 --- a/src/Chapter09/Listing09.15.UsingBitwiseORandANDWithFlagEnums.cs +++ b/src/Chapter09/Listing09.18.UsingBitwiseORandANDWithFlagEnums.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18; #region INCLUDE using System; diff --git a/src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs b/src/Chapter09/Listing09.19.DefiningEnumValuesforFrequentCombinations.cs similarity index 97% rename from src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs rename to src/Chapter09/Listing09.19.DefiningEnumValuesforFrequentCombinations.cs index d4de8bb8a..abaa7d401 100644 --- a/src/Chapter09/Listing09.16.DefiningEnumValuesforFrequentCombinations.cs +++ b/src/Chapter09/Listing09.19.DefiningEnumValuesforFrequentCombinations.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_16; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_19; using System; #region INCLUDE diff --git a/src/Chapter09/Listing09.17.UsingFlagsAttribute.cs b/src/Chapter09/Listing09.20.UsingFlagsAttribute.cs similarity index 99% rename from src/Chapter09/Listing09.17.UsingFlagsAttribute.cs rename to src/Chapter09/Listing09.20.UsingFlagsAttribute.cs index 498c299f7..c5ad5f947 100644 --- a/src/Chapter09/Listing09.17.UsingFlagsAttribute.cs +++ b/src/Chapter09/Listing09.20.UsingFlagsAttribute.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20; #region INCLUDE //FileAttributes are defined in System.IO diff --git a/src/Chapter09/Original09/Listing.09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs b/src/Chapter09/Original09/Listing.09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs deleted file mode 100644 index 1ac3511f5..000000000 --- a/src/Chapter09/Original09/Listing.09.02.InitializingAStructFieldWithinADeclarationResultingInAnError.cs +++ /dev/null @@ -1,52 +0,0 @@ -//namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_02; - -//// Use keyword struct to declare a value type -//#region INCLUDE -//struct Angle -//{ -// #region EXCLUDE -// public Angle(int degrees, int minutes, int seconds) -// { -// Degrees = degrees; -// Minutes = minutes; -// Seconds = seconds; -// } -// #endregion EXCLUDE -// // ERROR: Fields cannot be initialized at declaration time -// // private int _Degrees = 42; -// #region EXCLUDE -// public int Degrees { get; } - -// public int Minutes { get; } -// public int Seconds { get; } - -// public Angle Move(int degrees, int minutes, int seconds) -// { -// return new Angle( -// Degrees + degrees, -// Minutes + minutes, -// Seconds + seconds); -// } -// #endregion EXCLUDE -//} -//#endregion INCLUDE - -//// Declaring a class as a reference type -//// (declaring it as a struct would create a value type -//// larger than 16 bytes.) -//class Coordinate -//{ -// public Angle Longitude -// { -// get { return _Longitude; } -// set { _Longitude = value; } -// } -// private Angle _Longitude; - -// public Angle Latitude -// { -// get { return _Latitude; } -// set { _Latitude = value; } -// } -// private Angle _Latitude; -//} \ No newline at end of file From 958598c66b080b2c3d3a366815c791a2da436e60 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Tue, 31 Jan 2023 23:04:46 -0800 Subject: [PATCH 08/17] Removed no longer used listings from Chapter 10 --- ...g10.03.OverridingEqualityOperator.Tests.cs | 19 ------ ...ypesNeverReferenceEqualThemselves.Tests.cs | 16 ----- .../Listing10.01.OverridingToString.cs | 26 -------- .../Listing10.02.ImplementingGetHashCode.cs | 30 --------- ...Listing10.03.OverridingEqualityOperator.cs | 63 ------------------- ...ValueTypesNeverReferenceEqualThemselves.cs | 51 --------------- 6 files changed, 205 deletions(-) delete mode 100644 src/Chapter10.Tests/Listing10.03.OverridingEqualityOperator.Tests.cs delete mode 100644 src/Chapter10.Tests/Listing10.04.ValueTypesNeverReferenceEqualThemselves.Tests.cs delete mode 100644 src/Chapter10/Listing10.01.OverridingToString.cs delete mode 100644 src/Chapter10/Listing10.02.ImplementingGetHashCode.cs delete mode 100644 src/Chapter10/Listing10.03.OverridingEqualityOperator.cs delete mode 100644 src/Chapter10/Listing10.04.ValueTypesNeverReferenceEqualThemselves.cs diff --git a/src/Chapter10.Tests/Listing10.03.OverridingEqualityOperator.Tests.cs b/src/Chapter10.Tests/Listing10.03.OverridingEqualityOperator.Tests.cs deleted file mode 100644 index 9691af7e6..000000000 --- a/src/Chapter10.Tests/Listing10.03.OverridingEqualityOperator.Tests.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_03.Tests; - -[TestClass] -public class ProgramTests -{ - [TestMethod] - public void Main_GivenSerialNumbers_EqualityOverrideUsed() - { - const string expected = -@"serialNumber1 reference equals serialNumber2 -serialNumber1 equals serialNumber2 -serialNumber1 equals serialNumber3"; - - IntelliTect.TestTools.Console.ConsoleAssert.Expect( - expected, Program.Main); - } -} diff --git a/src/Chapter10.Tests/Listing10.04.ValueTypesNeverReferenceEqualThemselves.Tests.cs b/src/Chapter10.Tests/Listing10.04.ValueTypesNeverReferenceEqualThemselves.Tests.cs deleted file mode 100644 index 60f36f3e7..000000000 --- a/src/Chapter10.Tests/Listing10.04.ValueTypesNeverReferenceEqualThemselves.Tests.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_04.Tests; - -[TestClass] -public class ProgramTests -{ - [TestMethod] - public void Main_ReferenceEqualsOnValueType_ReferencesNotEqual() - { - const string expected = "coordinate1 does NOT reference equal itself"; - - IntelliTect.TestTools.Console.ConsoleAssert.Expect( - expected, Program.Main); - } -} diff --git a/src/Chapter10/Listing10.01.OverridingToString.cs b/src/Chapter10/Listing10.01.OverridingToString.cs deleted file mode 100644 index 21ebf94c5..000000000 --- a/src/Chapter10/Listing10.01.OverridingToString.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_01 -{ - #region INCLUDE - public struct Coordinate - { - public Coordinate(Longitude longitude, Latitude latitude) - { - Longitude = longitude; - Latitude = latitude; - } - - public Longitude Longitude { get; } - public Latitude Latitude { get; } - - #region HIGHLIGHT - public override string ToString() => - $"{ Longitude } { Latitude }"; - #endregion HIGHLIGHT - - // ... - } - #endregion INCLUDE - - public struct Longitude { } - public struct Latitude { } -} \ No newline at end of file diff --git a/src/Chapter10/Listing10.02.ImplementingGetHashCode.cs b/src/Chapter10/Listing10.02.ImplementingGetHashCode.cs deleted file mode 100644 index 139d6225d..000000000 --- a/src/Chapter10/Listing10.02.ImplementingGetHashCode.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_02 -{ - #region INCLUDE - public struct Coordinate - { - public Coordinate(Longitude longitude, Latitude latitude) - { - Longitude = longitude; - Latitude = latitude; - } - - public Longitude Longitude { get; } - public Latitude Latitude { get; } - - #region HIGHLIGHT - public override int GetHashCode() => - HashCode.Combine( - Longitude.GetHashCode(), Latitude.GetHashCode()); - #endregion HIGHLIGHT - - #region EXCLUDE - public override string ToString() => - $"{ Longitude } { Latitude }"; - #endregion EXCLUDE - } - #endregion INCLUDE - - public struct Longitude { } - public struct Latitude { } -} \ No newline at end of file diff --git a/src/Chapter10/Listing10.03.OverridingEqualityOperator.cs b/src/Chapter10/Listing10.03.OverridingEqualityOperator.cs deleted file mode 100644 index 4cd5479e3..000000000 --- a/src/Chapter10/Listing10.03.OverridingEqualityOperator.cs +++ /dev/null @@ -1,63 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_03 -{ - using AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_06; - #region INCLUDE - // This ProductSerialNumber class is shown and implemented in 10.6 - // public sealed class ProductSerialNumber - // { - // } - - public class Program - { - public static void Main() - { - ProductSerialNumber serialNumber1 = - new ProductSerialNumber("PV", 1000, 09187234); - ProductSerialNumber serialNumber2 = serialNumber1; - ProductSerialNumber serialNumber3 = - new ProductSerialNumber("PV", 1000, 09187234); - - // These serial numbers ARE the same object identity - if(!object.ReferenceEquals(serialNumber1, - serialNumber2)) - { - throw new Exception( - "serialNumber1 does NOT " + - "reference equal serialNumber2"); - } - // And, therefore, they are equal - else if(!serialNumber1.Equals(serialNumber2)) - { - throw new Exception( - "serialNumber1 does NOT equal serialNumber2"); - } - else - { - Console.WriteLine( - "serialNumber1 reference equals serialNumber2"); - Console.WriteLine( - "serialNumber1 equals serialNumber2"); - } - - - // These serial numbers are NOT the same object identity - if(object.ReferenceEquals(serialNumber1, - serialNumber3)) - { - throw new Exception( - "serialNumber1 DOES reference " + - "equal serialNumber3"); - } - // But they are equal (assuming Equals is overloaded) - else if(!serialNumber1.Equals(serialNumber3) || - serialNumber1 != serialNumber3) - { - throw new Exception( - "serialNumber1 does NOT equal serialNumber3"); - } - - Console.WriteLine("serialNumber1 equals serialNumber3"); - } - } - #endregion INCLUDE -} \ No newline at end of file diff --git a/src/Chapter10/Listing10.04.ValueTypesNeverReferenceEqualThemselves.cs b/src/Chapter10/Listing10.04.ValueTypesNeverReferenceEqualThemselves.cs deleted file mode 100644 index 8a169124c..000000000 --- a/src/Chapter10/Listing10.04.ValueTypesNeverReferenceEqualThemselves.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Justification: Listing is incomplete for purposes of elucidation. -#pragma warning disable IDE0060 // Remove unused parameter -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_04 -{ - using System; - #region INCLUDE - public struct Coordinate - { - public Coordinate(Longitude longitude, Latitude latitude) - { - Longitude = longitude; - Latitude = latitude; - } - - public Longitude Longitude { get; } - public Latitude Latitude { get; } - // ... - } - - public class Program - { - public static void Main() - { - //... - - Coordinate coordinate1 = - new Coordinate(new Longitude(48, 52), - new Latitude(-2, -20)); - - // Value types will never be reference equal. - if(Coordinate.ReferenceEquals(coordinate1, - coordinate1)) - { - throw new Exception( - "coordinate1 reference equals coordinate1"); - } - - Console.WriteLine( - "coordinate1 does NOT reference equal itself"); - } - } - #endregion INCLUDE - public struct Longitude - { - public Longitude(int x, int y) { } - } - public struct Latitude - { - public Latitude(int x, int y) { } - } -} \ No newline at end of file From 35f1d53da0002feb65325f6b38ad18c9a9d2f6ae Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Tue, 31 Jan 2023 23:25:32 -0800 Subject: [PATCH 09/17] Renumbered Chapter 10 --- ...mplementingTheEqualsAndNotEqualsOperators.Tests.cs} | 2 +- ...Tests.cs => Listing10.02.AddingAnOperator.Tests.cs} | 2 +- ....03.CallingTheMinusAndPlusBinaryOperators.Tests.cs} | 2 +- ....OverloadingTheMinusAndPlusUnaryOperators.Tests.cs} | 2 +- ...mplicitConversionBetweenLatitudeAndDouble.Tests.cs} | 2 +- ... Listing10.07.LeveragingADifferentLibrary.Tests.cs} | 6 +++--- ...sting10.08.MakingTypesAvailableExternally.Tests.cs} | 6 +++--- ...sts.cs => Listing10.14.DefiningAFinalizer.Tests.cs} | 6 +++--- ...sting10.15.ResourceCleanupWithIDisposable.Tests.cs} | 6 +++--- ...0.17.RegisteringAFinalizerWithProcessExit.Tests.cs} | 6 +++--- ...0.01.ImplementingTheEqualsAndNotEqualsOperators.cs} | 2 +- ...gAnOperator.cs => Listing10.02.AddingAnOperator.cs} | 4 ++-- ...ting10.03.CallingTheMinusAndPlusBinaryOperators.cs} | 6 +++--- ...g10.04.OverloadingTheMinusAndPlusUnaryOperators.cs} | 4 ++-- ...rators.cs => Listing10.05.TrueAndFalseOperators.cs} | 4 ++-- ...ingAnImplicitConversionBetweenLatitudeAndDouble.cs} | 4 ++-- ....cs => Listing10.07.LeveragingADifferentLibrary.cs} | 4 ++-- ... => Listing10.08.MakingTypesAvailableExternally.cs} | 4 ++-- ...=> Listing10.08.MakingTypesAvailableExternally.ps1} | 0 ...Namespace.cs => Listing10.09.DefiningANamespace.cs} | 4 ++-- ...dNamespaces.cs => Listing10.10.NestedNamespaces.cs} | 2 +- ....cs => Listing10.11.NestingNamespacesWithPeriod.cs} | 4 ++-- ...ingWithXML.cs => Listing10.12.CommentingWithXML.cs} | 6 +++--- ...eakReferences.cs => Listing10.13.WeakReferences.cs} | 4 ++-- ...Finalizer.cs => Listing10.14.DefiningAFinalizer.cs} | 6 +++--- ... => Listing10.15.ResourceCleanupWithIDisposable.cs} | 4 ++-- ...nt.cs => Listing10.16.InvokingTheUsingStatement.cs} | 8 ++++---- ...sting10.17.RegisteringAFinalizerWithProcessExit.cs} | 4 ++-- ...ting10.17.RegisteringAFinalizerWithProcessExit.ps1} | 0 ...roperty.cs => Listing10.18.LazyLoadingAProperty.cs} | 10 +++++----- ...System.Lazy.cs => Listing10.19.UsingSystem.Lazy.cs} | 10 +++++----- 31 files changed, 67 insertions(+), 67 deletions(-) rename src/Chapter10.Tests/{Listing10.06.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs => Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs} (99%) rename src/Chapter10.Tests/{Listing10.07.AddingAnOperator.Tests.cs => Listing10.02.AddingAnOperator.Tests.cs} (99%) rename src/Chapter10.Tests/{Listing10.08.CallingTheMinusAndPlusBinaryOperators.Tests.cs => Listing10.03.CallingTheMinusAndPlusBinaryOperators.Tests.cs} (96%) rename src/Chapter10.Tests/{Listing10.09.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs => Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs} (99%) rename src/Chapter10.Tests/{Listing10.11.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs => Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs} (97%) rename src/Chapter10.Tests/{Listing10.12.Tests.cs => Listing10.07.LeveragingADifferentLibrary.Tests.cs} (95%) rename src/Chapter10.Tests/{Listing10.13.MakingTypesAvailableOutsideAnAssembly.Tests.cs => Listing10.08.MakingTypesAvailableExternally.Tests.cs} (82%) rename src/Chapter10.Tests/{Listing10.20.Tests.cs => Listing10.14.DefiningAFinalizer.Tests.cs} (97%) rename src/Chapter10.Tests/{Listing10.21.Tests.cs => Listing10.15.ResourceCleanupWithIDisposable.Tests.cs} (80%) rename src/Chapter10.Tests/{Listing10.23.RegisteringAFinalizerWithProcessExit.Tests.cs => Listing10.17.RegisteringAFinalizerWithProcessExit.Tests.cs} (96%) rename src/Chapter10/{Listing10.06.ImplementingTheEqualsAndNotEqualsOperators.cs => Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.cs} (97%) rename src/Chapter10/{Listing10.07.AddingAnOperator.cs => Listing10.02.AddingAnOperator.cs} (98%) rename src/Chapter10/{Listing10.08.CallingTheMinusAndPlusBinaryOperators.cs => Listing10.03.CallingTheMinusAndPlusBinaryOperators.cs} (86%) rename src/Chapter10/{Listing10.09.OverloadingTheMinusAndPlusUnaryOperators.cs => Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.cs} (99%) rename src/Chapter10/{Listing10.10.TrueAndFalseOperators.cs => Listing10.05.TrueAndFalseOperators.cs} (84%) rename src/Chapter10/{Listing10.11.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs => Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs} (90%) rename src/Chapter10/{Listing10.12.LeveragingADifferentLibrary.cs => Listing10.07.LeveragingADifferentLibrary.cs} (89%) rename src/Chapter10/{Listing10.13.MakingTypesAvailableExternally.cs => Listing10.08.MakingTypesAvailableExternally.cs} (77%) rename src/Chapter10/{Listing10.13.MakingTypesAvailableExternally.ps1 => Listing10.08.MakingTypesAvailableExternally.ps1} (100%) rename src/Chapter10/{Listing10.14.DefiningANamespace.cs => Listing10.09.DefiningANamespace.cs} (81%) rename src/Chapter10/{Listing10.15.NestedNamespaces.cs => Listing10.10.NestedNamespaces.cs} (98%) rename src/Chapter10/{Listing10.16.NestingNamespacesWithPeriod.cs => Listing10.11.NestingNamespacesWithPeriod.cs} (83%) rename src/Chapter10/{Listing10.17.CommentingWithXML.cs => Listing10.12.CommentingWithXML.cs} (98%) rename src/Chapter10/{Listing10.19.WeakReferences.cs => Listing10.13.WeakReferences.cs} (97%) rename src/Chapter10/{Listing10.20.DefiningAFinalizer.cs => Listing10.14.DefiningAFinalizer.cs} (94%) rename src/Chapter10/{Listing10.21.ResourceCleanupWithIDisposable.cs => Listing10.15.ResourceCleanupWithIDisposable.cs} (96%) rename src/Chapter10/{Listing10.22.InvokingTheUsingStatement.cs => Listing10.16.InvokingTheUsingStatement.cs} (84%) rename src/Chapter10/{Listing10.23.RegisteringAFinalizerWithProcessExit.cs => Listing10.17.RegisteringAFinalizerWithProcessExit.cs} (99%) rename src/Chapter10/{Listing10.23.RegisteringAFinalizerWithProcessExit.ps1 => Listing10.17.RegisteringAFinalizerWithProcessExit.ps1} (100%) rename src/Chapter10/{Listing10.24.LazyLoadingAProperty.cs => Listing10.18.LazyLoadingAProperty.cs} (77%) rename src/Chapter10/{Listing10.25.UsingSystem.Lazy.cs => Listing10.19.UsingSystem.Lazy.cs} (78%) diff --git a/src/Chapter10.Tests/Listing10.06.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs b/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs similarity index 99% rename from src/Chapter10.Tests/Listing10.06.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs rename to src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs index 7a3e219a1..1dd9ed43a 100644 --- a/src/Chapter10.Tests/Listing10.06.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs +++ b/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs @@ -1,6 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_06.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_01.Tests; [TestClass] public class ProductSerialNumberTests diff --git a/src/Chapter10.Tests/Listing10.07.AddingAnOperator.Tests.cs b/src/Chapter10.Tests/Listing10.02.AddingAnOperator.Tests.cs similarity index 99% rename from src/Chapter10.Tests/Listing10.07.AddingAnOperator.Tests.cs rename to src/Chapter10.Tests/Listing10.02.AddingAnOperator.Tests.cs index cd2f24009..c3f0a4c55 100644 --- a/src/Chapter10.Tests/Listing10.07.AddingAnOperator.Tests.cs +++ b/src/Chapter10.Tests/Listing10.02.AddingAnOperator.Tests.cs @@ -1,6 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_07.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_02.Tests; [TestClass] public class CoordinateTests diff --git a/src/Chapter10.Tests/Listing10.08.CallingTheMinusAndPlusBinaryOperators.Tests.cs b/src/Chapter10.Tests/Listing10.03.CallingTheMinusAndPlusBinaryOperators.Tests.cs similarity index 96% rename from src/Chapter10.Tests/Listing10.08.CallingTheMinusAndPlusBinaryOperators.Tests.cs rename to src/Chapter10.Tests/Listing10.03.CallingTheMinusAndPlusBinaryOperators.Tests.cs index aabe54702..f92434e52 100644 --- a/src/Chapter10.Tests/Listing10.08.CallingTheMinusAndPlusBinaryOperators.Tests.cs +++ b/src/Chapter10.Tests/Listing10.03.CallingTheMinusAndPlusBinaryOperators.Tests.cs @@ -1,6 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_08.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_03.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter10.Tests/Listing10.09.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs b/src/Chapter10.Tests/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs similarity index 99% rename from src/Chapter10.Tests/Listing10.09.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs rename to src/Chapter10.Tests/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs index f4ac70505..1d8ea2535 100644 --- a/src/Chapter10.Tests/Listing10.09.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs +++ b/src/Chapter10.Tests/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs @@ -1,6 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_09.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_04.Tests; [TestClass] public class ArcTests diff --git a/src/Chapter10.Tests/Listing10.11.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs b/src/Chapter10.Tests/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs similarity index 97% rename from src/Chapter10.Tests/Listing10.11.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs rename to src/Chapter10.Tests/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs index 64aedee01..ea29b2aba 100644 --- a/src/Chapter10.Tests/Listing10.11.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs +++ b/src/Chapter10.Tests/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs @@ -1,6 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_11.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_06.Tests; [TestClass] public class LatitudeTests diff --git a/src/Chapter10.Tests/Listing10.12.Tests.cs b/src/Chapter10.Tests/Listing10.07.LeveragingADifferentLibrary.Tests.cs similarity index 95% rename from src/Chapter10.Tests/Listing10.12.Tests.cs rename to src/Chapter10.Tests/Listing10.07.LeveragingADifferentLibrary.Tests.cs index 2fd6a0fc3..77fa770a1 100644 --- a/src/Chapter10.Tests/Listing10.12.Tests.cs +++ b/src/Chapter10.Tests/Listing10.07.LeveragingADifferentLibrary.Tests.cs @@ -1,7 +1,7 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Text.RegularExpressions; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_12.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_07.Tests; [TestClass] public class TextNumberParserTests @@ -55,4 +55,4 @@ private static string RemoveVT100(string removeFrom) { return Regex.Replace(removeFrom, "\u001b\\[\\d{1,3}m", ""); } -} \ No newline at end of file +} diff --git a/src/Chapter10.Tests/Listing10.13.MakingTypesAvailableOutsideAnAssembly.Tests.cs b/src/Chapter10.Tests/Listing10.08.MakingTypesAvailableExternally.Tests.cs similarity index 82% rename from src/Chapter10.Tests/Listing10.13.MakingTypesAvailableOutsideAnAssembly.Tests.cs rename to src/Chapter10.Tests/Listing10.08.MakingTypesAvailableExternally.Tests.cs index 1f97fba15..d551b923e 100644 --- a/src/Chapter10.Tests/Listing10.13.MakingTypesAvailableOutsideAnAssembly.Tests.cs +++ b/src/Chapter10.Tests/Listing10.08.MakingTypesAvailableExternally.Tests.cs @@ -1,7 +1,7 @@ -using AddisonWesley.Michaelis.EssentialCSharp.Shared.Tests; +using AddisonWesley.Michaelis.EssentialCSharp.Shared.Tests; using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_13.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_08.Tests; [TestClass] public class TypeTests @@ -12,7 +12,7 @@ public void MakingTypesAvailableExternallyPS1_ExitCodeIs0() { if (PowerShellTestUtilities.PowerShellNotInstalled) Assert.Inconclusive("Powershell not installed"); //EssentialCSharp\\src\\Chapter10.Tests\\bin\\Debug\\netcoreapp3.0 - string ps1Path = Path.GetFullPath("../../../../Chapter10/Listing10.13.MakingTypesAvailableExternally.ps1", Environment.CurrentDirectory); + string ps1Path = Path.GetFullPath("../../../../Chapter10/Listing10.08.MakingTypesAvailableExternally.ps1", Environment.CurrentDirectory); string traceValue = "0"; int exitCode = PowerShellTestUtilities.RunPowerShellScript(ps1Path, traceValue); diff --git a/src/Chapter10.Tests/Listing10.20.Tests.cs b/src/Chapter10.Tests/Listing10.14.DefiningAFinalizer.Tests.cs similarity index 97% rename from src/Chapter10.Tests/Listing10.20.Tests.cs rename to src/Chapter10.Tests/Listing10.14.DefiningAFinalizer.Tests.cs index b0715577d..8749e4c13 100644 --- a/src/Chapter10.Tests/Listing10.20.Tests.cs +++ b/src/Chapter10.Tests/Listing10.14.DefiningAFinalizer.Tests.cs @@ -1,7 +1,7 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Runtime.InteropServices; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_20.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_14.Tests; [TestClass] public class TemporaryFileStreamTests @@ -93,4 +93,4 @@ static bool IsFileLocked(FileInfo file) } } } -} \ No newline at end of file +} diff --git a/src/Chapter10.Tests/Listing10.21.Tests.cs b/src/Chapter10.Tests/Listing10.15.ResourceCleanupWithIDisposable.Tests.cs similarity index 80% rename from src/Chapter10.Tests/Listing10.21.Tests.cs rename to src/Chapter10.Tests/Listing10.15.ResourceCleanupWithIDisposable.Tests.cs index 78dfedab5..708db3330 100644 --- a/src/Chapter10.Tests/Listing10.21.Tests.cs +++ b/src/Chapter10.Tests/Listing10.15.ResourceCleanupWithIDisposable.Tests.cs @@ -1,6 +1,6 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_21.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_15.Tests; [TestClass] public class SearchTests @@ -13,4 +13,4 @@ public void MainTest() IntelliTect.TestTools.Console.ConsoleAssert.Expect( expected, Program.Search); } -} \ No newline at end of file +} diff --git a/src/Chapter10.Tests/Listing10.23.RegisteringAFinalizerWithProcessExit.Tests.cs b/src/Chapter10.Tests/Listing10.17.RegisteringAFinalizerWithProcessExit.Tests.cs similarity index 96% rename from src/Chapter10.Tests/Listing10.23.RegisteringAFinalizerWithProcessExit.Tests.cs rename to src/Chapter10.Tests/Listing10.17.RegisteringAFinalizerWithProcessExit.Tests.cs index 973c98371..8d45f66ec 100644 --- a/src/Chapter10.Tests/Listing10.23.RegisteringAFinalizerWithProcessExit.Tests.cs +++ b/src/Chapter10.Tests/Listing10.17.RegisteringAFinalizerWithProcessExit.Tests.cs @@ -3,7 +3,7 @@ using System.Text.RegularExpressions; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_23.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_17.Tests; [TestClass] public class DisposeTests @@ -15,14 +15,14 @@ public class DisposeTests Path.Join(IntelliTect.Multitool.RepositoryPaths.GetDefaultRepoRoot(),"src", "Chapter10")); static string Ps1Path { get; } = - Path.GetFullPath(Path.Join(Ps1DirectoryPath, "Listing10.23.RegisteringAFinalizerWithProcessExit.ps1"), Environment.CurrentDirectory); + Path.GetFullPath(Path.Join(Ps1DirectoryPath, "Listing10.17.RegisteringAFinalizerWithProcessExit.ps1"), Environment.CurrentDirectory); private const string ProjectName = "ProcessExitTestProgram.testing"; [ClassInitialize] public static void ClassInitialize(TestContext testContext) { - // Clean up at the start incase the class cleanup doesn't run (due to debug for example) + // Clean up at the start in case the class cleanup doesn't run (due to debug for example) Assert.AreEqual(0, RunPowerShellScript("cleanup", out string _)); string testStage = "create"; Assert.AreEqual(0, RunPowerShellScript(testStage, out string psOutput), diff --git a/src/Chapter10/Listing10.06.ImplementingTheEqualsAndNotEqualsOperators.cs b/src/Chapter10/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.cs similarity index 97% rename from src/Chapter10/Listing10.06.ImplementingTheEqualsAndNotEqualsOperators.cs rename to src/Chapter10/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.cs index 82e80bf26..5df0b144e 100644 --- a/src/Chapter10/Listing10.06.ImplementingTheEqualsAndNotEqualsOperators.cs +++ b/src/Chapter10/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_06 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_01 { #region INCLUDE public sealed class ProductSerialNumber diff --git a/src/Chapter10/Listing10.07.AddingAnOperator.cs b/src/Chapter10/Listing10.02.AddingAnOperator.cs similarity index 98% rename from src/Chapter10/Listing10.07.AddingAnOperator.cs rename to src/Chapter10/Listing10.02.AddingAnOperator.cs index 8b746ae85..a04d49f9f 100644 --- a/src/Chapter10/Listing10.07.AddingAnOperator.cs +++ b/src/Chapter10/Listing10.02.AddingAnOperator.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_07 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_02 { #region INCLUDE public struct Arc @@ -195,4 +195,4 @@ public Latitude(Latitude Latitude) return new Latitude(leftHandSide.Degrees - rightHandSide.Degrees, leftHandSide.Minutes - rightHandSide.Minutes); } } -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.08.CallingTheMinusAndPlusBinaryOperators.cs b/src/Chapter10/Listing10.03.CallingTheMinusAndPlusBinaryOperators.cs similarity index 86% rename from src/Chapter10/Listing10.08.CallingTheMinusAndPlusBinaryOperators.cs rename to src/Chapter10/Listing10.03.CallingTheMinusAndPlusBinaryOperators.cs index 5251d5b39..4ace7b47e 100644 --- a/src/Chapter10/Listing10.08.CallingTheMinusAndPlusBinaryOperators.cs +++ b/src/Chapter10/Listing10.03.CallingTheMinusAndPlusBinaryOperators.cs @@ -1,7 +1,7 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_08 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_03 { using System; - using Listing10_07; + using Listing10_02; #region INCLUDE public class Program { @@ -23,4 +23,4 @@ public static void Main() } } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.09.OverloadingTheMinusAndPlusUnaryOperators.cs b/src/Chapter10/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.cs similarity index 99% rename from src/Chapter10/Listing10.09.OverloadingTheMinusAndPlusUnaryOperators.cs rename to src/Chapter10/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.cs index 5456569be..4937f5d71 100644 --- a/src/Chapter10/Listing10.09.OverloadingTheMinusAndPlusUnaryOperators.cs +++ b/src/Chapter10/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_09 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_04 { public struct Coordinate { @@ -278,4 +278,4 @@ public Latitude LatitudeDifference } } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.10.TrueAndFalseOperators.cs b/src/Chapter10/Listing10.05.TrueAndFalseOperators.cs similarity index 84% rename from src/Chapter10/Listing10.10.TrueAndFalseOperators.cs rename to src/Chapter10/Listing10.05.TrueAndFalseOperators.cs index 0d21509b9..f2d99670b 100644 --- a/src/Chapter10/Listing10.10.TrueAndFalseOperators.cs +++ b/src/Chapter10/Listing10.05.TrueAndFalseOperators.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_10 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_05 { public struct Example { @@ -19,4 +19,4 @@ public static bool operator true(object item) #endregion INCLUDE */ } -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.11.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs b/src/Chapter10/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs similarity index 90% rename from src/Chapter10/Listing10.11.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs rename to src/Chapter10/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs index 6d6ac19e4..642cc7023 100644 --- a/src/Chapter10/Listing10.11.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs +++ b/src/Chapter10/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_11 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_06 { #region INCLUDE public struct Latitude @@ -32,4 +32,4 @@ private static double Normalize(double decimalDegrees) #endregion EXCLUDE } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.12.LeveragingADifferentLibrary.cs b/src/Chapter10/Listing10.07.LeveragingADifferentLibrary.cs similarity index 89% rename from src/Chapter10/Listing10.12.LeveragingADifferentLibrary.cs rename to src/Chapter10/Listing10.07.LeveragingADifferentLibrary.cs index 45901d9f5..839c1d99d 100644 --- a/src/Chapter10/Listing10.12.LeveragingADifferentLibrary.cs +++ b/src/Chapter10/Listing10.07.LeveragingADifferentLibrary.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_12 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_07 { using Microsoft.Extensions.Logging; @@ -22,4 +22,4 @@ public static void Main(string[] args) } } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.13.MakingTypesAvailableExternally.cs b/src/Chapter10/Listing10.08.MakingTypesAvailableExternally.cs similarity index 77% rename from src/Chapter10/Listing10.13.MakingTypesAvailableExternally.cs rename to src/Chapter10/Listing10.08.MakingTypesAvailableExternally.cs index fefda2a44..7359568dc 100644 --- a/src/Chapter10/Listing10.13.MakingTypesAvailableExternally.cs +++ b/src/Chapter10/Listing10.08.MakingTypesAvailableExternally.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_13 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_08 { #region INCLUDE public struct Coordinate @@ -21,4 +21,4 @@ public struct Arc // ... } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.13.MakingTypesAvailableExternally.ps1 b/src/Chapter10/Listing10.08.MakingTypesAvailableExternally.ps1 similarity index 100% rename from src/Chapter10/Listing10.13.MakingTypesAvailableExternally.ps1 rename to src/Chapter10/Listing10.08.MakingTypesAvailableExternally.ps1 diff --git a/src/Chapter10/Listing10.14.DefiningANamespace.cs b/src/Chapter10/Listing10.09.DefiningANamespace.cs similarity index 81% rename from src/Chapter10/Listing10.14.DefiningANamespace.cs rename to src/Chapter10/Listing10.09.DefiningANamespace.cs index 6ab3cc29e..14e354a28 100644 --- a/src/Chapter10/Listing10.14.DefiningANamespace.cs +++ b/src/Chapter10/Listing10.09.DefiningANamespace.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_14 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_09 { #region INCLUDE // Define the namespace AddisonWesley @@ -15,4 +15,4 @@ class Program #endregion HIGHLIGHT // End of AddisonWesley namespace declaration #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.15.NestedNamespaces.cs b/src/Chapter10/Listing10.10.NestedNamespaces.cs similarity index 98% rename from src/Chapter10/Listing10.15.NestedNamespaces.cs rename to src/Chapter10/Listing10.10.NestedNamespaces.cs index ff46cabdd..ded756a70 100644 --- a/src/Chapter10/Listing10.15.NestedNamespaces.cs +++ b/src/Chapter10/Listing10.10.NestedNamespaces.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_15 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_10 { #region INCLUDE // Define the namespace AddisonWesley diff --git a/src/Chapter10/Listing10.16.NestingNamespacesWithPeriod.cs b/src/Chapter10/Listing10.11.NestingNamespacesWithPeriod.cs similarity index 83% rename from src/Chapter10/Listing10.16.NestingNamespacesWithPeriod.cs rename to src/Chapter10/Listing10.11.NestingNamespacesWithPeriod.cs index 0939f8a3b..098336aa2 100644 --- a/src/Chapter10/Listing10.16.NestingNamespacesWithPeriod.cs +++ b/src/Chapter10/Listing10.11.NestingNamespacesWithPeriod.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_16 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_11 { #region INCLUDE // Define the namespace AddisonWesley.Michaelis.EssentialCSharp @@ -15,4 +15,4 @@ class Program #endregion HIGHLIGHT // End of AddisonWesley namespace declaration #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.17.CommentingWithXML.cs b/src/Chapter10/Listing10.12.CommentingWithXML.cs similarity index 98% rename from src/Chapter10/Listing10.17.CommentingWithXML.cs rename to src/Chapter10/Listing10.12.CommentingWithXML.cs index d8417c58a..babb86cdd 100644 --- a/src/Chapter10/Listing10.17.CommentingWithXML.cs +++ b/src/Chapter10/Listing10.12.CommentingWithXML.cs @@ -1,6 +1,6 @@ -using Chapter10; +using Chapter10; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_17 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_12 { #region INCLUDE /// @@ -55,4 +55,4 @@ class Program // ... } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.19.WeakReferences.cs b/src/Chapter10/Listing10.13.WeakReferences.cs similarity index 97% rename from src/Chapter10/Listing10.19.WeakReferences.cs rename to src/Chapter10/Listing10.13.WeakReferences.cs index dca3ba63b..272f7959b 100644 --- a/src/Chapter10/Listing10.19.WeakReferences.cs +++ b/src/Chapter10/Listing10.13.WeakReferences.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_19 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_13 { using System; @@ -107,4 +107,4 @@ public byte[] GetData() } } -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.20.DefiningAFinalizer.cs b/src/Chapter10/Listing10.14.DefiningAFinalizer.cs similarity index 94% rename from src/Chapter10/Listing10.20.DefiningAFinalizer.cs rename to src/Chapter10/Listing10.14.DefiningAFinalizer.cs index 8dbc060ce..836eb4012 100644 --- a/src/Chapter10/Listing10.20.DefiningAFinalizer.cs +++ b/src/Chapter10/Listing10.14.DefiningAFinalizer.cs @@ -1,6 +1,6 @@ -// Justification: Implementation is incomplete in the catch block. +// Justification: Implementation is incomplete in the catch block. #pragma warning disable CS0168 // Variable is declared but never used -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_20 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_14 { using System; #region INCLUDE @@ -56,4 +56,4 @@ public void Close() } } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.21.ResourceCleanupWithIDisposable.cs b/src/Chapter10/Listing10.15.ResourceCleanupWithIDisposable.cs similarity index 96% rename from src/Chapter10/Listing10.21.ResourceCleanupWithIDisposable.cs rename to src/Chapter10/Listing10.15.ResourceCleanupWithIDisposable.cs index 4789777cd..2ce7be577 100644 --- a/src/Chapter10/Listing10.21.ResourceCleanupWithIDisposable.cs +++ b/src/Chapter10/Listing10.15.ResourceCleanupWithIDisposable.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_21 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_15 { #region INCLUDE using System; @@ -87,4 +87,4 @@ public void Dispose(bool disposing) } } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.22.InvokingTheUsingStatement.cs b/src/Chapter10/Listing10.16.InvokingTheUsingStatement.cs similarity index 84% rename from src/Chapter10/Listing10.22.InvokingTheUsingStatement.cs rename to src/Chapter10/Listing10.16.InvokingTheUsingStatement.cs index 12509c4a0..119100b6c 100644 --- a/src/Chapter10/Listing10.22.InvokingTheUsingStatement.cs +++ b/src/Chapter10/Listing10.16.InvokingTheUsingStatement.cs @@ -1,9 +1,9 @@ -// Justification: Use to demonstrate pre-C# 8.0 syntax. +// Justification: Use to demonstrate pre-C# 8.0 syntax. #pragma warning disable IDE0063 // Use simple 'using' statement -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_22 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_16 { - using AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_21; + using Listing10_15; #region INCLUDE public static class Program @@ -28,4 +28,4 @@ public static void Search() } } #endregion INCLUDE -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.23.RegisteringAFinalizerWithProcessExit.cs b/src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.cs similarity index 99% rename from src/Chapter10/Listing10.23.RegisteringAFinalizerWithProcessExit.cs rename to src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.cs index dc03dad78..47b7a98c9 100644 --- a/src/Chapter10/Listing10.23.RegisteringAFinalizerWithProcessExit.cs +++ b/src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_23 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_17 { using System; #region INCLUDE @@ -132,4 +132,4 @@ public static class ConsoleLogger public static void WriteLine(string? message = null, [CallerMemberName] string? name = null) => Console.WriteLine($"{$"{name}: " }{ message ?? ": Executing" }"); } -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.23.RegisteringAFinalizerWithProcessExit.ps1 b/src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.ps1 similarity index 100% rename from src/Chapter10/Listing10.23.RegisteringAFinalizerWithProcessExit.ps1 rename to src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.ps1 diff --git a/src/Chapter10/Listing10.24.LazyLoadingAProperty.cs b/src/Chapter10/Listing10.18.LazyLoadingAProperty.cs similarity index 77% rename from src/Chapter10/Listing10.24.LazyLoadingAProperty.cs rename to src/Chapter10/Listing10.18.LazyLoadingAProperty.cs index 7581cd7d4..aaf4d1c97 100644 --- a/src/Chapter10/Listing10.24.LazyLoadingAProperty.cs +++ b/src/Chapter10/Listing10.18.LazyLoadingAProperty.cs @@ -1,6 +1,6 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_24 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_18 { - using AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_21; + using Listing10_15; #region INCLUDE class DataCache { @@ -19,9 +19,9 @@ private TemporaryFileStream? InternalFileStream #endregion INCLUDE } -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_23_PreCSharp6 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_18_PRECSHARP6 { - using AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_21; + using Listing10_15; class DataCache { @@ -42,4 +42,4 @@ public TemporaryFileStream FileStream // ... } -} \ No newline at end of file +} diff --git a/src/Chapter10/Listing10.25.UsingSystem.Lazy.cs b/src/Chapter10/Listing10.19.UsingSystem.Lazy.cs similarity index 78% rename from src/Chapter10/Listing10.25.UsingSystem.Lazy.cs rename to src/Chapter10/Listing10.19.UsingSystem.Lazy.cs index fa91a5bc9..8cf8bb916 100644 --- a/src/Chapter10/Listing10.25.UsingSystem.Lazy.cs +++ b/src/Chapter10/Listing10.19.UsingSystem.Lazy.cs @@ -1,6 +1,6 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_25 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_19 { - using AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_21; + using Listing10_15; using System; #region INCLUDE class DataCache @@ -18,9 +18,9 @@ class DataCache #endregion INCLUDE } -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_24_PreCSharp6 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_19_Listing10_18_PRECSHARP6 { - using AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_21; + using Listing10_15; using System; class DataCache @@ -44,4 +44,4 @@ public TemporaryFileStream FileStream // ... } -} \ No newline at end of file +} From 6fa87be90e811da2d86eb1c113cdc1d57dbf47ce Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Wed, 1 Feb 2023 00:00:18 -0800 Subject: [PATCH 10/17] Chapter 10 renumbering --- ...ingTheEqualsAndNotEqualsOperators.Tests.cs | 14 +-- .../Listing10.02.AddingAnOperator.Tests.cs | 24 ++--- ...dingTheMinusAndPlusUnaryOperators.Tests.cs | 28 +++--- ...onversionBetweenLatitudeAndDouble.Tests.cs | 2 +- ...10.07.LeveragingADifferentLibrary.Tests.cs | 4 +- ...08.MakingTypesAvailableExternally.Tests.cs | 2 +- .../Listing10.14.DefiningAFinalizer.Tests.cs | 2 +- ...isteringAFinalizerWithProcessExit.Tests.cs | 5 +- .../Listing10.02.AddingAnOperator.cs | 12 +-- ...3.CallingTheMinusAndPlusBinaryOperators.cs | 4 +- ...verloadingTheMinusAndPlusUnaryOperators.cs | 8 +- ...licitConversionBetweenLatitudeAndDouble.cs | 2 +- .../Listing10.12.CommentingWithXML.cs | 95 ++++++++++--------- src/Chapter10/Listing10.13.WeakReferences.cs | 2 +- .../Listing10.14.DefiningAFinalizer.cs | 88 +++++++++-------- ...ing10.15.ResourceCleanupWithIDisposable.cs | 2 +- .../Listing10.16.InvokingTheUsingStatement.cs | 6 +- ...17.RegisteringAFinalizerWithProcessExit.cs | 2 +- .../Listing10.18.LazyLoadingAProperty.cs | 9 +- .../Listing10.19.UsingSystem.Lazy.cs | 2 +- src/Shared/Tests/PowerShellTestUtilities.cs | 2 +- 21 files changed, 156 insertions(+), 159 deletions(-) diff --git a/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs b/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs index 1dd9ed43a..6d1c0e119 100644 --- a/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs +++ b/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs @@ -8,8 +8,8 @@ public class ProductSerialNumberTests [TestMethod] public void Equals_GivenEqualObjects_Equal() { - ProductSerialNumber productSerialNumber1 = new ProductSerialNumber("12", 11, 11001); - ProductSerialNumber productSerialNumber2 = new ProductSerialNumber("12", 11, 11001); + ProductSerialNumber productSerialNumber1 = new("12", 11, 11001); + ProductSerialNumber productSerialNumber2 = new("12", 11, 11001); Assert.IsTrue(productSerialNumber1.Equals(productSerialNumber2)); } @@ -21,8 +21,8 @@ public void Equals_GivenEqualObjects_Equal() public void NotEquals_GivenDifferentObjects_NotEqual(string productSeries1, int model1, int id1, string productSeries2 ,int model2, long id2) { - ProductSerialNumber productSerialNumber1 = new ProductSerialNumber(productSeries1, model1, id1); - ProductSerialNumber productSerialNumber2 = new ProductSerialNumber(productSeries2, model2, id2); + ProductSerialNumber productSerialNumber1 = new(productSeries1, model1, id1); + ProductSerialNumber productSerialNumber2 = new(productSeries2, model2, id2); Assert.IsTrue(productSerialNumber1 != productSerialNumber2); } @@ -30,7 +30,7 @@ public void NotEquals_GivenDifferentObjects_NotEqual(string productSeries1, int [TestMethod] public void Equals_GivenNull_NotEqual() { - ProductSerialNumber productSerialNumber1 = new ProductSerialNumber("12", 11, 11001); + ProductSerialNumber productSerialNumber1 = new("12", 11, 11001); ProductSerialNumber? productSerialNumber2 = null; @@ -40,7 +40,7 @@ public void Equals_GivenNull_NotEqual() [TestMethod] public void Equals_GivenSameReference_Equal() { - ProductSerialNumber productSerialNumber1 = new ProductSerialNumber("12", 11, 11001); + ProductSerialNumber productSerialNumber1 = new("12", 11, 11001); ProductSerialNumber productSerialNumber2 = productSerialNumber1; Assert.IsTrue(productSerialNumber1 == productSerialNumber2); @@ -49,7 +49,7 @@ public void Equals_GivenSameReference_Equal() [TestMethod] public void Equals_GivenDifferentTypes_NotEqual() { - ProductSerialNumber productSerialNumber1 = new ProductSerialNumber("12", 11, 11001); + ProductSerialNumber productSerialNumber1 = new("12", 11, 11001); int otherObj = 12; Assert.IsFalse(productSerialNumber1.Equals(otherObj)); diff --git a/src/Chapter10.Tests/Listing10.02.AddingAnOperator.Tests.cs b/src/Chapter10.Tests/Listing10.02.AddingAnOperator.Tests.cs index c3f0a4c55..d3b535dd9 100644 --- a/src/Chapter10.Tests/Listing10.02.AddingAnOperator.Tests.cs +++ b/src/Chapter10.Tests/Listing10.02.AddingAnOperator.Tests.cs @@ -8,9 +8,9 @@ public class CoordinateTests [TestMethod] public void CoordinateEquals_GivenEqualObjects_AreEqual() { - Coordinate coordinate1 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate1 = new(new Longitude(48, 52), new Latitude(-2, -20)); - Coordinate coordinate2 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate2 = new(new Longitude(48, 52), new Latitude(-2, -20)); Assert.IsTrue(coordinate1.Equals(coordinate2)); @@ -24,9 +24,9 @@ public void CoordinateEquals_GivenEqualObjects_AreEqual() public void CoordinateNotEquals_GivenDifferentObjects_NotEqual(int longDegrees1, int longMinutes1, int latDegrees1, int latMinutes1, int longDegrees2, int longMinutes2, int latDegrees2, int latMinutes2) { - Coordinate coordinate1 = new Coordinate(new Longitude(longDegrees1, longMinutes1), + Coordinate coordinate1 = new(new Longitude(longDegrees1, longMinutes1), new Latitude(latDegrees1, latMinutes1)); - Coordinate coordinate2 = new Coordinate(new Longitude(longDegrees2, longMinutes2), + Coordinate coordinate2 = new(new Longitude(longDegrees2, longMinutes2), new Latitude(latDegrees2, latMinutes2)); Assert.IsTrue(coordinate1 != coordinate2); @@ -35,7 +35,7 @@ public void CoordinateNotEquals_GivenDifferentObjects_NotEqual(int longDegrees1, [TestMethod] public void CoordinateEquals_GivenNull_NotEqual() { - Coordinate coordinate1 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate1 = new(new Longitude(48, 52), new Latitude(-2, -20)); Coordinate? coordinate2 = null; @@ -45,7 +45,7 @@ public void CoordinateEquals_GivenNull_NotEqual() [TestMethod] public void CoordinateEquals_GivenSameReference_Equal() { - Coordinate coordinate1 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate1 = new(new Longitude(48, 52), new Latitude(-2, -20)); Coordinate coordinate2 = coordinate1; @@ -55,7 +55,7 @@ public void CoordinateEquals_GivenSameReference_Equal() [TestMethod] public void CoordinateEquals_GivenDifferentTypes_NotEqual() { - Coordinate coordinate1 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate1 = new(new Longitude(48, 52), new Latitude(-2, -20)); int otherObj = 12; @@ -66,9 +66,9 @@ public void CoordinateEquals_GivenDifferentTypes_NotEqual() [TestMethod] public void CoordinateAdd_GivenArc_CoordinateOffset() { - Coordinate coordinate = new Coordinate(new Longitude(48, 52), + Coordinate coordinate = new(new Longitude(48, 52), new Latitude(-2, -20)); - Arc arc = new Arc(new Longitude(3), new Latitude(1)); + Arc arc = new(new Longitude(3), new Latitude(1)); coordinate += arc; Assert.AreEqual(51, coordinate.Longitude.Degrees); @@ -80,9 +80,9 @@ public void CoordinateAdd_GivenArc_CoordinateOffset() [TestMethod] public void CoordinateSubtract_GivenArc_CoordinateOffset() { - Coordinate coordinate = new Coordinate(new Longitude(48, 52), + Coordinate coordinate = new(new Longitude(48, 52), new Latitude(-2, -20)); - Arc arc = new Arc(new Longitude(3), new Latitude(1)); + Arc arc = new(new Longitude(3), new Latitude(1)); coordinate -= arc; Assert.AreEqual(45, coordinate.Longitude.Degrees); @@ -94,7 +94,7 @@ public void CoordinateSubtract_GivenArc_CoordinateOffset() [TestMethod] public void CoordinateToString_ValidateCoordinate() { - Coordinate coordinate = new Coordinate(new Longitude(48, 52), + Coordinate coordinate = new(new Longitude(48, 52), new Latitude(-2, -20)); string expected = @"48° 52' 0 E -2° -20' 0 N"; diff --git a/src/Chapter10.Tests/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs b/src/Chapter10.Tests/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs index 1d8ea2535..dc016af68 100644 --- a/src/Chapter10.Tests/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs +++ b/src/Chapter10.Tests/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.Tests.cs @@ -8,7 +8,7 @@ public class ArcTests [TestMethod] public void ArcUnaryMinus_InvertSignOfArc() { - Arc arc = new Arc(new Longitude(48), new Latitude(12)); + Arc arc = new(new Longitude(48), new Latitude(12)); arc = -arc; Assert.AreEqual(-48, arc.LongitudeDifference.Degrees); @@ -22,7 +22,7 @@ public class CoordinateTests [TestMethod] public void ArcUnaryPlus_KeepSignOfArc() { - Arc arc = new Arc(new Longitude(48), new Latitude(12)); + Arc arc = new(new Longitude(48), new Latitude(12)); arc = +arc; Assert.AreEqual(48, arc.LongitudeDifference.Degrees); @@ -33,9 +33,9 @@ public void ArcUnaryPlus_KeepSignOfArc() [TestMethod] public void CoordinateEquals_GivenEqualObjects_AreEqual() { - Coordinate coordinate1 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate1 = new(new Longitude(48, 52), new Latitude(-2, -20)); - Coordinate coordinate2 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate2 = new(new Longitude(48, 52), new Latitude(-2, -20)); Assert.IsTrue(coordinate1.Equals(coordinate2)); @@ -49,9 +49,9 @@ public void CoordinateEquals_GivenEqualObjects_AreEqual() public void CoordinateNotEquals_GivenDifferentObjects_NotEqual(int longDegrees1, int longMinutes1, int latDegrees1, int latMinutes1, int longDegrees2, int longMinutes2, int latDegrees2, int latMinutes2) { - Coordinate coordinate1 = new Coordinate(new Longitude(longDegrees1, longMinutes1), + Coordinate coordinate1 = new(new Longitude(longDegrees1, longMinutes1), new Latitude(latDegrees1, latMinutes1)); - Coordinate coordinate2 = new Coordinate(new Longitude(longDegrees2, longMinutes2), + Coordinate coordinate2 = new(new Longitude(longDegrees2, longMinutes2), new Latitude(latDegrees2, latMinutes2)); Assert.IsTrue(coordinate1 != coordinate2); @@ -60,7 +60,7 @@ public void CoordinateNotEquals_GivenDifferentObjects_NotEqual(int longDegrees1, [TestMethod] public void CoordinateEquals_GivenNull_NotEqual() { - Coordinate coordinate1 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate1 = new(new Longitude(48, 52), new Latitude(-2, -20)); Coordinate? coordinate2 = null; @@ -70,7 +70,7 @@ public void CoordinateEquals_GivenNull_NotEqual() [TestMethod] public void CoordinateEquals_GivenSameReference_Equal() { - Coordinate coordinate1 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate1 = new(new Longitude(48, 52), new Latitude(-2, -20)); Coordinate coordinate2 = coordinate1; @@ -80,7 +80,7 @@ public void CoordinateEquals_GivenSameReference_Equal() [TestMethod] public void CoordinateEquals_GivenDifferentTypes_NotEqual() { - Coordinate coordinate1 = new Coordinate(new Longitude(48, 52), + Coordinate coordinate1 = new(new Longitude(48, 52), new Latitude(-2, -20)); int otherObj = 12; @@ -91,9 +91,9 @@ public void CoordinateEquals_GivenDifferentTypes_NotEqual() [TestMethod] public void CoordinateAdd_GivenArc_CoordinateOffset() { - Coordinate coordinate = new Coordinate(new Longitude(48, 52), + Coordinate coordinate = new(new Longitude(48, 52), new Latitude(-2, -20)); - Arc arc = new Arc(new Longitude(3), new Latitude(1)); + Arc arc = new(new Longitude(3), new Latitude(1)); coordinate += arc; Assert.AreEqual(51, coordinate.Longitude.Degrees); @@ -105,9 +105,9 @@ public void CoordinateAdd_GivenArc_CoordinateOffset() [TestMethod] public void CoordinateSubtract_GivenArc_CoordinateOffset() { - Coordinate coordinate = new Coordinate(new Longitude(48, 52), + Coordinate coordinate = new(new Longitude(48, 52), new Latitude(-2, -20)); - Arc arc = new Arc(new Longitude(3), new Latitude(1)); + Arc arc = new(new Longitude(3), new Latitude(1)); coordinate -= arc; Assert.AreEqual(45, coordinate.Longitude.Degrees); @@ -119,7 +119,7 @@ public void CoordinateSubtract_GivenArc_CoordinateOffset() [TestMethod] public void CoordinateToString_ValidateCoordinate() { - Coordinate coordinate = new Coordinate(new Longitude(48, 52), + Coordinate coordinate = new(new Longitude(48, 52), new Latitude(-2, -20)); string expected = @"48° 52' 0 E -2° -20' 0 N"; diff --git a/src/Chapter10.Tests/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs b/src/Chapter10.Tests/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs index ea29b2aba..772ed7d1d 100644 --- a/src/Chapter10.Tests/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs +++ b/src/Chapter10.Tests/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.Tests.cs @@ -8,7 +8,7 @@ public class LatitudeTests [TestMethod] public void LatitudeDoubleCast_GivenValidLatitude_CastDegreesToDouble() { - Latitude latitude = new Latitude(12); + Latitude latitude = new(12); double castTo = (Double) latitude; diff --git a/src/Chapter10.Tests/Listing10.07.LeveragingADifferentLibrary.Tests.cs b/src/Chapter10.Tests/Listing10.07.LeveragingADifferentLibrary.Tests.cs index 77fa770a1..676826c77 100644 --- a/src/Chapter10.Tests/Listing10.07.LeveragingADifferentLibrary.Tests.cs +++ b/src/Chapter10.Tests/Listing10.07.LeveragingADifferentLibrary.Tests.cs @@ -18,13 +18,13 @@ This is a test of the emergency... """; - Action act = () => Program.Main(new[] + static void invokeMain() => Program.Main(new[] { "black", "blue", "brown", "CBR", "orange", "purple", "red", "yellow" }); - string? result = Execute(act); + string? result = Execute(invokeMain); Assert.AreEqual(expected, result); } diff --git a/src/Chapter10.Tests/Listing10.08.MakingTypesAvailableExternally.Tests.cs b/src/Chapter10.Tests/Listing10.08.MakingTypesAvailableExternally.Tests.cs index d551b923e..879a3d0f0 100644 --- a/src/Chapter10.Tests/Listing10.08.MakingTypesAvailableExternally.Tests.cs +++ b/src/Chapter10.Tests/Listing10.08.MakingTypesAvailableExternally.Tests.cs @@ -10,7 +10,7 @@ public class TypeTests [TestMethod] public void MakingTypesAvailableExternallyPS1_ExitCodeIs0() { - if (PowerShellTestUtilities.PowerShellNotInstalled) Assert.Inconclusive("Powershell not installed"); + if (PowerShellTestUtilities.PowerShellNotInstalled) Assert.Inconclusive("PowerShell not installed"); //EssentialCSharp\\src\\Chapter10.Tests\\bin\\Debug\\netcoreapp3.0 string ps1Path = Path.GetFullPath("../../../../Chapter10/Listing10.08.MakingTypesAvailableExternally.ps1", Environment.CurrentDirectory); string traceValue = "0"; diff --git a/src/Chapter10.Tests/Listing10.14.DefiningAFinalizer.Tests.cs b/src/Chapter10.Tests/Listing10.14.DefiningAFinalizer.Tests.cs index 8749e4c13..6eff787a4 100644 --- a/src/Chapter10.Tests/Listing10.14.DefiningAFinalizer.Tests.cs +++ b/src/Chapter10.Tests/Listing10.14.DefiningAFinalizer.Tests.cs @@ -44,7 +44,7 @@ private static void DeleteTempFile() [TestMethod] public void Create_GivenNewDocument_FileGetsCreated() { - TemporaryFileStream fileStream = new TemporaryFileStream(TempFileName); + TemporaryFileStream fileStream = new(TempFileName); Assert.IsTrue(File.Exists(fileStream.File?.FullName!)); } diff --git a/src/Chapter10.Tests/Listing10.17.RegisteringAFinalizerWithProcessExit.Tests.cs b/src/Chapter10.Tests/Listing10.17.RegisteringAFinalizerWithProcessExit.Tests.cs index 8d45f66ec..02f3f692e 100644 --- a/src/Chapter10.Tests/Listing10.17.RegisteringAFinalizerWithProcessExit.Tests.cs +++ b/src/Chapter10.Tests/Listing10.17.RegisteringAFinalizerWithProcessExit.Tests.cs @@ -20,7 +20,7 @@ public class DisposeTests private const string ProjectName = "ProcessExitTestProgram.testing"; [ClassInitialize] - public static void ClassInitialize(TestContext testContext) + public static void ClassInitialize(TestContext _) { // Clean up at the start in case the class cleanup doesn't run (due to debug for example) Assert.AreEqual(0, RunPowerShellScript("cleanup", out string _)); @@ -50,9 +50,8 @@ public void FinalizerRunsAsPredicted_ConsoleOutputIsInOrder(string finalizerOrde string testStatus = "run"; TestContext.WriteLine($"Ps1Path = '{Path.GetFullPath(Ps1Path)}'"); - string psOutput; int exitCode = RunPowerShellScript( - testStatus, finalizerOrderOption, traceValue, out psOutput); + testStatus, finalizerOrderOption, traceValue, out string psOutput); Assert.AreEqual(0, exitCode, $"PowerShell Output: {psOutput}"); diff --git a/src/Chapter10/Listing10.02.AddingAnOperator.cs b/src/Chapter10/Listing10.02.AddingAnOperator.cs index a04d49f9f..ca7127596 100644 --- a/src/Chapter10/Listing10.02.AddingAnOperator.cs +++ b/src/Chapter10/Listing10.02.AddingAnOperator.cs @@ -1,7 +1,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_02 { #region INCLUDE - public struct Arc + public readonly struct Arc { public Arc( Longitude longitudeDifference, @@ -16,7 +16,7 @@ public Arc( } - public struct Coordinate + public readonly struct Coordinate { #region EXCLUDE public Coordinate(Longitude longitude, Latitude latitude) @@ -28,7 +28,7 @@ public Coordinate(Longitude longitude, Latitude latitude) public static Coordinate operator +( Coordinate source, Arc arc) { - Coordinate result = new Coordinate( + Coordinate result = new( new Longitude( source.Longitude + arc.LongitudeDifference), new Latitude( @@ -40,7 +40,7 @@ public Coordinate(Longitude longitude, Latitude latitude) public static Coordinate operator -( Coordinate source, Arc arc) { - Coordinate result = new Coordinate( + Coordinate result = new( new Longitude( source.Longitude - arc.LongitudeDifference), new Latitude( @@ -138,7 +138,7 @@ public override string ToString() } #endregion INCLUDE - public struct Longitude + public readonly struct Longitude { public Longitude(int degrees, int minutes) { @@ -167,7 +167,7 @@ public Longitude(Longitude longitude) } } - public struct Latitude + public readonly struct Latitude { public Latitude(int degrees, int minutes) { diff --git a/src/Chapter10/Listing10.03.CallingTheMinusAndPlusBinaryOperators.cs b/src/Chapter10/Listing10.03.CallingTheMinusAndPlusBinaryOperators.cs index 4ace7b47e..e9f380711 100644 --- a/src/Chapter10/Listing10.03.CallingTheMinusAndPlusBinaryOperators.cs +++ b/src/Chapter10/Listing10.03.CallingTheMinusAndPlusBinaryOperators.cs @@ -3,6 +3,8 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_03 using System; using Listing10_02; #region INCLUDE + // Use compound assignment suppressed for demonstration purposes + #pragma warning disable IDE0054 public class Program { public static void Main() @@ -10,7 +12,7 @@ public static void Main() Coordinate coordinate1, coordinate2; coordinate1 = new Coordinate( new Longitude(48, 52), new Latitude(-2, -20)); - Arc arc = new Arc(new Longitude(3), new Latitude(1)); + Arc arc = new(new Longitude(3), new Latitude(1)); coordinate2 = coordinate1 + arc; Console.WriteLine(coordinate2); diff --git a/src/Chapter10/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.cs b/src/Chapter10/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.cs index 4937f5d71..cfa6fb51a 100644 --- a/src/Chapter10/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.cs +++ b/src/Chapter10/Listing10.04.OverloadingTheMinusAndPlusUnaryOperators.cs @@ -1,6 +1,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_04 { - public struct Coordinate + public readonly struct Coordinate { public Coordinate(Longitude longitude, Latitude latitude) { @@ -11,7 +11,7 @@ public Coordinate(Longitude longitude, Latitude latitude) public static Coordinate operator +( Coordinate source, Arc arc) { - Coordinate result = new Coordinate( + Coordinate result = new( new Longitude( source.Longitude + arc.LongitudeDifference), new Latitude( @@ -22,7 +22,7 @@ public Coordinate(Longitude longitude, Latitude latitude) public static Coordinate operator -( Coordinate source, Arc arc) { - Coordinate result = new Coordinate( + Coordinate result = new( new Longitude( source.Longitude - arc.LongitudeDifference), new Latitude( @@ -233,7 +233,7 @@ public int Minutes } #endregion EXCLUDE } - public struct Arc + public readonly struct Arc { #region EXCLUDE public Arc( diff --git a/src/Chapter10/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs b/src/Chapter10/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs index 642cc7023..6702860ac 100644 --- a/src/Chapter10/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs +++ b/src/Chapter10/Listing10.06.ProvidingAnImplicitConversionBetweenLatitudeAndDouble.cs @@ -1,7 +1,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_06 { #region INCLUDE - public struct Latitude + public readonly struct Latitude { // ... diff --git a/src/Chapter10/Listing10.12.CommentingWithXML.cs b/src/Chapter10/Listing10.12.CommentingWithXML.cs index babb86cdd..0fefc6fa3 100644 --- a/src/Chapter10/Listing10.12.CommentingWithXML.cs +++ b/src/Chapter10/Listing10.12.CommentingWithXML.cs @@ -1,58 +1,59 @@ +// Remove unused parameter disabled for elucidation. +#pragma warning disable IDE0060 using Chapter10; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_12 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_12; + +#region INCLUDE +/// +/// DataStorage is used to persist and retrieve +/// employee data from the files. +/// +class DataStorage { - #region INCLUDE /// - /// DataStorage is used to persist and retrieve - /// employee data from the files. + /// Save an employee object to a file + /// named with the Employee name. /// - class DataStorage + /// + /// This method uses + /// in addition to + /// + /// + /// + /// The employee to persist to a file + /// January 1, 2000 + public static void Store(Employee employee) { - /// - /// Save an employee object to a file - /// named with the Employee name. - /// - /// - /// This method uses - /// in addition to - /// - /// - /// - /// The employee to persist to a file - /// January 1, 2000 - public static void Store(Employee employee) - { - // ... - } - - /** - * Loads up an employee object. - * - * - * This method uses - * in addition to - * - * - * - * The first name of the employee - * - * The last name of the employee - * - * The employee object corresponding to the names - * - * January 1, 2000 **/ - public static Employee Load(string firstName, string lastName) - { - #region EXCLUDE - return new Employee(); - #endregion EXCLUDE - } + // ... } - class Program + /** + * Loads up an employee object. + * + * + * This method uses + * in addition to + * + * + * + * The first name of the employee + * + * The last name of the employee + * + * The employee object corresponding to the names + * + * January 1, 2000 **/ + public static Employee Load(string firstName, string lastName) { - // ... + #region EXCLUDE + return new Employee(); + #endregion EXCLUDE } - #endregion INCLUDE } + +class Program +{ + // ... +} +#endregion INCLUDE diff --git a/src/Chapter10/Listing10.13.WeakReferences.cs b/src/Chapter10/Listing10.13.WeakReferences.cs index 272f7959b..cb0fe0f08 100644 --- a/src/Chapter10/Listing10.13.WeakReferences.cs +++ b/src/Chapter10/Listing10.13.WeakReferences.cs @@ -77,7 +77,7 @@ static public byte[] GetData() public class ObjectDataSource { - private readonly WeakReference Data = new WeakReference(null); + private readonly WeakReference Data = new(null); public void ClearReference() { Data.Target = null; diff --git a/src/Chapter10/Listing10.14.DefiningAFinalizer.cs b/src/Chapter10/Listing10.14.DefiningAFinalizer.cs index 836eb4012..5c6290390 100644 --- a/src/Chapter10/Listing10.14.DefiningAFinalizer.cs +++ b/src/Chapter10/Listing10.14.DefiningAFinalizer.cs @@ -1,59 +1,57 @@ // Justification: Implementation is incomplete in the catch block. -#pragma warning disable CS0168 // Variable is declared but never used -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_14 +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter10.Listing10_14; + +using System; +#region INCLUDE +using System.IO; + +public class TemporaryFileStream { - using System; - #region INCLUDE - using System.IO; + public TemporaryFileStream(string fileName) + { + File = new FileInfo(fileName); + // For a preferable solution use FileOptions.DeleteOnClose. + Stream = new FileStream( + File.FullName, FileMode.OpenOrCreate, + FileAccess.ReadWrite); + } + + public TemporaryFileStream() + : this(Path.GetTempFileName()) + { } - public class TemporaryFileStream + #region HIGHLIGHT + // Finalizer + ~TemporaryFileStream() { - public TemporaryFileStream(string fileName) + try { - File = new FileInfo(fileName); - // For a preferable solution use FileOptions.DeleteOnClose. - Stream = new FileStream( - File.FullName, FileMode.OpenOrCreate, - FileAccess.ReadWrite); + Close(); } - - public TemporaryFileStream() - : this(Path.GetTempFileName()) - { } - - #region HIGHLIGHT - // Finalizer - ~TemporaryFileStream() + catch (Exception ) { - try - { - Close(); - } - catch (Exception exception) - { - // Write event to logs or UI - // ... - } + // Write event to logs or UI + // ... } - #endregion HIGHLIGHT + } + #endregion HIGHLIGHT - public FileStream? Stream { get; private set; } - public FileInfo? File { get; private set; } + public FileStream? Stream { get; private set; } + public FileInfo? File { get; private set; } - public void Close() + public void Close() + { + Stream?.Dispose(); + try + { + File?.Delete(); + } + catch(IOException exception) { - Stream?.Dispose(); - try - { - File?.Delete(); - } - catch(IOException exception) - { - Console.WriteLine(exception); - } - Stream = null; - File = null; + Console.WriteLine(exception); } + Stream = null; + File = null; } - #endregion INCLUDE } +#endregion INCLUDE diff --git a/src/Chapter10/Listing10.15.ResourceCleanupWithIDisposable.cs b/src/Chapter10/Listing10.15.ResourceCleanupWithIDisposable.cs index 2ce7be577..6765e00fb 100644 --- a/src/Chapter10/Listing10.15.ResourceCleanupWithIDisposable.cs +++ b/src/Chapter10/Listing10.15.ResourceCleanupWithIDisposable.cs @@ -10,7 +10,7 @@ public static class Program public static void Search() { TemporaryFileStream fileStream = - new TemporaryFileStream(); + new(); // Use temporary file stream // ... diff --git a/src/Chapter10/Listing10.16.InvokingTheUsingStatement.cs b/src/Chapter10/Listing10.16.InvokingTheUsingStatement.cs index 119100b6c..51954b5f8 100644 --- a/src/Chapter10/Listing10.16.InvokingTheUsingStatement.cs +++ b/src/Chapter10/Listing10.16.InvokingTheUsingStatement.cs @@ -13,14 +13,14 @@ public static void Search() #region HIGHLIGHT // C# 8.0 using TemporaryFileStream fileStream1 = - new TemporaryFileStream(); + new(); #endregion HIGHLIGHT #region HIGHLIGHT // Prior to C# 8.0 using (TemporaryFileStream fileStream2 = - new TemporaryFileStream(), - fileStream3 = new TemporaryFileStream()) + new(), + fileStream3 = new()) #endregion HIGHLIGHT { // Use temporary file stream; diff --git a/src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.cs b/src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.cs index 47b7a98c9..0b2b70791 100644 --- a/src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.cs +++ b/src/Chapter10/Listing10.17.RegisteringAFinalizerWithProcessExit.cs @@ -63,7 +63,7 @@ public SampleUnmanagedResource(string fileName) $"{nameof(SampleUnmanagedResource)}.ctor"); WeakReference weakReferenceToSelf = - new WeakReference(this); + new(this); ProcessExitHandler = (_, __) => { WriteLine("Starting...", "ProcessExitHandler"); diff --git a/src/Chapter10/Listing10.18.LazyLoadingAProperty.cs b/src/Chapter10/Listing10.18.LazyLoadingAProperty.cs index aaf4d1c97..35fdfb2cc 100644 --- a/src/Chapter10/Listing10.18.LazyLoadingAProperty.cs +++ b/src/Chapter10/Listing10.18.LazyLoadingAProperty.cs @@ -7,8 +7,8 @@ class DataCache // ... public TemporaryFileStream FileStream => - InternalFileStream??(InternalFileStream = - new TemporaryFileStream()); + InternalFileStream ??= + new TemporaryFileStream(); private TemporaryFileStream? InternalFileStream { get; set; } = null; @@ -31,10 +31,7 @@ public TemporaryFileStream FileStream { get { - if (_FileStream is null) - { - _FileStream = new TemporaryFileStream(); - } + _FileStream ??= new TemporaryFileStream(); return _FileStream; } } diff --git a/src/Chapter10/Listing10.19.UsingSystem.Lazy.cs b/src/Chapter10/Listing10.19.UsingSystem.Lazy.cs index 8cf8bb916..d88f76c55 100644 --- a/src/Chapter10/Listing10.19.UsingSystem.Lazy.cs +++ b/src/Chapter10/Listing10.19.UsingSystem.Lazy.cs @@ -40,7 +40,7 @@ public TemporaryFileStream FileStream return _FileStream.Value; } } - private Lazy _FileStream; + private readonly Lazy _FileStream; // ... } diff --git a/src/Shared/Tests/PowerShellTestUtilities.cs b/src/Shared/Tests/PowerShellTestUtilities.cs index 4a1d8814b..efc83013f 100644 --- a/src/Shared/Tests/PowerShellTestUtilities.cs +++ b/src/Shared/Tests/PowerShellTestUtilities.cs @@ -10,7 +10,7 @@ public static bool WindowsEnvironment() return RuntimeInformation.IsOSPlatform(OSPlatform.Windows); } - public static Lazy _PowerShellCommand = new Lazy(() => + public static Lazy _PowerShellCommand = new(() => { string? powershellCommand = null; // Verify that the PowerShell command executes successfully. From b488091717157d45a4ad1e13a51e60097eccfa92 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Sun, 5 Feb 2023 16:02:42 -0800 Subject: [PATCH 11/17] Updated to add Inheritance, Customization, and with Operator --- src/Chapter09.Tests/Chapter09.Tests.csproj | 3 -- src/Chapter09.Tests/GeoCoordinate.cs | 9 ------ ...Listing09.04.DeclaringRecordClass.Tests.cs | 27 ++++++++++++++-- ...ng09.05.EquivalentRecordClassCode.Tests.cs | 4 +-- ...Listing09.06C.CustomizingARecord.Tests.cs} | 2 +- ...sting09.02.ProgrammingWithARecordStruct.cs | 11 ++++++- .../Listing09.05.EquivalentRecordClassCode.cs | 5 +++ ...ing09.06A.CloningRecordsViaWithOperator.cs | 25 +++++++++++++++ .../Listing09.06B.RecordClassInheritance.cs | 9 ++++++ ...cs => Listing09.06C.CustomizingARecord.cs} | 31 +++++++------------ ...Listing09.09.SubtleBoxingIdiosyncrasies.cs | 9 ++++-- 11 files changed, 95 insertions(+), 40 deletions(-) delete mode 100644 src/Chapter09.Tests/GeoCoordinate.cs rename src/Chapter09.Tests/{Listing09.06.CustomizingARecord.Tests.cs => Listing09.06C.CustomizingARecord.Tests.cs} (98%) create mode 100644 src/Chapter09/Listing09.06A.CloningRecordsViaWithOperator.cs create mode 100644 src/Chapter09/Listing09.06B.RecordClassInheritance.cs rename src/Chapter09/{Listing09.06.CustomizingARecord.cs => Listing09.06C.CustomizingARecord.cs} (54%) diff --git a/src/Chapter09.Tests/Chapter09.Tests.csproj b/src/Chapter09.Tests/Chapter09.Tests.csproj index 97d7ab7bf..fda2cccda 100644 --- a/src/Chapter09.Tests/Chapter09.Tests.csproj +++ b/src/Chapter09.Tests/Chapter09.Tests.csproj @@ -21,7 +21,4 @@ - - - diff --git a/src/Chapter09.Tests/GeoCoordinate.cs b/src/Chapter09.Tests/GeoCoordinate.cs deleted file mode 100644 index 3d9c8cab6..000000000 --- a/src/Chapter09.Tests/GeoCoordinate.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; - -public record class GeoCoordinate(Angle Longitude, Angle Latitude, string Name) - : Coordinate(Longitude, Latitude) -{ - public new Type ExternalEqualityContract => EqualityContract; -} diff --git a/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs index 25ab16c5a..dee568b28 100644 --- a/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs +++ b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs @@ -1,6 +1,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06B; +using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public partial class CoordinateTests @@ -27,7 +28,7 @@ public void EqualityContract_GetType() { Coordinate coordinate1 = new( new Angle(180, 0, 0), new Angle(180, 0, 0)); - GeoCoordinate coordinate2 = new( + NamedCoordinate coordinate2 = new( coordinate1.Longitude, coordinate1.Latitude, "Test"); @@ -41,4 +42,26 @@ public void GetHashCode_ChangeData_GetHashCodeChanges() new Angle(180, 0, 0), new Angle(180, 0, 0)); int hashCode1 = coordinate.GetHashCode(); } + + [TestMethod] + public void With_Instance_Equivalent() + { + Coordinate coordinate1 = new( + new Angle(180, 0, 0), new Angle(180, 0, 0)); + Coordinate coordinate2 = coordinate1 with { }; + Assert.AreEqual(coordinate1, coordinate2); + } + + [TestMethod] + public void With_DifferentInstance_NotEquivalent() + { + Coordinate coordinate1 = + new(new Angle(180, 0, 0), new Angle(180, 0, 0)); + Angle angle = new Angle(0, 0, 0); + Coordinate coordinate2 = coordinate1 with + { + Latitude = angle + }; + Assert.AreNotEqual(coordinate1, coordinate2); + } } diff --git a/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs b/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs index feb47a466..08978d478 100644 --- a/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs +++ b/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs @@ -1,7 +1,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Tests; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06B; [TestClass] public class CoordinateTests @@ -29,7 +29,7 @@ public void EqualityContract_GetType() { Coordinate coordinate1 = new( new Angle(180, 0, 0), new Angle(180, 0, 0)); - GeoCoordinate geoCoordinate = new( + NamedCoordinate geoCoordinate = new( new Angle(180, 0, 0), new Angle(180, 0, 0), "GeoCoordinate"); Assert.AreEqual(coordinate1.ExternalEqualityContract, coordinate1.GetType()); diff --git a/src/Chapter09.Tests/Listing09.06.CustomizingARecord.Tests.cs b/src/Chapter09.Tests/Listing09.06C.CustomizingARecord.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing09.06.CustomizingARecord.Tests.cs rename to src/Chapter09.Tests/Listing09.06C.CustomizingARecord.Tests.cs index e52c1c6cd..97a12d39e 100644 --- a/src/Chapter09.Tests/Listing09.06.CustomizingARecord.Tests.cs +++ b/src/Chapter09.Tests/Listing09.06C.CustomizingARecord.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06C.Tests; [TestClass] public class AngleTests diff --git a/src/Chapter09/Listing09.02.ProgrammingWithARecordStruct.cs b/src/Chapter09/Listing09.02.ProgrammingWithARecordStruct.cs index d5ab00a49..784491fa9 100644 --- a/src/Chapter09/Listing09.02.ProgrammingWithARecordStruct.cs +++ b/src/Chapter09/Listing09.02.ProgrammingWithARecordStruct.cs @@ -30,9 +30,18 @@ public static void Main() } Angle copy = new(degrees, minutes, seconds); - // Records provide a custom equality operator. Trace.Assert(angle == copy); + + // The with operator is the equivalent of + // Angle copy = new(degrees, minutes, seconds); + copy = angle with { }; + Trace.Assert(angle == copy); + + // The with operator has object initializer type + // syntax for instantiating a modified copy. + Angle modifiedCopy = angle with { Degrees = 180 }; + Trace.Assert(angle != modifiedCopy); } } #endregion INCLUDE diff --git a/src/Chapter09/Listing09.05.EquivalentRecordClassCode.cs b/src/Chapter09/Listing09.05.EquivalentRecordClassCode.cs index 677208bf6..50a806c2d 100644 --- a/src/Chapter09/Listing09.05.EquivalentRecordClassCode.cs +++ b/src/Chapter09/Listing09.05.EquivalentRecordClassCode.cs @@ -80,6 +80,11 @@ public void Deconstruct(out Angle Longitude, out Angle Latitude) public Type ExternalEqualityContract => EqualityContract(); + + // Actual name in IL is "$". However, + // you can't add a Clone method to a record. + public Coordinate Clone() => new(this); + protected Coordinate(Coordinate original) { Longitude = original.Longitude; diff --git a/src/Chapter09/Listing09.06A.CloningRecordsViaWithOperator.cs b/src/Chapter09/Listing09.06A.CloningRecordsViaWithOperator.cs new file mode 100644 index 000000000..1a18c190c --- /dev/null +++ b/src/Chapter09/Listing09.06A.CloningRecordsViaWithOperator.cs @@ -0,0 +1,25 @@ + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06A; + +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; +#region INCLUDE +using System.Diagnostics; + +public class Program +{ + public static void Main() + { + Angle angle = new(90, 0, 0); + + // The with operator is the equivalent of + // Angle copy = new(degrees, minutes, seconds); + Angle copy = angle with { }; + Trace.Assert(angle == copy); + + // The with operator has object initializer type + // syntax for instantiating a modified copy. + Angle modifiedCopy = angle with { Degrees = 180 }; + Trace.Assert(angle != modifiedCopy); + } +} +#endregion INCLUDE diff --git a/src/Chapter09/Listing09.06B.RecordClassInheritance.cs b/src/Chapter09/Listing09.06B.RecordClassInheritance.cs new file mode 100644 index 000000000..900fc4b40 --- /dev/null +++ b/src/Chapter09/Listing09.06B.RecordClassInheritance.cs @@ -0,0 +1,9 @@ +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06B; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; + +#region INCLUDE +public record class NamedCoordinate( + Angle Longitude, Angle Latitude, string Name) + : Coordinate(Longitude, Latitude); +#endregion INCLUDE \ No newline at end of file diff --git a/src/Chapter09/Listing09.06.CustomizingARecord.cs b/src/Chapter09/Listing09.06C.CustomizingARecord.cs similarity index 54% rename from src/Chapter09/Listing09.06.CustomizingARecord.cs rename to src/Chapter09/Listing09.06C.CustomizingARecord.cs index 39fa26b4b..360d1e0f5 100644 --- a/src/Chapter09/Listing09.06.CustomizingARecord.cs +++ b/src/Chapter09/Listing09.06C.CustomizingARecord.cs @@ -1,28 +1,19 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06C; -public readonly record struct Angle(int Degrees, int Minutes, int Seconds, string? Name = null) +#region INCLUDE +public readonly record struct Angle( + int Degrees, int Minutes, int Seconds, string? Name = null) { public int Degrees { get; } = Degrees; - private readonly int _Minutes = Minutes; - public int Minutes + public Angle( + string degrees, string minutes, string seconds) + : this(int.Parse(degrees), + int.Parse(minutes), int.Parse(seconds)) { - get => _Minutes; - init => _Minutes=value; } - private readonly int _Seconds = Seconds; - public int Seconds - { - get => _Seconds; - init => _Seconds=value; - } - public Angle(string degrees, string minutes, string seconds) - : this(int.Parse(degrees), int.Parse(minutes), int.Parse(seconds)) - { - } - public override readonly string ToString() { string prefix = @@ -30,6 +21,7 @@ public override readonly string ToString() return $"{prefix}{Degrees}° {Minutes}' {Seconds}\""; } + // Changing Equals() to ignore Name public bool Equals(Angle other) => (Degrees, Minutes, Seconds).Equals( (other.Degrees, other.Minutes, other.Seconds)); @@ -38,8 +30,9 @@ public override int GetHashCode() => HashCode.Combine(Degrees.GetHashCode(), Minutes.GetHashCode(), Seconds.GetHashCode); -#if UsingTupleToGenerateHashCode + #if UsingTupleToGenerateHashCode public override int GetHashCode() => (Degrees, Minutes, Seconds).GetHashCode(); -#endif // UsingTupleToGenerateHashCode + #endif // UsingTupleToGenerateHashCode } +#endregion INCLUDE \ No newline at end of file diff --git a/src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs b/src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs index bbd035dec..aebcf8ba1 100644 --- a/src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs +++ b/src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs @@ -58,11 +58,14 @@ public static void Main() object objectAngle = angle; // Box Console.Write(((Angle)objectAngle).Degrees); - // Example 2: Unbox, modify unboxed value, and discard value - ((Angle)objectAngle).MoveTo(26, 58, 23); + // Example 2: Unbox, modify unboxed value, + // and discard value + ((Angle)objectAngle).MoveTo + (26, 58, 23); Console.Write(", " + ((Angle)objectAngle).Degrees); - // Example 3: Box, modify boxed value, and discard reference to box + // Example 3: Box, modify boxed value, + // and discard reference to box ((IAngle)angle).MoveTo(26, 58, 23); Console.Write(", " + ((Angle)angle).Degrees); From 5140a8f11b66a16b4bd0518e5f6f6b4d8cfbb4f1 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Sun, 5 Feb 2023 16:54:14 -0800 Subject: [PATCH 12/17] Renumber --- .../Listing09.04.DeclaringRecordClass.Tests.cs | 6 ++++-- .../Listing09.05.EquivalentRecordClassCode.Tests.cs | 2 +- ...rd.Tests.cs => Listing09.08.CustomizingARecord.Tests.cs} | 2 +- ... => Listing09.09.SubtleBoxAndUnboxInstructions.Tests.cs} | 2 +- ....cs => Listing09.11.SubtleBoxingIdiosyncrasies.Tests.cs} | 2 +- ....cs => Listing09.12.AvoidingUnboxingAndCopying.Tests.cs} | 2 +- ...09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs} | 2 +- ...18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs} | 2 +- ...Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs} | 2 +- ...e.Tests.cs => Listing09.22.UsingFlagsAttribute.Tests.cs} | 2 +- ...nheritance.cs => Listing09.07.RecordClassInheritance.cs} | 4 ++-- ...omizingARecord.cs => Listing09.08.CustomizingARecord.cs} | 4 ++-- ...ons.cs => Listing09.09.SubtleBoxAndUnboxInstructions.cs} | 2 +- ...cs => Listing09.10.UnboxingMustBeToTheUnderlyingType.cs} | 2 +- ...rasies.cs => Listing09.11.SubtleBoxingIdiosyncrasies.cs} | 2 +- ...opying.cs => Listing09.12.AvoidingUnboxingAndCopying.cs} | 2 +- ... Listing09.13.ComparingAnIntegerSwitchToAnEnumSwitch.cs} | 4 ++-- ....12.DefiningAnEnum.cs => Listing09.14.DefiningAnEnum.cs} | 2 +- ...ningAnEnumType.cs => Listing09.15.DefiningAnEnumType.cs} | 2 +- ...Enums.cs => Listing09.16.CastingBetweenArraysOfEnums.cs} | 2 +- ...isting09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs} | 2 +- ...ing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs} | 2 +- ...ingEnumsAsFlags.cs => Listing09.19.UsingEnumsAsFlags.cs} | 2 +- ...cs => Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs} | 2 +- ...sting09.21.DefiningEnumValuesforFrequentCombinations.cs} | 2 +- ...lagsAttribute.cs => Listing09.22.UsingFlagsAttribute.cs} | 2 +- 26 files changed, 32 insertions(+), 30 deletions(-) rename src/Chapter09.Tests/{Listing09.06C.CustomizingARecord.Tests.cs => Listing09.08.CustomizingARecord.Tests.cs} (98%) rename src/Chapter09.Tests/{Listing09.07.SubtleBoxAndUnboxInstructions.Tests.cs => Listing09.09.SubtleBoxAndUnboxInstructions.Tests.cs} (98%) rename src/Chapter09.Tests/{Listing09.09.SubtleBoxingIdiosyncrasies.Tests.cs => Listing09.11.SubtleBoxingIdiosyncrasies.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.10.AvoidingUnboxingAndCopying.Tests.cs => Listing09.12.AvoidingUnboxingAndCopying.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs => Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs => Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.18.UsingBitwiseORandANDWithFlagEnums.Tests.cs => Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs} (98%) rename src/Chapter09.Tests/{Listing09.20.UsingFlagsAttribute.Tests.cs => Listing09.22.UsingFlagsAttribute.Tests.cs} (97%) rename src/Chapter09/{Listing09.06B.RecordClassInheritance.cs => Listing09.07.RecordClassInheritance.cs} (74%) rename src/Chapter09/{Listing09.06C.CustomizingARecord.cs => Listing09.08.CustomizingARecord.cs} (97%) rename src/Chapter09/{Listing09.07.SubtleBoxAndUnboxInstructions.cs => Listing09.09.SubtleBoxAndUnboxInstructions.cs} (99%) rename src/Chapter09/{Listing09.08.UnboxingMustBeToTheUnderlyingType.cs => Listing09.10.UnboxingMustBeToTheUnderlyingType.cs} (97%) rename src/Chapter09/{Listing09.09.SubtleBoxingIdiosyncrasies.cs => Listing09.11.SubtleBoxingIdiosyncrasies.cs} (99%) rename src/Chapter09/{Listing09.10.AvoidingUnboxingAndCopying.cs => Listing09.12.AvoidingUnboxingAndCopying.cs} (98%) rename src/Chapter09/{Listing09.11.ComparingAnIntegerSwitchToAnEnumSwitch.cs => Listing09.13.ComparingAnIntegerSwitchToAnEnumSwitch.cs} (97%) rename src/Chapter09/{Listing09.12.DefiningAnEnum.cs => Listing09.14.DefiningAnEnum.cs} (95%) rename src/Chapter09/{Listing09.13.DefiningAnEnumType.cs => Listing09.15.DefiningAnEnumType.cs} (95%) rename src/Chapter09/{Listing09.14.CastingBetweenArraysOfEnums.cs => Listing09.16.CastingBetweenArraysOfEnums.cs} (98%) rename src/Chapter09/{Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.cs => Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs} (97%) rename src/Chapter09/{Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.cs => Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs} (97%) rename src/Chapter09/{Listing09.17.UsingEnumsAsFlags.cs => Listing09.19.UsingEnumsAsFlags.cs} (98%) rename src/Chapter09/{Listing09.18.UsingBitwiseORandANDWithFlagEnums.cs => Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs} (99%) rename src/Chapter09/{Listing09.19.DefiningEnumValuesforFrequentCombinations.cs => Listing09.21.DefiningEnumValuesforFrequentCombinations.cs} (97%) rename src/Chapter09/{Listing09.20.UsingFlagsAttribute.cs => Listing09.22.UsingFlagsAttribute.cs} (99%) diff --git a/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs index dee568b28..6c94b042c 100644 --- a/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs +++ b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs @@ -1,6 +1,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06B; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07; using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] @@ -9,7 +9,7 @@ public partial class CoordinateTests [TestMethod] public void Create_Coordinate_IsReadOnly() { - Coordinate coordinate = new( + _ = new Coordinate( new Angle(180, 0, 0), new Angle(180, 0, 0)); } @@ -35,6 +35,8 @@ public void EqualityContract_GetType() Assert.AreNotEqual(coordinate1.GetType(), coordinate2.GetType()); } + record struct SampleStruct(int A, int B); + [TestMethod] public void GetHashCode_ChangeData_GetHashCodeChanges() { diff --git a/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs b/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs index 08978d478..73e2fdd2d 100644 --- a/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs +++ b/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs @@ -1,7 +1,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05.Tests; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; -using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06B; +using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07; [TestClass] public class CoordinateTests diff --git a/src/Chapter09.Tests/Listing09.06C.CustomizingARecord.Tests.cs b/src/Chapter09.Tests/Listing09.08.CustomizingARecord.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing09.06C.CustomizingARecord.Tests.cs rename to src/Chapter09.Tests/Listing09.08.CustomizingARecord.Tests.cs index 97a12d39e..3ab07263e 100644 --- a/src/Chapter09.Tests/Listing09.06C.CustomizingARecord.Tests.cs +++ b/src/Chapter09.Tests/Listing09.08.CustomizingARecord.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06C.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_08.Tests; [TestClass] public class AngleTests diff --git a/src/Chapter09.Tests/Listing09.07.SubtleBoxAndUnboxInstructions.Tests.cs b/src/Chapter09.Tests/Listing09.09.SubtleBoxAndUnboxInstructions.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing09.07.SubtleBoxAndUnboxInstructions.Tests.cs rename to src/Chapter09.Tests/Listing09.09.SubtleBoxAndUnboxInstructions.Tests.cs index cc8740c51..55fcfd076 100644 --- a/src/Chapter09.Tests/Listing09.07.SubtleBoxAndUnboxInstructions.Tests.cs +++ b/src/Chapter09.Tests/Listing09.09.SubtleBoxAndUnboxInstructions.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.09.SubtleBoxingIdiosyncrasies.Tests.cs b/src/Chapter09.Tests/Listing09.11.SubtleBoxingIdiosyncrasies.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.09.SubtleBoxingIdiosyncrasies.Tests.cs rename to src/Chapter09.Tests/Listing09.11.SubtleBoxingIdiosyncrasies.Tests.cs index a9aa8609e..71fb67828 100644 --- a/src/Chapter09.Tests/Listing09.09.SubtleBoxingIdiosyncrasies.Tests.cs +++ b/src/Chapter09.Tests/Listing09.11.SubtleBoxingIdiosyncrasies.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_11.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.10.AvoidingUnboxingAndCopying.Tests.cs b/src/Chapter09.Tests/Listing09.12.AvoidingUnboxingAndCopying.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.10.AvoidingUnboxingAndCopying.Tests.cs rename to src/Chapter09.Tests/Listing09.12.AvoidingUnboxingAndCopying.Tests.cs index cb6a0d6a7..d0b768f56 100644 --- a/src/Chapter09.Tests/Listing09.10.AvoidingUnboxingAndCopying.Tests.cs +++ b/src/Chapter09.Tests/Listing09.12.AvoidingUnboxingAndCopying.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_10.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs b/src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs rename to src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs index a56cc91d5..20a893a3d 100644 --- a/src/Chapter09.Tests/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs +++ b/src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs b/src/Chapter09.Tests/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs rename to src/Chapter09.Tests/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs index 7685fbb16..682843b4d 100644 --- a/src/Chapter09.Tests/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs +++ b/src/Chapter09.Tests/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_16.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.18.UsingBitwiseORandANDWithFlagEnums.Tests.cs b/src/Chapter09.Tests/Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing09.18.UsingBitwiseORandANDWithFlagEnums.Tests.cs rename to src/Chapter09.Tests/Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs index 8cb62bddf..85f64e435 100644 --- a/src/Chapter09.Tests/Listing09.18.UsingBitwiseORandANDWithFlagEnums.Tests.cs +++ b/src/Chapter09.Tests/Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.20.UsingFlagsAttribute.Tests.cs b/src/Chapter09.Tests/Listing09.22.UsingFlagsAttribute.Tests.cs similarity index 97% rename from src/Chapter09.Tests/Listing09.20.UsingFlagsAttribute.Tests.cs rename to src/Chapter09.Tests/Listing09.22.UsingFlagsAttribute.Tests.cs index 76e852eb0..d403ecc49 100644 --- a/src/Chapter09.Tests/Listing09.20.UsingFlagsAttribute.Tests.cs +++ b/src/Chapter09.Tests/Listing09.22.UsingFlagsAttribute.Tests.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_22.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09/Listing09.06B.RecordClassInheritance.cs b/src/Chapter09/Listing09.07.RecordClassInheritance.cs similarity index 74% rename from src/Chapter09/Listing09.06B.RecordClassInheritance.cs rename to src/Chapter09/Listing09.07.RecordClassInheritance.cs index 900fc4b40..ece76736c 100644 --- a/src/Chapter09/Listing09.06B.RecordClassInheritance.cs +++ b/src/Chapter09/Listing09.07.RecordClassInheritance.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06B; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_01; using AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04; @@ -6,4 +6,4 @@ public record class NamedCoordinate( Angle Longitude, Angle Latitude, string Name) : Coordinate(Longitude, Latitude); -#endregion INCLUDE \ No newline at end of file +#endregion INCLUDE diff --git a/src/Chapter09/Listing09.06C.CustomizingARecord.cs b/src/Chapter09/Listing09.08.CustomizingARecord.cs similarity index 97% rename from src/Chapter09/Listing09.06C.CustomizingARecord.cs rename to src/Chapter09/Listing09.08.CustomizingARecord.cs index 360d1e0f5..645d59cc4 100644 --- a/src/Chapter09/Listing09.06C.CustomizingARecord.cs +++ b/src/Chapter09/Listing09.08.CustomizingARecord.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_06C; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_08; #region INCLUDE public readonly record struct Angle( @@ -35,4 +35,4 @@ public override int GetHashCode() => (Degrees, Minutes, Seconds).GetHashCode(); #endif // UsingTupleToGenerateHashCode } -#endregion INCLUDE \ No newline at end of file +#endregion INCLUDE diff --git a/src/Chapter09/Listing09.07.SubtleBoxAndUnboxInstructions.cs b/src/Chapter09/Listing09.09.SubtleBoxAndUnboxInstructions.cs similarity index 99% rename from src/Chapter09/Listing09.07.SubtleBoxAndUnboxInstructions.cs rename to src/Chapter09/Listing09.09.SubtleBoxAndUnboxInstructions.cs index 587ed532b..5b96f3afe 100644 --- a/src/Chapter09/Listing09.07.SubtleBoxAndUnboxInstructions.cs +++ b/src/Chapter09/Listing09.09.SubtleBoxAndUnboxInstructions.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_07; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09; using System; #region INCLUDE diff --git a/src/Chapter09/Listing09.08.UnboxingMustBeToTheUnderlyingType.cs b/src/Chapter09/Listing09.10.UnboxingMustBeToTheUnderlyingType.cs similarity index 97% rename from src/Chapter09/Listing09.08.UnboxingMustBeToTheUnderlyingType.cs rename to src/Chapter09/Listing09.10.UnboxingMustBeToTheUnderlyingType.cs index 52c8fddbf..009ea6714 100644 --- a/src/Chapter09/Listing09.08.UnboxingMustBeToTheUnderlyingType.cs +++ b/src/Chapter09/Listing09.10.UnboxingMustBeToTheUnderlyingType.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_08; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_10; public class DisplayFibonacci { diff --git a/src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs b/src/Chapter09/Listing09.11.SubtleBoxingIdiosyncrasies.cs similarity index 99% rename from src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs rename to src/Chapter09/Listing09.11.SubtleBoxingIdiosyncrasies.cs index aebcf8ba1..9b36e20ea 100644 --- a/src/Chapter09/Listing09.09.SubtleBoxingIdiosyncrasies.cs +++ b/src/Chapter09/Listing09.11.SubtleBoxingIdiosyncrasies.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_09; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_11; using System; diff --git a/src/Chapter09/Listing09.10.AvoidingUnboxingAndCopying.cs b/src/Chapter09/Listing09.12.AvoidingUnboxingAndCopying.cs similarity index 98% rename from src/Chapter09/Listing09.10.AvoidingUnboxingAndCopying.cs rename to src/Chapter09/Listing09.12.AvoidingUnboxingAndCopying.cs index 4cf2adc45..0aaca737d 100644 --- a/src/Chapter09/Listing09.10.AvoidingUnboxingAndCopying.cs +++ b/src/Chapter09/Listing09.12.AvoidingUnboxingAndCopying.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_10; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12; using System; diff --git a/src/Chapter09/Listing09.11.ComparingAnIntegerSwitchToAnEnumSwitch.cs b/src/Chapter09/Listing09.13.ComparingAnIntegerSwitchToAnEnumSwitch.cs similarity index 97% rename from src/Chapter09/Listing09.11.ComparingAnIntegerSwitchToAnEnumSwitch.cs rename to src/Chapter09/Listing09.13.ComparingAnIntegerSwitchToAnEnumSwitch.cs index 4c207cf3b..986732131 100644 --- a/src/Chapter09/Listing09.11.ComparingAnIntegerSwitchToAnEnumSwitch.cs +++ b/src/Chapter09/Listing09.13.ComparingAnIntegerSwitchToAnEnumSwitch.cs @@ -1,6 +1,6 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_11; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_13; -using Listing09_13; +using Listing09_15; public class Program { diff --git a/src/Chapter09/Listing09.12.DefiningAnEnum.cs b/src/Chapter09/Listing09.14.DefiningAnEnum.cs similarity index 95% rename from src/Chapter09/Listing09.12.DefiningAnEnum.cs rename to src/Chapter09/Listing09.14.DefiningAnEnum.cs index e54335924..534de7f7e 100644 --- a/src/Chapter09/Listing09.12.DefiningAnEnum.cs +++ b/src/Chapter09/Listing09.14.DefiningAnEnum.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_12; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_14; #region INCLUDE enum ConnectionState diff --git a/src/Chapter09/Listing09.13.DefiningAnEnumType.cs b/src/Chapter09/Listing09.15.DefiningAnEnumType.cs similarity index 95% rename from src/Chapter09/Listing09.13.DefiningAnEnumType.cs rename to src/Chapter09/Listing09.15.DefiningAnEnumType.cs index 11da1bf66..5d4929bf9 100644 --- a/src/Chapter09/Listing09.13.DefiningAnEnumType.cs +++ b/src/Chapter09/Listing09.15.DefiningAnEnumType.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_13; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15; #region INCLUDE enum ConnectionState : short diff --git a/src/Chapter09/Listing09.14.CastingBetweenArraysOfEnums.cs b/src/Chapter09/Listing09.16.CastingBetweenArraysOfEnums.cs similarity index 98% rename from src/Chapter09/Listing09.14.CastingBetweenArraysOfEnums.cs rename to src/Chapter09/Listing09.16.CastingBetweenArraysOfEnums.cs index 5af48f0eb..35735a86b 100644 --- a/src/Chapter09/Listing09.14.CastingBetweenArraysOfEnums.cs +++ b/src/Chapter09/Listing09.16.CastingBetweenArraysOfEnums.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_14; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_16; using System; #region INCLUDE diff --git a/src/Chapter09/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.cs b/src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs similarity index 97% rename from src/Chapter09/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.cs rename to src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs index 32a4d7f9c..69d43a4dd 100644 --- a/src/Chapter09/Listing09.15.ConvertingAStringToAnEnumUsingEnum.Parse.cs +++ b/src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_15; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17; using System; using System.Diagnostics; diff --git a/src/Chapter09/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.cs b/src/Chapter09/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs similarity index 97% rename from src/Chapter09/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.cs rename to src/Chapter09/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs index 34a2823cf..f701c79b9 100644 --- a/src/Chapter09/Listing09.16.ConvertingAStringToAnEnumUsingEnum.TryParse.cs +++ b/src/Chapter09/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_16; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18; using System; diff --git a/src/Chapter09/Listing09.17.UsingEnumsAsFlags.cs b/src/Chapter09/Listing09.19.UsingEnumsAsFlags.cs similarity index 98% rename from src/Chapter09/Listing09.17.UsingEnumsAsFlags.cs rename to src/Chapter09/Listing09.19.UsingEnumsAsFlags.cs index 194d5c265..1ef660534 100644 --- a/src/Chapter09/Listing09.17.UsingEnumsAsFlags.cs +++ b/src/Chapter09/Listing09.19.UsingEnumsAsFlags.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_19; using System; diff --git a/src/Chapter09/Listing09.18.UsingBitwiseORandANDWithFlagEnums.cs b/src/Chapter09/Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs similarity index 99% rename from src/Chapter09/Listing09.18.UsingBitwiseORandANDWithFlagEnums.cs rename to src/Chapter09/Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs index c6c32ba26..7be3e6de0 100644 --- a/src/Chapter09/Listing09.18.UsingBitwiseORandANDWithFlagEnums.cs +++ b/src/Chapter09/Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20; #region INCLUDE using System; diff --git a/src/Chapter09/Listing09.19.DefiningEnumValuesforFrequentCombinations.cs b/src/Chapter09/Listing09.21.DefiningEnumValuesforFrequentCombinations.cs similarity index 97% rename from src/Chapter09/Listing09.19.DefiningEnumValuesforFrequentCombinations.cs rename to src/Chapter09/Listing09.21.DefiningEnumValuesforFrequentCombinations.cs index abaa7d401..a55337dc9 100644 --- a/src/Chapter09/Listing09.19.DefiningEnumValuesforFrequentCombinations.cs +++ b/src/Chapter09/Listing09.21.DefiningEnumValuesforFrequentCombinations.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_19; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_21; using System; #region INCLUDE diff --git a/src/Chapter09/Listing09.20.UsingFlagsAttribute.cs b/src/Chapter09/Listing09.22.UsingFlagsAttribute.cs similarity index 99% rename from src/Chapter09/Listing09.20.UsingFlagsAttribute.cs rename to src/Chapter09/Listing09.22.UsingFlagsAttribute.cs index c5ad5f947..20031e0ab 100644 --- a/src/Chapter09/Listing09.20.UsingFlagsAttribute.cs +++ b/src/Chapter09/Listing09.22.UsingFlagsAttribute.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_22; #region INCLUDE //FileAttributes are defined in System.IO From 4f639a78d456000e5f8c870796af88af7149291d Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Sun, 5 Feb 2023 17:47:54 -0800 Subject: [PATCH 13/17] Remove Listing 9.17 and Renumber --- ...ertingAStringToAnEnumUsingEnum.Parse.Tests.cs | 14 -------------- ...ngAStringToAnEnumUsingEnum.TryParse.Tests.cs} | 2 +- ...9.UsingBitwiseORandANDWithFlagEnums.Tests.cs} | 2 +- ...=> Listing09.21.UsingFlagsAttribute.Tests.cs} | 2 +- ...7.ConvertingAStringToAnEnumUsingEnum.Parse.cs | 16 ---------------- ...nvertingAStringToAnEnumUsingEnum.TryParse.cs} | 2 +- ...lags.cs => Listing09.18.UsingEnumsAsFlags.cs} | 2 +- ...ng09.19.UsingBitwiseORandANDWithFlagEnums.cs} | 2 +- ...DefiningEnumValuesforFrequentCombinations.cs} | 2 +- ...te.cs => Listing09.21.UsingFlagsAttribute.cs} | 2 +- 10 files changed, 8 insertions(+), 38 deletions(-) delete mode 100644 src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs rename src/Chapter09.Tests/{Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs => Listing09.17.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs} (95%) rename src/Chapter09.Tests/{Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs => Listing09.19.UsingBitwiseORandANDWithFlagEnums.Tests.cs} (98%) rename src/Chapter09.Tests/{Listing09.22.UsingFlagsAttribute.Tests.cs => Listing09.21.UsingFlagsAttribute.Tests.cs} (97%) delete mode 100644 src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs rename src/Chapter09/{Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs => Listing09.17.ConvertingAStringToAnEnumUsingEnum.TryParse.cs} (97%) rename src/Chapter09/{Listing09.19.UsingEnumsAsFlags.cs => Listing09.18.UsingEnumsAsFlags.cs} (98%) rename src/Chapter09/{Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs => Listing09.19.UsingBitwiseORandANDWithFlagEnums.cs} (99%) rename src/Chapter09/{Listing09.21.DefiningEnumValuesforFrequentCombinations.cs => Listing09.20.DefiningEnumValuesforFrequentCombinations.cs} (97%) rename src/Chapter09/{Listing09.22.UsingFlagsAttribute.cs => Listing09.21.UsingFlagsAttribute.cs} (99%) diff --git a/src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs b/src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs deleted file mode 100644 index 20a893a3d..000000000 --- a/src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.Tests.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17.Tests; - -[TestClass] -public class ProgramTests -{ - [TestMethod] - public void Main_CastThreadLevelPriorityEnumToString() - { - const string expected = "Idle"; - - IntelliTect.TestTools.Console.ConsoleAssert.Expect( - expected, Program.Main); - } -} diff --git a/src/Chapter09.Tests/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs b/src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs similarity index 95% rename from src/Chapter09.Tests/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs rename to src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs index 682843b4d..822353290 100644 --- a/src/Chapter09.Tests/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs +++ b/src/Chapter09.Tests/Listing09.17.ConvertingAStringToAnEnumUsingEnum.TryParse.Tests.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs b/src/Chapter09.Tests/Listing09.19.UsingBitwiseORandANDWithFlagEnums.Tests.cs similarity index 98% rename from src/Chapter09.Tests/Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs rename to src/Chapter09.Tests/Listing09.19.UsingBitwiseORandANDWithFlagEnums.Tests.cs index 85f64e435..7b36235f4 100644 --- a/src/Chapter09.Tests/Listing09.20.UsingBitwiseORandANDWithFlagEnums.Tests.cs +++ b/src/Chapter09.Tests/Listing09.19.UsingBitwiseORandANDWithFlagEnums.Tests.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_19.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09.Tests/Listing09.22.UsingFlagsAttribute.Tests.cs b/src/Chapter09.Tests/Listing09.21.UsingFlagsAttribute.Tests.cs similarity index 97% rename from src/Chapter09.Tests/Listing09.22.UsingFlagsAttribute.Tests.cs rename to src/Chapter09.Tests/Listing09.21.UsingFlagsAttribute.Tests.cs index d403ecc49..a1e2e7d7c 100644 --- a/src/Chapter09.Tests/Listing09.22.UsingFlagsAttribute.Tests.cs +++ b/src/Chapter09.Tests/Listing09.21.UsingFlagsAttribute.Tests.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_22.Tests; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_21.Tests; [TestClass] public class ProgramTests diff --git a/src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs b/src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs deleted file mode 100644 index 69d43a4dd..000000000 --- a/src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.Parse.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17; - -using System; -using System.Diagnostics; - -public class Program -{ - public static void Main() - { - #region INCLUDE - ThreadPriorityLevel priority = (ThreadPriorityLevel)Enum.Parse( - typeof(ThreadPriorityLevel), "Idle"); - Console.WriteLine(priority); - #endregion INCLUDE - } -} diff --git a/src/Chapter09/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs b/src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.TryParse.cs similarity index 97% rename from src/Chapter09/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs rename to src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.TryParse.cs index f701c79b9..9a7ab2ade 100644 --- a/src/Chapter09/Listing09.18.ConvertingAStringToAnEnumUsingEnum.TryParse.cs +++ b/src/Chapter09/Listing09.17.ConvertingAStringToAnEnumUsingEnum.TryParse.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_17; using System; diff --git a/src/Chapter09/Listing09.19.UsingEnumsAsFlags.cs b/src/Chapter09/Listing09.18.UsingEnumsAsFlags.cs similarity index 98% rename from src/Chapter09/Listing09.19.UsingEnumsAsFlags.cs rename to src/Chapter09/Listing09.18.UsingEnumsAsFlags.cs index 1ef660534..c2646ceed 100644 --- a/src/Chapter09/Listing09.19.UsingEnumsAsFlags.cs +++ b/src/Chapter09/Listing09.18.UsingEnumsAsFlags.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_19; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_18; using System; diff --git a/src/Chapter09/Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs b/src/Chapter09/Listing09.19.UsingBitwiseORandANDWithFlagEnums.cs similarity index 99% rename from src/Chapter09/Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs rename to src/Chapter09/Listing09.19.UsingBitwiseORandANDWithFlagEnums.cs index 7be3e6de0..bc144943d 100644 --- a/src/Chapter09/Listing09.20.UsingBitwiseORandANDWithFlagEnums.cs +++ b/src/Chapter09/Listing09.19.UsingBitwiseORandANDWithFlagEnums.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_19; #region INCLUDE using System; diff --git a/src/Chapter09/Listing09.21.DefiningEnumValuesforFrequentCombinations.cs b/src/Chapter09/Listing09.20.DefiningEnumValuesforFrequentCombinations.cs similarity index 97% rename from src/Chapter09/Listing09.21.DefiningEnumValuesforFrequentCombinations.cs rename to src/Chapter09/Listing09.20.DefiningEnumValuesforFrequentCombinations.cs index a55337dc9..6b9b1bec6 100644 --- a/src/Chapter09/Listing09.21.DefiningEnumValuesforFrequentCombinations.cs +++ b/src/Chapter09/Listing09.20.DefiningEnumValuesforFrequentCombinations.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_21; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_20; using System; #region INCLUDE diff --git a/src/Chapter09/Listing09.22.UsingFlagsAttribute.cs b/src/Chapter09/Listing09.21.UsingFlagsAttribute.cs similarity index 99% rename from src/Chapter09/Listing09.22.UsingFlagsAttribute.cs rename to src/Chapter09/Listing09.21.UsingFlagsAttribute.cs index 20031e0ab..e6bf384b0 100644 --- a/src/Chapter09/Listing09.22.UsingFlagsAttribute.cs +++ b/src/Chapter09/Listing09.21.UsingFlagsAttribute.cs @@ -1,4 +1,4 @@ -namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_22; +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_21; #region INCLUDE //FileAttributes are defined in System.IO From edc383dc60ca3b778c52d47aba8a823b3a6767c3 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Sun, 5 Feb 2023 17:48:40 -0800 Subject: [PATCH 14/17] Added tests for changing hashcodes on value types --- ...Listing09.04.DeclaringRecordClass.Tests.cs | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs index 6c94b042c..e9a9b3b7d 100644 --- a/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs +++ b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs @@ -35,16 +35,47 @@ public void EqualityContract_GetType() Assert.AreNotEqual(coordinate1.GetType(), coordinate2.GetType()); } - record struct SampleStruct(int A, int B); + record struct SampleStruct(int A, int B) + { + int C { get; set; } + } [TestMethod] public void GetHashCode_ChangeData_GetHashCodeChanges() { - Coordinate coordinate = new( - new Angle(180, 0, 0), new Angle(180, 0, 0)); - int hashCode1 = coordinate.GetHashCode(); + SampleStruct sample1 = new(1, 2); + int expected = sample1.GetHashCode(); + sample1.A = 3; + Assert.AreNotEqual(expected, sample1.GetHashCode()); } + + [TestMethod] + public void GetHashCode_StoredInDictionary_NotFoundWhenChanged() + { + SampleStruct sample = new(1, 2); + Dictionary dictionary = new() { { sample, "" } }; + sample.A = 3; + Assert.IsFalse(dictionary.ContainsKey(sample)); + } + + + [TestMethod] + public void GetHashCode_OnTuplesStoredInDictionary_NotFoundWhenChanged() + { + (int A, int B) tuple = new(1, 2); + Dictionary<(int A, int B), string> dictionary = new() { { tuple, "" } }; + tuple.A = 3; + Assert.IsFalse(dictionary.ContainsKey(tuple)); + } + + [TestMethod] + public void ToString_GivenAdditionalProperty_IgnoredInOutput() + { + SampleStruct sampleStruct = new(1, 2); + Assert.AreEqual("SampleStruct { A = 1, B = 2 }", sampleStruct.ToString()); + } + [TestMethod] public void With_Instance_Equivalent() { From 051a2955ddb4e9c6b69fb328125367533172ea20 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Sun, 5 Feb 2023 20:58:55 -0800 Subject: [PATCH 15/17] Remove Microsoft.VisualStudio.TestTools.UnitTesting from ChapterTests.props --- src/Chapter09.Tests/GlobalUsing.cs | 1 + src/ChapterTests.props | 2 +- src/Shared/CompilerAssert.cs | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 src/Chapter09.Tests/GlobalUsing.cs diff --git a/src/Chapter09.Tests/GlobalUsing.cs b/src/Chapter09.Tests/GlobalUsing.cs new file mode 100644 index 000000000..057ac5d09 --- /dev/null +++ b/src/Chapter09.Tests/GlobalUsing.cs @@ -0,0 +1 @@ +global using Microsoft.VisualStudio.TestTools.UnitTesting; \ No newline at end of file diff --git a/src/ChapterTests.props b/src/ChapterTests.props index c76851570..6b2c03dea 100644 --- a/src/ChapterTests.props +++ b/src/ChapterTests.props @@ -19,7 +19,7 @@ - + diff --git a/src/Shared/CompilerAssert.cs b/src/Shared/CompilerAssert.cs index be62e568d..17e1575df 100644 --- a/src/Shared/CompilerAssert.cs +++ b/src/Shared/CompilerAssert.cs @@ -5,6 +5,7 @@ using Microsoft.CodeAnalysis.Scripting; using System.Globalization; using System.Diagnostics; +using Microsoft.VisualStudio.TestTools.UnitTesting; namespace AddisonWesley.Michaelis.EssentialCSharp.Shared; From 2cfaf415b61e0d8a7eb71607cdec112d8571b345 Mon Sep 17 00:00:00 2001 From: Mark Michaelis Date: Sun, 5 Feb 2023 21:15:21 -0800 Subject: [PATCH 16/17] Removed incomplete tests --- .../Listing09.04.DeclaringRecordClass.Tests.cs | 7 ------- .../Listing09.08.CustomizingARecord.Tests.cs | 3 --- ....01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs | 3 +++ 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs index e9a9b3b7d..71344a376 100644 --- a/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs +++ b/src/Chapter09.Tests/Listing09.04.DeclaringRecordClass.Tests.cs @@ -6,13 +6,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_04.Tests; [TestClass] public partial class CoordinateTests { - [TestMethod] - public void Create_Coordinate_IsReadOnly() - { - _ = new Coordinate( - new Angle(180, 0, 0), new Angle(180, 0, 0)); - } - [TestMethod] public void With_Coordinate_IsReadOnly() { diff --git a/src/Chapter09.Tests/Listing09.08.CustomizingARecord.Tests.cs b/src/Chapter09.Tests/Listing09.08.CustomizingARecord.Tests.cs index 3ab07263e..8cdeb5564 100644 --- a/src/Chapter09.Tests/Listing09.08.CustomizingARecord.Tests.cs +++ b/src/Chapter09.Tests/Listing09.08.CustomizingARecord.Tests.cs @@ -3,9 +3,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_08.Tests; [TestClass] public class AngleTests { - [TestMethod] - public void Title_Null_ThrowsArgumentNullException() => _ = new Angle(0,0,0); - [TestMethod] public void ToString_90Degrees_90DegreesFormatted() { diff --git a/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs b/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs index 6d1c0e119..8831bf7eb 100644 --- a/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs +++ b/src/Chapter10.Tests/Listing10.01.ImplementingTheEqualsAndNotEqualsOperators.Tests.cs @@ -28,6 +28,7 @@ public void NotEquals_GivenDifferentObjects_NotEqual(string productSeries1, int } [TestMethod] + [Ignore("Switch to use records")] public void Equals_GivenNull_NotEqual() { ProductSerialNumber productSerialNumber1 = new("12", 11, 11001); @@ -38,6 +39,7 @@ public void Equals_GivenNull_NotEqual() } [TestMethod] + [Ignore("Switch to use records")] public void Equals_GivenSameReference_Equal() { ProductSerialNumber productSerialNumber1 = new("12", 11, 11001); @@ -47,6 +49,7 @@ public void Equals_GivenSameReference_Equal() } [TestMethod] + [Ignore("Switch to use records")] public void Equals_GivenDifferentTypes_NotEqual() { ProductSerialNumber productSerialNumber1 = new("12", 11, 11001); From 0b15929554c9b792b5c3a81a74e8a591a285ec8b Mon Sep 17 00:00:00 2001 From: Kevin Bost Date: Mon, 6 Feb 2023 00:43:59 -0800 Subject: [PATCH 17/17] Removing un-needed test --- .../Listing09.05.EquivalentRecordClassCode.Tests.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs b/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs index 73e2fdd2d..c626ba241 100644 --- a/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs +++ b/src/Chapter09.Tests/Listing09.05.EquivalentRecordClassCode.Tests.cs @@ -6,13 +6,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter09.Listing09_05.Tests; [TestClass] public class CoordinateTests { - [TestMethod] - public void Create_Coordinate_IsReadOnly() - { - _ = new Coordinate( - new Angle(180, 0, 0), new Angle(180, 0, 0)); - } - [TestMethod] public void With_Coordinate_IsReadOnly() {