From 4fc45bb6f6cda9a076ec8b9317a29601cd7d9430 Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Wed, 12 Mar 2025 11:17:30 -0400 Subject: [PATCH 1/3] Update samples used in delegates articles Contributes to dotnet/docs#45199 These samples haven't been updated since .NET 7. It's time to update them while updating the related articles. --- csharp/delegates-and-events/FileLogger.cs | 54 +++-- csharp/delegates-and-events/Logger.cs | 74 ++----- csharp/delegates-and-events/Program.cs | 27 +-- .../delegates-and-events.csproj | 6 +- csharp/events/Program.cs | 186 ++++++------------ csharp/events/VersionOne.cs | 21 ++ csharp/events/events.csproj | 6 +- 7 files changed, 135 insertions(+), 239 deletions(-) create mode 100644 csharp/events/VersionOne.cs diff --git a/csharp/delegates-and-events/FileLogger.cs b/csharp/delegates-and-events/FileLogger.cs index 42fdbece740..c3eef6dcd7e 100644 --- a/csharp/delegates-and-events/FileLogger.cs +++ b/csharp/delegates-and-events/FileLogger.cs @@ -1,40 +1,34 @@ -using System; -using System.IO; +namespace DelegatesAndEvents; -namespace DelegatesAndEvents +public class FileLogger { - // - public class FileLogger + private readonly string logPath; + public FileLogger(string path) { - private readonly string logPath; - public FileLogger(string path) - { - logPath = path; - Logger.WriteMessage += LogMessage; - } + logPath = path; + Logger.WriteMessage += LogMessage; + } - public void DetachLog() => Logger.WriteMessage -= LogMessage; - // make sure this can't throw. - private void LogMessage(string msg) + public void DetachLog() => Logger.WriteMessage -= LogMessage; + // make sure this can't throw. + private void LogMessage(string msg) + { + try { - try + using (var log = File.AppendText(logPath)) { - using (var log = File.AppendText(logPath)) - { - log.WriteLine(msg); - log.Flush(); - } - } - catch (Exception) - { - // Hmm. We caught an exception while - // logging. We can't really log the - // problem (since it's the log that's failing). - // So, while normally, catching an exception - // and doing nothing isn't wise, it's really the - // only reasonable option here. + log.WriteLine(msg); + log.Flush(); } } + catch (Exception) + { + // Hmm. We caught an exception while + // logging. We can't really log the + // problem (since it's the log that's failing). + // So, while normally, catching an exception + // and doing nothing isn't wise, it's really the + // only reasonable option here. + } } - // } diff --git a/csharp/delegates-and-events/Logger.cs b/csharp/delegates-and-events/Logger.cs index 56c718b687d..5873b61fd9b 100644 --- a/csharp/delegates-and-events/Logger.cs +++ b/csharp/delegates-and-events/Logger.cs @@ -1,69 +1,27 @@ -using System; +namespace DelegatesAndEvents; -namespace DelegatesAndEvents +public enum Severity { - - // Logger implementation two - // - public enum Severity - { - Verbose, - Trace, - Information, - Warning, - Error, - Critical - } - // - - // - public static class Logger - { - public static Action WriteMessage; - - public static Severity LogLevel { get; set; } = Severity.Warning; - - public static void LogMessage(Severity s, string component, string msg) - { - if (s < LogLevel) - return; - - var outputMsg = $"{DateTime.Now}\t{s}\t{component}\t{msg}"; - WriteMessage(outputMsg); - } - } - // + Verbose, + Trace, + Information, + Warning, + Error, + Critical } -namespace ImplementationOne +public static class Logger { - // - public static class Logger - { - public static Action WriteMessage; + public static Action? WriteMessage; - public static void LogMessage(string msg) - { - WriteMessage(msg); - } - } - // -} - -namespace ImplementationTwo -{ - using DelegatesAndEvents; + public static Severity LogLevel { get; set; } = Severity.Warning; - // - public static class Logger + public static void LogMessage(Severity s, string component, string msg) { - public static Action WriteMessage; + if ((s < LogLevel) || (WriteMessage is null)) + return; - public static void LogMessage(Severity s, string component, string msg) - { - var outputMsg = $"{DateTime.Now}\t{s}\t{component}\t{msg}"; - WriteMessage(outputMsg); - } + var outputMsg = $"{DateTime.Now}\t{s}\t{component}\t{msg}"; + WriteMessage(outputMsg); } - // } diff --git a/csharp/delegates-and-events/Program.cs b/csharp/delegates-and-events/Program.cs index 1747abf2e9a..78acda6a992 100644 --- a/csharp/delegates-and-events/Program.cs +++ b/csharp/delegates-and-events/Program.cs @@ -1,24 +1,11 @@ -using System; +using DelegatesAndEvents; -namespace DelegatesAndEvents -{ - public class Program - { - public static void Main(string[] args) - { - // - Logger.WriteMessage += LoggingMethods.LogToConsole; - // - // - var file = new FileLogger("log.txt"); - // +Logger.WriteMessage += LoggingMethods.LogToConsole; +var file = new FileLogger("log.txt"); - Logger.LogMessage(Severity.Warning, "Console", "This is a warning message"); +Logger.LogMessage(Severity.Warning, "Console", "This is a warning message"); - Logger.LogMessage(Severity.Information, "Console", "Information message one"); - Logger.LogLevel = Severity.Information; +Logger.LogMessage(Severity.Information, "Console", "Information message one"); +Logger.LogLevel = Severity.Information; - Logger.LogMessage(Severity.Information, "Console", "Information message two"); - } - } -} +Logger.LogMessage(Severity.Information, "Console", "Information message two"); diff --git a/csharp/delegates-and-events/delegates-and-events.csproj b/csharp/delegates-and-events/delegates-and-events.csproj index 299d1386b17..16829f3e536 100644 --- a/csharp/delegates-and-events/delegates-and-events.csproj +++ b/csharp/delegates-and-events/delegates-and-events.csproj @@ -1,8 +1,10 @@ - + - net7.0 + net9.0 Exe + enable + enable diff --git a/csharp/events/Program.cs b/csharp/events/Program.cs index c2f07f0c5bb..a7fd59623fc 100644 --- a/csharp/events/Program.cs +++ b/csharp/events/Program.cs @@ -1,155 +1,87 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; +var fileLister = new FileSearcher(); +int filesFound = 0; -namespace EventSampleCode +EventHandler onFileFound = (sender, eventArgs) => { - class Program - { - static void Main(string[] args) - { - var fileLister = new FileSearcher(); - int filesFound = 0; + Console.WriteLine(eventArgs.FoundFile); + filesFound++; +}; - // - EventHandler onFileFound = (sender, eventArgs) => - { - Console.WriteLine(eventArgs.FoundFile); - filesFound++; - }; +fileLister.FileFound += onFileFound; - fileLister.FileFound += onFileFound; - // +fileLister.DirectoryChanged += (sender, eventArgs) => +{ + Console.Write($"Entering '{eventArgs.CurrentSearchDirectory}'."); + Console.WriteLine($" {eventArgs.CompletedDirs} of {eventArgs.TotalDirs} completed..."); +} - // - fileLister.DirectoryChanged += (sender, eventArgs) => - { - Console.Write($"Entering '{eventArgs.CurrentSearchDirectory}'."); - Console.WriteLine($" {eventArgs.CompletedDirs} of {eventArgs.TotalDirs} completed..."); - }; - // +fileLister.Search(".", "*.dll", true); - fileLister.Search(".", "*.dll", true); +fileLister.FileFound -= onFileFound; - // - fileLister.FileFound -= onFileFound; - // - } - } +public class FileFoundArgs : EventArgs +{ + public string FoundFile { get; } + public bool CancelRequested { get; set; } - // - public class FileFoundArgs : EventArgs - { - public string FoundFile { get; } - public bool CancelRequested { get; set; } + public FileFoundArgs(string fileName) => FoundFile = fileName; +} - public FileFoundArgs(string fileName) - { - FoundFile = fileName; - } - } - // +internal class SearchDirectoryArgs : EventArgs +{ + internal string CurrentSearchDirectory { get; } + internal int TotalDirs { get; } + internal int CompletedDirs { get; } - // - internal class SearchDirectoryArgs : EventArgs + internal SearchDirectoryArgs(string dir, int totalDirs, int completedDirs) { - internal string CurrentSearchDirectory { get; } - internal int TotalDirs { get; } - internal int CompletedDirs { get; } - - internal SearchDirectoryArgs(string dir, int totalDirs, int completedDirs) - { - CurrentSearchDirectory = dir; - TotalDirs = totalDirs; - CompletedDirs = completedDirs; - } + CurrentSearchDirectory = dir; + TotalDirs = totalDirs; + CompletedDirs = completedDirs; } - // +} - public class FileSearcher +public class FileSearcher +{ + public event EventHandler? FileFound; + internal event EventHandler? DirectoryChanged { - // - public event EventHandler FileFound; - // - // - internal event EventHandler DirectoryChanged - { - add { directoryChanged += value; } - remove { directoryChanged -= value; } - } - private EventHandler directoryChanged; - // - - // - public void Search(string directory, string searchPattern, bool searchSubDirs = false) - { - if (searchSubDirs) - { - var allDirectories = Directory.GetDirectories(directory, "*.*", SearchOption.AllDirectories); - var completedDirs = 0; - var totalDirs = allDirectories.Length + 1; - foreach (var dir in allDirectories) - { - directoryChanged?.Invoke(this, - new SearchDirectoryArgs(dir, totalDirs, completedDirs++)); - // Search 'dir' and its subdirectories for files that match the search pattern: - SearchDirectory(dir, searchPattern); - } - // Include the Current Directory: - directoryChanged?.Invoke(this, - new SearchDirectoryArgs(directory, totalDirs, completedDirs++)); - SearchDirectory(directory, searchPattern); - } - else - { - SearchDirectory(directory, searchPattern); - } - } + add => directoryChanged += value; + remove => directoryChanged -= value; + } + private EventHandler? directoryChanged; - private void SearchDirectory(string directory, string searchPattern) + public void Search(string directory, string searchPattern, bool searchSubDirs = false) + { + if (searchSubDirs) { - foreach (var file in Directory.EnumerateFiles(directory, searchPattern)) + var allDirectories = Directory.GetDirectories(directory, "*.*", SearchOption.AllDirectories); + var completedDirs = 0; + var totalDirs = allDirectories.Length + 1; + foreach (var dir in allDirectories) { - var args = new FileFoundArgs(file); - FileFound?.Invoke(this, args); - if (args.CancelRequested) - break; + directoryChanged?.Invoke(this, new (dir, totalDirs, completedDirs++)); + // Search 'dir' and its subdirectories for files that match the search pattern: + SearchDirectory(dir, searchPattern); } + // Include the Current Directory: + directoryChanged?.Invoke(this, new (directory, totalDirs, completedDirs++)); + SearchDirectory(directory, searchPattern); } - // - } -} - -namespace VersionOne -{ - // - public class FileFoundArgs : EventArgs - { - public string FoundFile { get; } - - public FileFoundArgs(string fileName) + else { - FoundFile = fileName; + SearchDirectory(directory, searchPattern); } } - // - // - public class FileSearcher + private void SearchDirectory(string directory, string searchPattern) { - public event EventHandler FileFound; - - public void Search(string directory, string searchPattern) + foreach (var file in Directory.EnumerateFiles(directory, searchPattern)) { - foreach (var file in Directory.EnumerateFiles(directory, searchPattern)) - { - FileFound?.Invoke(this, new FileFoundArgs(file)); - } + var args = new FileFoundArgs(file); + FileFound?.Invoke(this, args); + if (args.CancelRequested) + break; } } - // } diff --git a/csharp/events/VersionOne.cs b/csharp/events/VersionOne.cs new file mode 100644 index 00000000000..6cb727477e3 --- /dev/null +++ b/csharp/events/VersionOne.cs @@ -0,0 +1,21 @@ +namespace events; + +public class FileFoundArgs : EventArgs +{ + public string FoundFile { get; } + + public FileFoundArgs(string fileName) => FoundFile = fileName; +} + +public class FileSearcher +{ + public event EventHandler? FileFound; + + public void Search(string directory, string searchPattern) + { + foreach (var file in Directory.EnumerateFiles(directory, searchPattern)) + { + FileFound?.Invoke(this, new FileFoundArgs(file)); + } + } +} diff --git a/csharp/events/events.csproj b/csharp/events/events.csproj index 299d1386b17..16829f3e536 100644 --- a/csharp/events/events.csproj +++ b/csharp/events/events.csproj @@ -1,8 +1,10 @@ - + - net7.0 + net9.0 Exe + enable + enable From 311b758a3d0acafa41dd1f39ae9cdb033f826659 Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Wed, 12 Mar 2025 13:18:32 -0400 Subject: [PATCH 2/3] Update csharp/events/Program.cs --- csharp/events/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/events/Program.cs b/csharp/events/Program.cs index a7fd59623fc..10e17c43697 100644 --- a/csharp/events/Program.cs +++ b/csharp/events/Program.cs @@ -13,7 +13,7 @@ { Console.Write($"Entering '{eventArgs.CurrentSearchDirectory}'."); Console.WriteLine($" {eventArgs.CompletedDirs} of {eventArgs.TotalDirs} completed..."); -} +}; fileLister.Search(".", "*.dll", true); From 0c6d350134da69f2cd43a9da43317b2481e5f912 Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Thu, 13 Mar 2025 12:47:38 -0400 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: David Pine --- csharp/delegates-and-events/FileLogger.cs | 6 +++--- csharp/events/VersionOne.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/delegates-and-events/FileLogger.cs b/csharp/delegates-and-events/FileLogger.cs index c3eef6dcd7e..54cce5e51bf 100644 --- a/csharp/delegates-and-events/FileLogger.cs +++ b/csharp/delegates-and-events/FileLogger.cs @@ -2,10 +2,10 @@ public class FileLogger { - private readonly string logPath; + private readonly string _logPath; public FileLogger(string path) { - logPath = path; + _logPath = path; Logger.WriteMessage += LogMessage; } @@ -15,7 +15,7 @@ private void LogMessage(string msg) { try { - using (var log = File.AppendText(logPath)) + using (var log = File.AppendText(_logPath)) { log.WriteLine(msg); log.Flush(); diff --git a/csharp/events/VersionOne.cs b/csharp/events/VersionOne.cs index 6cb727477e3..f9959043b2a 100644 --- a/csharp/events/VersionOne.cs +++ b/csharp/events/VersionOne.cs @@ -1,4 +1,4 @@ -namespace events; +namespace Events; public class FileFoundArgs : EventArgs {