static void Main(string[] args) { // bob var bob = new Person(); bob.Name = "Bob Smith"; bob.DateOfBirth = new DateTime(1970, 11, 30); bob.FavouriteAncientWonder = WondersOfTheAncientWorld.StatueOfZeusAtOlympia; bob.BucketList = WondersOfTheAncientWorld.HangingGardensOfBabylon | WondersOfTheAncientWorld.MausoleumAtHalicarnassus; bob.Children.Add(new Person { Name = "Alf" }); bob.Children.Add(new Person { Name = "Zoe" }); WriteLine(); WriteLine("Bob-----------------------------------------"); WriteLine(bob.getOrigin()); bob.WriteToConsole(); WriteLine( format: "{0} was born on {1:dddd, d MMMM yyyy}", arg0: bob.Name, arg1: bob.DateOfBirth ); WriteLine( format: "{0}'s favourite wonder is {1}, it's integer is {2}", arg0: bob.Name, arg1: bob.FavouriteAncientWonder, arg2: (int)bob.FavouriteAncientWonder ); WriteLine($"{bob.Name}'s bucket list is: {bob.BucketList}"); WriteLine($"{bob.Name} has {bob.Children.Count} children"); foreach (Person child in bob.Children) { WriteLine($"child name: {child.Name}"); } WriteLine($"{bob.Name} is a {Person.Species}"); WriteLine($"{bob.Name} is from {bob.HomePlanet}"); WriteLine(); WriteLine("Tuples-----------------------------------------"); (string, int)fruit = bob.GetFruit(); WriteLine($"USING TUPLES: {fruit.Item1}, {fruit.Item2} there are."); var vegetablesNamed = bob.GetVeg(); WriteLine($"USING named TUPLES: {vegetablesNamed.Name}, {vegetablesNamed.Number} there are."); // Deconstructing tuples (string name, int fruitNumber) = bob.GetFruit(); WriteLine($"Deconstructed TUPLE: {name}, {fruitNumber}"); // Inferring tuple names var thing1 = ("Neville", 4); WriteLine($"{thing1.Item1} has {thing1.Item2} children."); var thing2 = (bob.Name, bob.Children.Count); WriteLine($"{thing2.Item1} has {thing2.Item2} children-"); // optional parameters WriteLine(); WriteLine("Optional Parameters------------------------------"); WriteLine(bob.OptionalParameters()); WriteLine(bob.OptionalParameters("Jump", 2.4)); WriteLine(bob.OptionalParameters(number: 2.4, active: false)); WriteLine(bob.OptionalParameters(active: false, command: "Fly")); WriteLine(bob.OptionalParameters("Walk", active: false)); // alice var alice = new Person(); alice.Name = "Alice Smith"; alice.DateOfBirth = new DateTime(1968, 10, 22); WriteLine(); WriteLine("Alice------------------------------"); WriteLine( format: "{0} was born on {1:dd, MMM yy}", arg0: alice.Name, arg1: alice.DateOfBirth ); WriteLine(); WriteLine("Constructors----------------------------"); // blank Person to use constructor var blankPerson = new Person(); WriteLine( format: "{0} of {1} was created at {2:hh:mm:ss} on a {2:dddd}.", arg0: blankPerson.Name, arg1: blankPerson.HomePlanet, arg2: blankPerson.Instantiated ); var gunny = new Person("Gunny", "Mars"); WriteLine( format: "{0} of {1} was created at {2:hh:mm:ss} on a {2:dddd}.", arg0: gunny.Name, arg1: gunny.HomePlanet, arg2: gunny.Instantiated ); // bank account class use BankAccount.InterestRate = 0.012M; var jonesAccount = new BankAccount(); jonesAccount.AccountName = "Mrs Jones"; jonesAccount.Balance = 2400; var smithAccount = new BankAccount(); smithAccount.AccountName = "Mrs Smith"; smithAccount.Balance = 800; WriteLine(); WriteLine("public STATIC property - shared across all instances of class - bank interest rate demonstrateS ---------------"); WriteLine( format: "{0} earned {1:C} interest", arg0: jonesAccount, arg1: jonesAccount.Balance * BankAccount.InterestRate ); WriteLine( format: "{0} earned {1:C} interest", arg0: smithAccount, arg1: smithAccount.Balance * BankAccount.InterestRate ); WriteLine(); WriteLine("PARAMETERS - 3 ways: by value, reference or an an out parameter ---------------"); int a = 10; int b = 20; int c = 30; // no point in setting value of c as gets repoaced from within the method bob.PassingParameters(a, ref b, out c); WriteLine($"a: {a}, b: {b}, c {c}"); int d = 10; int e = 20; WriteLine($"d: {d}, e: {e}, f doesn't exist yet"); bob.PassingParameters(d, ref e, out int f); WriteLine($"d: {d}, e: {e}, f: {f}"); WriteLine(); WriteLine("Partial classes and properties, and indexers ---------------"); var sam = new Person { Name = "Sam", DateOfBirth = new DateTime(1972, 1, 27) }; WriteLine(sam.Origin); WriteLine(sam.Greeting); WriteLine(sam.Age); sam.FavouriteIceCream = "Mint choc chip"; sam.FavouritePrimaryColour = "Red"; WriteLine($"{sam.Name}'s favourite ice cream is {sam.FavouriteIceCream} and fav primary colour is {sam.FavouritePrimaryColour}"); sam.Children.Add(new Person { Name = "Charlie" }); sam.Children.Add(new Person { Name = "Ella" }); // if you had no indexer set up for Children: WriteLine($"{sam.Name}'s first child is {sam.Children[0].Name}"); WriteLine($"{sam.Name}'s second- child is {sam.Children[1].Name}"); // if you have indexer set up for Children - does it really add much value? I think it reduces ease of reading code... WriteLine($"{sam.Name}'s first child is {sam[0].Name}"); WriteLine($"{sam.Name}'s second- child is {sam[1].Name}"); }