From 69332c4f2485b40a7fcc394341099c2cf026fde9 Mon Sep 17 00:00:00 2001 From: Benjamin Michaelis Date: Thu, 14 Apr 2022 15:41:52 -0700 Subject: [PATCH 1/2] Add regions to chapter 7 --- ...isting07.01.DerivingOneClassFromAnother.cs | 5 +++- .../Listing07.02.UsingInheritedMethods.cs | 5 ++++ ...ngFromEachOtherToFormAnInheritanceChain.cs | 2 ++ .../Listing07.04.ImplicitBaseTypeCasting.cs | 6 +++++ .../Listing07.05.DefiningCastOperators.cs | 5 +++- ...ting07.06.PrivateMembersAreNotInherited.cs | 20 +++++++++----- ...bersAreAccessibleOnlyFromDerivedClasses.cs | 18 ++++++++++--- ...8.PreventingDerivationWithSealedClasses.cs | 2 ++ .../Listing07.09.OverridingAProperty.cs | 6 +++++ ...stDerivedImplementationOfAVirtualMethod.cs | 2 ++ .../Listing07.11.OverrideVersusNewModifier.cs | 3 ++- src/Chapter07/Listing07.12.SealingMembers.cs | 2 ++ .../Listing07.13.AccessingABaseMember.cs | 13 +++------ ....SpecifyingWhichBaseConstructorToInvoke.cs | 27 ++++++++++++++++--- .../Listing07.15.DefiningAnAbstractClass.cs | 9 +++++-- .../Listing07.16.DefiningAbstractMembers.cs | 17 ++++++++++-- ...7.17.UsingPolymorphismToListThePdaItems.cs | 2 ++ ...edWhenNoDerivationIsSpecifiedExplicitly.cs | 8 ++++++ ....IsOperatorDeterminingTheUnderlyingType.cs | 10 +++++-- .../Listing07.20.TuplePatternMatching.cs | 13 ++++++--- .../Listing07.21.PositionalPatternMatching.cs | 11 +++++++- .../Listing07.22.PropertyPatternMatching.cs | 4 +++ .../Listing07.23.RecursivePatternMatching.cs | 11 +++++++- 23 files changed, 164 insertions(+), 37 deletions(-) diff --git a/src/Chapter07/Listing07.01.DerivingOneClassFromAnother.cs b/src/Chapter07/Listing07.01.DerivingOneClassFromAnother.cs index 5af1dc554..9c1c67216 100644 --- a/src/Chapter07/Listing07.01.DerivingOneClassFromAnother.cs +++ b/src/Chapter07/Listing07.01.DerivingOneClassFromAnother.cs @@ -3,17 +3,20 @@ using System; using System.Diagnostics.CodeAnalysis; + #region INCLUDE public class PdaItem { [DisallowNull] public string? Name { get; set; } public DateTime LastUpdated { get; set; } } - // Define the Contact class as inheriting the PdaItem class + #region HIGHLIGHT public class Contact : PdaItem + #endregion { public string? Address { get; set; } public string? Phone { get; set; } } + #endregion } diff --git a/src/Chapter07/Listing07.02.UsingInheritedMethods.cs b/src/Chapter07/Listing07.02.UsingInheritedMethods.cs index 5ccf05c83..bd1bd1372 100644 --- a/src/Chapter07/Listing07.02.UsingInheritedMethods.cs +++ b/src/Chapter07/Listing07.02.UsingInheritedMethods.cs @@ -2,13 +2,18 @@ { using Listing07_01; + #region INCLUDE public class Program { public static void Main() { Contact contact = new Contact(); + #region HIGHLIGHT contact.Name = "Inigo Montoya"; + #endregion + // ... } } + #endregion } diff --git a/src/Chapter07/Listing07.03.ClassesDerivingFromEachOtherToFormAnInheritanceChain.cs b/src/Chapter07/Listing07.03.ClassesDerivingFromEachOtherToFormAnInheritanceChain.cs index 811ed56ea..7620436fd 100644 --- a/src/Chapter07/Listing07.03.ClassesDerivingFromEachOtherToFormAnInheritanceChain.cs +++ b/src/Chapter07/Listing07.03.ClassesDerivingFromEachOtherToFormAnInheritanceChain.cs @@ -1,5 +1,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_03 { + #region INCLUDE public class PdaItem : object { // ... @@ -16,4 +17,5 @@ public class Customer : Contact { // ... } + #endregion } diff --git a/src/Chapter07/Listing07.04.ImplicitBaseTypeCasting.cs b/src/Chapter07/Listing07.04.ImplicitBaseTypeCasting.cs index 2ef734b38..8e8595772 100644 --- a/src/Chapter07/Listing07.04.ImplicitBaseTypeCasting.cs +++ b/src/Chapter07/Listing07.04.ImplicitBaseTypeCasting.cs @@ -2,6 +2,7 @@ { using Listing07_03; + #region INCLUDE public class Program { public static void Main() @@ -9,12 +10,17 @@ public static void Main() // Derived types can be implicitly converted to // base types Contact contact = new Contact(); + #region HIGHLIGHT PdaItem item = contact; + #endregion // ... // Base types must be cast explicitly to derived types + #region HIGHLIGHT contact = (Contact)item; + #endregion // ... } } + #endregion } diff --git a/src/Chapter07/Listing07.05.DefiningCastOperators.cs b/src/Chapter07/Listing07.05.DefiningCastOperators.cs index 4ee40c345..efeeff212 100644 --- a/src/Chapter07/Listing07.05.DefiningCastOperators.cs +++ b/src/Chapter07/Listing07.05.DefiningCastOperators.cs @@ -2,6 +2,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_05 { + #region INCLUDE class GPSCoordinates { // ... @@ -9,10 +10,12 @@ class GPSCoordinates public static implicit operator UTMCoordinates( GPSCoordinates coordinates) { - // ... + #region EXCLUDE return null!; //return the new UTMCoordinates object + #endregion } } + #endregion class UTMCoordinates { diff --git a/src/Chapter07/Listing07.06.PrivateMembersAreNotInherited.cs b/src/Chapter07/Listing07.06.PrivateMembersAreNotInherited.cs index b67476a63..b0a26ccf3 100644 --- a/src/Chapter07/Listing07.06.PrivateMembersAreNotInherited.cs +++ b/src/Chapter07/Listing07.06.PrivateMembersAreNotInherited.cs @@ -5,13 +5,14 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_06 { - + #region INCLUDE public class PdaItem { -// Justification: Disabled pending constructor -#pragma warning disable CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable. + #region EXCLUDE + // Justification: Disabled pending constructor + #pragma warning disable CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable. + #endregion private string _Name; -#pragma warning restore CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable. public string Name { @@ -19,7 +20,9 @@ public string Name set { _Name = value; } } - // ... + #region EXCLUDE + #pragma warning restore CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable. + #endregion } public class Contact : PdaItem @@ -32,9 +35,12 @@ public class Program public static void Main() { Contact contact = new Contact(); - + #region HIGHLIGHT // ERROR: 'PdaItem._Name' is inaccessible - // contact._Name = "Inigo Montoya"; //uncomment this line and it will not compile + // due to its protection level + // contact._Name = "Inigo Montoya"; + #endregion } } + #endregion } diff --git a/src/Chapter07/Listing07.07.ProtectedMembersAreAccessibleOnlyFromDerivedClasses.cs b/src/Chapter07/Listing07.07.ProtectedMembersAreAccessibleOnlyFromDerivedClasses.cs index 11affcc10..06f3571da 100644 --- a/src/Chapter07/Listing07.07.ProtectedMembersAreAccessibleOnlyFromDerivedClasses.cs +++ b/src/Chapter07/Listing07.07.ProtectedMembersAreAccessibleOnlyFromDerivedClasses.cs @@ -4,12 +4,15 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_07 { using System; + #region INCLUDE using System.IO; public class PdaItem { public PdaItem(Guid objectKey) => ObjectKey = objectKey; + #region HIGHLIGHT protected Guid ObjectKey { get; } + #endregion } public class Contact : PdaItem @@ -21,17 +24,23 @@ public void Save() { // Instantiate a FileStream using .dat // for the filename + #region HIGHLIGHT using FileStream stream = File.OpenWrite( ObjectKey + ".dat"); + #endregion // ... stream.Dispose(); } static public Contact Copy(Contact contact) + #region HIGHLIGHT => new Contact(contact.ObjectKey); + #endregion - // static public Contact Copy(PdaItem pdaItem) => - // Error: Cannot access protected member PdaItem.ObjectKey. - // new Contact(((Contact)pdaItem).ObjectKey); + // static public Contact Copy(PdaItem pdaItem) => + #region HIGHLIGHT + // Error: Cannot access protected member PdaItem.ObjectKey. + // new Contact(((Contact)pdaItem).ObjectKey); + #endregion } public class Program @@ -40,8 +49,11 @@ public static void Main() { Contact contact = new Contact(Guid.NewGuid()); + #region HIGHLIGHT // ERROR: 'PdaItem.ObjectKey' is inaccessible // Console.WriteLine(contact.ObjectKey); + #endregion } } + #endregion } diff --git a/src/Chapter07/Listing07.08.PreventingDerivationWithSealedClasses.cs b/src/Chapter07/Listing07.08.PreventingDerivationWithSealedClasses.cs index 64ebd7f0c..f3c23ca4e 100644 --- a/src/Chapter07/Listing07.08.PreventingDerivationWithSealedClasses.cs +++ b/src/Chapter07/Listing07.08.PreventingDerivationWithSealedClasses.cs @@ -1,5 +1,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_08 { + #region INCLUDE public sealed class CommandLineParser { // ... @@ -10,4 +11,5 @@ public sealed class DerivedCommandLineParser { // ... } + #endregion } diff --git a/src/Chapter07/Listing07.09.OverridingAProperty.cs b/src/Chapter07/Listing07.09.OverridingAProperty.cs index 3cd256090..9eff2d94c 100644 --- a/src/Chapter07/Listing07.09.OverridingAProperty.cs +++ b/src/Chapter07/Listing07.09.OverridingAProperty.cs @@ -3,15 +3,20 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_09 { + #region INCLUDE public class PdaItem { + #region HIGHLIGHT public virtual string Name { get; set; } + #endregion // ... } public class Contact : PdaItem { + #region HIGHLIGHT public override string Name + #endregion { get { @@ -32,4 +37,5 @@ public override string Name // ... } + #endregion } diff --git a/src/Chapter07/Listing07.10.RuntimeCallingTheMostDerivedImplementationOfAVirtualMethod.cs b/src/Chapter07/Listing07.10.RuntimeCallingTheMostDerivedImplementationOfAVirtualMethod.cs index 4b512b603..389740001 100644 --- a/src/Chapter07/Listing07.10.RuntimeCallingTheMostDerivedImplementationOfAVirtualMethod.cs +++ b/src/Chapter07/Listing07.10.RuntimeCallingTheMostDerivedImplementationOfAVirtualMethod.cs @@ -3,6 +3,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_10 using System; using Listing07_09; + #region INCLUDE public class Program { public static void Main() @@ -22,4 +23,5 @@ public static void Main() $"{ contact.FirstName } { contact.LastName}"); } } + #endregion } diff --git a/src/Chapter07/Listing07.11.OverrideVersusNewModifier.cs b/src/Chapter07/Listing07.11.OverrideVersusNewModifier.cs index 735fa77eb..87e5a8316 100644 --- a/src/Chapter07/Listing07.11.OverrideVersusNewModifier.cs +++ b/src/Chapter07/Listing07.11.OverrideVersusNewModifier.cs @@ -1,8 +1,8 @@ -// TODO: Update listing in Manuscript namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_11 { using System; + #region INCLUDE public class Program { public class BaseClass @@ -54,4 +54,5 @@ SuperSubDerivedClass superSubDerivedClass BaseClass.DisplayName(); } } + #endregion } diff --git a/src/Chapter07/Listing07.12.SealingMembers.cs b/src/Chapter07/Listing07.12.SealingMembers.cs index 976b212c5..7c807743a 100644 --- a/src/Chapter07/Listing07.12.SealingMembers.cs +++ b/src/Chapter07/Listing07.12.SealingMembers.cs @@ -1,5 +1,6 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_12 { + #region INCLUDE class A { public virtual void Method() @@ -21,4 +22,5 @@ class C : B //{ //} } + #endregion } diff --git a/src/Chapter07/Listing07.13.AccessingABaseMember.cs b/src/Chapter07/Listing07.13.AccessingABaseMember.cs index c85d219b5..632e941d9 100644 --- a/src/Chapter07/Listing07.13.AccessingABaseMember.cs +++ b/src/Chapter07/Listing07.13.AccessingABaseMember.cs @@ -3,19 +3,11 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_13 { + #region INCLUDE using static System.Environment; public class Address { - //public Address(string streetAddress, string city, - // string state, string zip) - //{ - // StreetAddress = streetAddress; - // City = city; - // State = state; - // Zip = zip; - //} - public string StreetAddress; public string City; public string State; @@ -34,8 +26,11 @@ public class InternationalAddress : Address public override string ToString() { + #region HIGHLIGHT return base.ToString() + + #endregion NewLine + Country; } } + #endregion } diff --git a/src/Chapter07/Listing07.14.SpecifyingWhichBaseConstructorToInvoke.cs b/src/Chapter07/Listing07.14.SpecifyingWhichBaseConstructorToInvoke.cs index d0f98ba44..3925a4ed5 100644 --- a/src/Chapter07/Listing07.14.SpecifyingWhichBaseConstructorToInvoke.cs +++ b/src/Chapter07/Listing07.14.SpecifyingWhichBaseConstructorToInvoke.cs @@ -1,24 +1,26 @@ +using System; using System.Diagnostics.CodeAnalysis; namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_14 { + #region INCLUDE public class PdaItem { public PdaItem(string name) { Name = name; } - - // ... - public virtual string Name { get; set; } + // ... } public class Contact : PdaItem { // Disable warning since FirstName&LastName set via Name property #pragma warning disable CS8618 // Non-nullable field is uninitialized. + #region HIGHLIGHT public Contact(string name) : base(name) + #endregion { } #pragma warning restore CS8618 @@ -46,4 +48,23 @@ [NotNull] [DisallowNull] // ... } + + public class Appointment : PdaItem + { + public Appointment(string name, + string location, DateTime startDateTime, DateTime endDateTime) : + base(name) + { + Location = location; + StartDateTime = startDateTime; + EndDateTime = endDateTime; + } + + public DateTime StartDateTime { get; set; } + public DateTime EndDateTime { get; set; } + public string Location { get; set; } + + // ... + } + #endregion } diff --git a/src/Chapter07/Listing07.15.DefiningAnAbstractClass.cs b/src/Chapter07/Listing07.15.DefiningAnAbstractClass.cs index 9553ff120..fc23a5a3d 100644 --- a/src/Chapter07/Listing07.15.DefiningAnAbstractClass.cs +++ b/src/Chapter07/Listing07.15.DefiningAnAbstractClass.cs @@ -1,8 +1,12 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_15 { -// With a concrete implementation we could use our PdaItem object + // With a concrete implementation we could use our PdaItem object #pragma warning disable CS0168 + #region INCLUDE + // Define an abstract class + #region HIGHLIGHT public abstract class PdaItem + #endregion { public PdaItem(string name) { @@ -18,8 +22,9 @@ public static void Main() { PdaItem item; // ERROR: Cannot create an instance of the abstract class - //item = new PdaItem("Inigo Montoya"); //uncomment this line and it will not compile + // item = new PdaItem("Inigo Montoya"); } } + #endregion #pragma warning restore CS0168 } diff --git a/src/Chapter07/Listing07.16.DefiningAbstractMembers.cs b/src/Chapter07/Listing07.16.DefiningAbstractMembers.cs index ae7426698..ae79af469 100644 --- a/src/Chapter07/Listing07.16.DefiningAbstractMembers.cs +++ b/src/Chapter07/Listing07.16.DefiningAbstractMembers.cs @@ -1,6 +1,8 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_16 { using System; + + #region INCLUDE using static System.Environment; // Define an abstract class @@ -12,14 +14,18 @@ public PdaItem(string name) } public virtual string Name { get; set; } + #region HIGHLIGHT public abstract string GetSummary(); + #endregion } public class Contact : PdaItem { + #region EXCLUDE public Contact(string name) : base(name) { } + #endregion public override string Name { @@ -37,6 +43,7 @@ public override string Name } } + #region HIGHLIGHT public string FirstName { get @@ -45,11 +52,14 @@ public string FirstName } set { - _FirstName = value ?? throw new ArgumentNullException(nameof(value)); ; + _FirstName = value ?? + throw new ArgumentNullException(nameof(value)); ; } } private string? _FirstName; + #endregion + #region HIGHLIGHT public string LastName { get @@ -62,15 +72,17 @@ public string LastName } } private string? _LastName; - + #endregion public string? Address { get; set; } + #region HIGHLIGHT public override string GetSummary() { return $"FirstName: { FirstName + NewLine }" + $"LastName: { LastName + NewLine }" + $"Address: { Address + NewLine }"; } + #endregion // ... } @@ -99,4 +111,5 @@ public override string GetSummary() + $"Location: { Location }"; } } + #endregion } diff --git a/src/Chapter07/Listing07.17.UsingPolymorphismToListThePdaItems.cs b/src/Chapter07/Listing07.17.UsingPolymorphismToListThePdaItems.cs index 8d3fd72ea..a8a65c5b7 100644 --- a/src/Chapter07/Listing07.17.UsingPolymorphismToListThePdaItems.cs +++ b/src/Chapter07/Listing07.17.UsingPolymorphismToListThePdaItems.cs @@ -3,6 +3,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_17 using System; using Listing07_16; + #region INCLUDE public class Program { public static void Main() @@ -42,4 +43,5 @@ public static void List(PdaItem[] items) } } } + #endregion } diff --git a/src/Chapter07/Listing07.18.System.ObjectDerivationImpliedWhenNoDerivationIsSpecifiedExplicitly.cs b/src/Chapter07/Listing07.18.System.ObjectDerivationImpliedWhenNoDerivationIsSpecifiedExplicitly.cs index 41196bbc6..0a6363dc0 100644 --- a/src/Chapter07/Listing07.18.System.ObjectDerivationImpliedWhenNoDerivationIsSpecifiedExplicitly.cs +++ b/src/Chapter07/Listing07.18.System.ObjectDerivationImpliedWhenNoDerivationIsSpecifiedExplicitly.cs @@ -1,7 +1,15 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_18 { + /* + #region INCLUDE + public class PdaItem + { + // ... + } public class PdaItem : object { // ... } + #endregion + */ } diff --git a/src/Chapter07/Listing07.19.IsOperatorDeterminingTheUnderlyingType.cs b/src/Chapter07/Listing07.19.IsOperatorDeterminingTheUnderlyingType.cs index 6a44b9cc5..056fc1c2c 100644 --- a/src/Chapter07/Listing07.19.IsOperatorDeterminingTheUnderlyingType.cs +++ b/src/Chapter07/Listing07.19.IsOperatorDeterminingTheUnderlyingType.cs @@ -4,6 +4,7 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_19 { public class Program { + #region INCLUDE public static void Save(object data) { @@ -16,10 +17,15 @@ public static void Save(object data) // ... } } - // ... - + else if (data is null) + { + // ... + } + #region EXCLUDE Console.WriteLine(data); + #endregion } + #endregion public static object Encrypt(string data) { diff --git a/src/Chapter07/Listing07.20.TuplePatternMatching.cs b/src/Chapter07/Listing07.20.TuplePatternMatching.cs index bc4440d3c..1a7e9c913 100644 --- a/src/Chapter07/Listing07.20.TuplePatternMatching.cs +++ b/src/Chapter07/Listing07.20.TuplePatternMatching.cs @@ -4,24 +4,26 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_20 { using System.IO; + #region INCLUDE public class Program { const int Action = 0; const int FileName = 1; - public const string DataFile = "data.dat"; static public void Main(params string[] args) { // ... - - if ((args.Length, args[Action]) is - (1, "show")) + #region HIGHLIGHT + if ((args.Length, args[Action]) is (1, "show")) + #endregion { Console.WriteLine(File.ReadAllText(DataFile)); } + #region HIGHLIGHT else if ((args.Length, args[Action].ToLower(), args[FileName]) is (2, "encrypt", string fileName)) + #endregion { string data = File.ReadAllText(DataFile); File.WriteAllText(fileName, Encrypt(data).ToString()); @@ -29,10 +31,13 @@ static public void Main(params string[] args) // ... } + #region EXCLUDE public static string Encrypt(string data) { // See Chapter 19 for actual encryption implementation return $"ENCRYPTED <{data}> ENCRYPTED"; } + #endregion } + #endregion } diff --git a/src/Chapter07/Listing07.21.PositionalPatternMatching.cs b/src/Chapter07/Listing07.21.PositionalPatternMatching.cs index a80b9bbce..aeb5eff62 100644 --- a/src/Chapter07/Listing07.21.PositionalPatternMatching.cs +++ b/src/Chapter07/Listing07.21.PositionalPatternMatching.cs @@ -2,8 +2,10 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_21 { + #region INCLUDE public class Person { + #region EXCLUDE public Person(string firstName, string lastName) { FirstName = firstName ?? throw new ArgumentNullException(nameof(firstName)); @@ -11,10 +13,14 @@ public Person(string firstName, string lastName) } public string FirstName { get; } public string LastName { get; } + #endregion + #region HIGHLIGHT public void Deconstruct(out string firstName, out string lastName) => (firstName, lastName) = (FirstName, LastName); + #endregion } + public class Program { public static void Main() @@ -22,10 +28,13 @@ public static void Main() Person person = new Person("Inigo", "Montoya"); // Positional Pattern Matching - if(person is (string firstName, string lastName)) + #region HIGHLIGHT + if (person is (string firstName, string lastName)) + #endregion { Console.WriteLine($"{firstName} {lastName}"); } } } + #endregion } diff --git a/src/Chapter07/Listing07.22.PropertyPatternMatching.cs b/src/Chapter07/Listing07.22.PropertyPatternMatching.cs index 6750daec5..2bd3ca871 100644 --- a/src/Chapter07/Listing07.22.PropertyPatternMatching.cs +++ b/src/Chapter07/Listing07.22.PropertyPatternMatching.cs @@ -21,6 +21,8 @@ public class Program { public static void Main() { + #region INCLUDE + // ... Person person = new Person("Inigo", "Montoya"); // Positional pattern matching @@ -28,6 +30,8 @@ public static void Main() { Console.WriteLine($"{firstName} {lastName}"); } + // ... + #endregion } } } diff --git a/src/Chapter07/Listing07.23.RecursivePatternMatching.cs b/src/Chapter07/Listing07.23.RecursivePatternMatching.cs index d082c52d5..985a35246 100644 --- a/src/Chapter07/Listing07.23.RecursivePatternMatching.cs +++ b/src/Chapter07/Listing07.23.RecursivePatternMatching.cs @@ -21,11 +21,14 @@ public class Program { public static void Main() { + #region INCLUDE + // ... Person inigo = new Person("Inigo", "Montoya"); var buttercup = (FirstName: "Princess", LastName: "Buttercup"); - (Person, (string FirstName, string LastName)) couple = (inigo, buttercup); + (Person inigo, (string FirstName, string LastName) buttercup) couple = + (inigo, buttercup); if (couple is ( // Tuple @@ -39,6 +42,12 @@ public static void Main() { Console.WriteLine($"({inigoLength1}, {buttercupFirstName})"); } + else + { + // ... + } + // ... + #endregion } } } From 309eb1aae1fbeb410c4e3e486e1ca0b23f2785ed Mon Sep 17 00:00:00 2001 From: Benjamin Michaelis Date: Thu, 14 Apr 2022 16:11:08 -0700 Subject: [PATCH 2/2] Minor Updates --- .../Listing07.06.PrivateMembersAreNotInherited.cs | 1 - ...ng07.08.PreventingDerivationWithSealedClasses.cs | 2 +- ...g07.14.SpecifyingWhichBaseConstructorToInvoke.cs | 4 ++-- .../Listing07.16.DefiningAbstractMembers.cs | 7 +++---- src/Chapter07/Listing07.20.TuplePatternMatching.cs | 5 ++--- .../Listing07.22.PropertyPatternMatching.cs | 4 +++- .../Listing07.24.SwitchWithPatternMatching.cs | 9 +++++---- ...Listing07.25.DataConversionUsingTheAsOperator.cs | 13 +++++++------ 8 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/Chapter07/Listing07.06.PrivateMembersAreNotInherited.cs b/src/Chapter07/Listing07.06.PrivateMembersAreNotInherited.cs index b0a26ccf3..1cd3b968b 100644 --- a/src/Chapter07/Listing07.06.PrivateMembersAreNotInherited.cs +++ b/src/Chapter07/Listing07.06.PrivateMembersAreNotInherited.cs @@ -19,7 +19,6 @@ public string Name get { return _Name; } set { _Name = value; } } - #region EXCLUDE #pragma warning restore CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable. #endregion diff --git a/src/Chapter07/Listing07.08.PreventingDerivationWithSealedClasses.cs b/src/Chapter07/Listing07.08.PreventingDerivationWithSealedClasses.cs index f3c23ca4e..9737f7c9f 100644 --- a/src/Chapter07/Listing07.08.PreventingDerivationWithSealedClasses.cs +++ b/src/Chapter07/Listing07.08.PreventingDerivationWithSealedClasses.cs @@ -7,7 +7,7 @@ public sealed class CommandLineParser } // ERROR: Sealed classes cannot be derived from public sealed class DerivedCommandLineParser - //: CommandLineParser //uncomment this line and it will not compile + //: CommandLineParser { // ... } diff --git a/src/Chapter07/Listing07.14.SpecifyingWhichBaseConstructorToInvoke.cs b/src/Chapter07/Listing07.14.SpecifyingWhichBaseConstructorToInvoke.cs index 3925a4ed5..ec33a7933 100644 --- a/src/Chapter07/Listing07.14.SpecifyingWhichBaseConstructorToInvoke.cs +++ b/src/Chapter07/Listing07.14.SpecifyingWhichBaseConstructorToInvoke.cs @@ -51,8 +51,8 @@ [NotNull] [DisallowNull] public class Appointment : PdaItem { - public Appointment(string name, - string location, DateTime startDateTime, DateTime endDateTime) : + public Appointment(string name, string location, + DateTime startDateTime, DateTime endDateTime) : base(name) { Location = location; diff --git a/src/Chapter07/Listing07.16.DefiningAbstractMembers.cs b/src/Chapter07/Listing07.16.DefiningAbstractMembers.cs index ae79af469..79f63b138 100644 --- a/src/Chapter07/Listing07.16.DefiningAbstractMembers.cs +++ b/src/Chapter07/Listing07.16.DefiningAbstractMembers.cs @@ -18,6 +18,7 @@ public PdaItem(string name) public abstract string GetSummary(); #endregion } + public class Contact : PdaItem { #region EXCLUDE @@ -26,14 +27,12 @@ public Contact(string name) { } #endregion - public override string Name { get { return $"{ FirstName } { LastName }"; } - set { string[] names = value.Split(' '); @@ -89,8 +88,8 @@ public override string GetSummary() public class Appointment : PdaItem { - public Appointment(string name, - string location, DateTime startDateTime, DateTime endDateTime) : + public Appointment(string name, string location, + DateTime startDateTime, DateTime endDateTime) : base(name) { Location = location; diff --git a/src/Chapter07/Listing07.20.TuplePatternMatching.cs b/src/Chapter07/Listing07.20.TuplePatternMatching.cs index 1a7e9c913..9788e320f 100644 --- a/src/Chapter07/Listing07.20.TuplePatternMatching.cs +++ b/src/Chapter07/Listing07.20.TuplePatternMatching.cs @@ -21,8 +21,8 @@ static public void Main(params string[] args) Console.WriteLine(File.ReadAllText(DataFile)); } #region HIGHLIGHT - else if ((args.Length, args[Action].ToLower(), args[FileName]) is - (2, "encrypt", string fileName)) + else if ((args.Length, args[Action].ToLower(), args[FileName]) + is (2, "encrypt", string fileName)) #endregion { string data = File.ReadAllText(DataFile); @@ -30,7 +30,6 @@ static public void Main(params string[] args) } // ... } - #region EXCLUDE public static string Encrypt(string data) { diff --git a/src/Chapter07/Listing07.22.PropertyPatternMatching.cs b/src/Chapter07/Listing07.22.PropertyPatternMatching.cs index 2bd3ca871..86b400414 100644 --- a/src/Chapter07/Listing07.22.PropertyPatternMatching.cs +++ b/src/Chapter07/Listing07.22.PropertyPatternMatching.cs @@ -26,7 +26,9 @@ public static void Main() Person person = new Person("Inigo", "Montoya"); // Positional pattern matching - if(person is {FirstName: string firstName, LastName: string lastName }) + #region HIGHLIGHT + if (person is {FirstName: string firstName, LastName: string lastName }) + #endregion { Console.WriteLine($"{firstName} {lastName}"); } diff --git a/src/Chapter07/Listing07.24.SwitchWithPatternMatching.cs b/src/Chapter07/Listing07.24.SwitchWithPatternMatching.cs index b507566f5..f2db2a28e 100644 --- a/src/Chapter07/Listing07.24.SwitchWithPatternMatching.cs +++ b/src/Chapter07/Listing07.24.SwitchWithPatternMatching.cs @@ -4,12 +4,12 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_24 { public class Program { + #region INCLUDE public static string? CompositeFormatDate( object input, string compositFormatString) => input switch { - DateTime { Year: int year, Month: int month, Day: int day } tempDate - when tempDate < DateTime.Now + DateTime { Year: int year, Month: int month, Day: int day } => (year, month, day), DateTimeOffset { Year: int year, Month: int month, Day: int day } @@ -17,11 +17,12 @@ when tempDate < DateTime.Now string dateText => DateTime.TryParse( dateText, out DateTime dateTime) ? (dateTime.Year, dateTime.Month, dateTime.Day) : - // default ((int Year, int Month, int Day)?) preferable - // not covered until Chapter 12. + // default ((int Year, int Month, int Day)?) + // preferable but not covered until Chapter 12. ((int Year, int Month, int Day)?)null, _ => null } is { } date ? string.Format( compositFormatString, date.Year, date.Month, date.Day) : null; + #endregion } } diff --git a/src/Chapter07/Listing07.25.DataConversionUsingTheAsOperator.cs b/src/Chapter07/Listing07.25.DataConversionUsingTheAsOperator.cs index e8e7eac01..2843749b3 100644 --- a/src/Chapter07/Listing07.25.DataConversionUsingTheAsOperator.cs +++ b/src/Chapter07/Listing07.25.DataConversionUsingTheAsOperator.cs @@ -2,23 +2,23 @@ namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter07.Listing07_25 { using System; + #region INCLUDE public class PdaItem { protected Guid ObjectKey { get; } - // ... } public class Contact : PdaItem { - + // ... public Contact(string name) => Name = name; static public Contact Load(PdaItem pdaItem) { -#pragma warning disable IDE0019 // Use pattern matching + #pragma warning disable IDE0019 // Use pattern matching Contact? contact = pdaItem as Contact; -#pragma warning restore IDE0019 // Use pattern matching + #pragma warning restore IDE0019 // Use pattern matching if (contact != null) { System.Diagnostics.Trace.WriteLine( @@ -31,8 +31,9 @@ static public Contact Load(PdaItem pdaItem) $"{nameof(pdaItem)} was not of type {nameof(Contact)}"); } } - - // ... + #region EXCLUDE public string Name { get; set; } + #endregion } + #endregion }