永不停止学习

发布: (2026年5月3日 GMT+8 07:20)
7 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我将为您翻译成简体中文并保持原有的格式。

介绍

现在是开发者的黄金时代,拥有丰富的工具、文档和人工智能。尽管如此,至少在可预见的未来,开发者仍需学习编写代码,因为 AI 工具并不完美,可能会生成难以集成到现有代码库的代码。

  • 对于刚入门的开发者 – 先学习基础知识,然后是面向对象编程和数据库工作。
  • 对于有经验的开发者 – 打磨技能,以获得并保持全职工作。例如,C# .NET Core 有了新特性;抽时间学习它,即使暂时没有直接用处。另一条路径是浏览开发者论坛,分析问题的各个方面,决定可以学习或避免的内容。

以下指南适用于使用 Microsoft Visual StudioC#.NET 8 或更高版本 的开发者。

  • 为学习创建一个 Visual Studio 解决方案,并使用 解决方案文件夹 对主题进行分类。
  • 当代码在多个项目中都有用时,将其放入 类库(请参见下图中的类项目文件夹)。

请求控制台项目的登录

首先,完整查看该线程——这正是 AI 可能用来形成响应的全部内容。
现在让我们使用 Spectre.Console NuGet 包来探索一种更好的方式。

  • Spectre.ConsoleTextPrompt 可提示用户输入文本,并支持验证、默认值以及密码遮蔽。
  • 它将用于确保返回 非空字符串
  • 密码文本会被遮蔽。
  • 用户名和密码使用相同的颜色。
  • 示例包含足够的验证以用于测试(硬编码)。
using Spectre.Console;
using SpectreLoginSample.Classes.Core;

namespace SpectreLoginSample.Classes;

internal class Prompts
{
    public static string PromptStyleColor { get; set; } = "cyan";
    public static string PromptColor { get; set; } = "bold";

    public static bool TryLogin(int maxAttempts = 3)
    {
        for (int attempt = 1; attempt 
        username == "admin" && password == "password";

    public static string GetUserName(bool allowEmpty) =>
        allowEmpty
            ? AnsiConsole.Prompt(
                new TextPrompt($"[{PromptColor}]User name[/]")
                    .PromptStyle(PromptStyleColor)
                    .AllowEmpty())
            : AnsiConsole.Prompt(
                new TextPrompt($"[{PromptColor}]User name[/]:")
                    .PromptStyle(PromptStyleColor));

    public static string GetPassword() =>
        AnsiConsole.Prompt(
            new TextPrompt($"[{PromptColor}]Password[/]:")
                .PromptStyle("grey50")
                .Secret()
                .DefaultValueStyle(new Style(Color.Aqua)));
}

为什么这是一次很好的学习体验

登录代码完成后,Spectre.Console 库还有大量内容可供探索。它在以下方面表现出色:

  • .NET 工具
  • 控制台项目实用程序

文件通配符来救场

文件通配符是每个开发者都应该了解的话题。glob(通配符)使用通配符定义匹配文件和目录名称的模式。通配符操作就是定义一个或多个 glob 模式,并根据包含或排除的匹配结果返回文件。

场景 – 开发者使用 OneDrive 进行备份。备份完成后,所有本地文件都会被删除。当恢复备份时,会出现大量重复文件(5,000+ 副本)。手动删除这些文件几乎不可能。掌握文件通配符后,开发者可以编写一个简单的控制台应用程序,自动删除这些重复文件。

创建重复文件列表的代码

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.FileSystemGlobbing;
using Spectre.Console;

public static class Globbing
{
    /// 
    /// Returns a list of files that match typical “Copy” naming patterns.
    /// 
    public static async Task> GetDuplicatesTask(string parentFolder)
    {
        var list = new List();
        var matcher = new Matcher();

        // Include typical copy‑file patterns
        matcher.AddIncludePatterns(new[]
        {
            "**/* - Copy .*",
            "**/* - Copy (*.*"
        });

        // Exclude folders that may need special permissions
        matcher.AddExcludePatterns(new[]
        {
            "**/My Music/**",
            "**/My Pictures/**",
            "**/My Videos/**"
        });

        await Task.Run(() =>
        {
            foreach (var file in matcher.GetResultsInFullPath(parentFolder))
            {
                list.Add(new FileMatchItem(file));
            }
        });

        // Persist the list for later inspection
        await File.WriteAllLinesAsync(
            Path.Combine(parentFolder, "Duplicates.txt"),
            list.Select(item => item.ToString()));

        return list;
    }
}

删除重复文件的代码

using System;
using System.Threading.Tasks;
using Spectre.Console;

public static class DuplicateProcessor
{
    public static async Task ProcessOneDriveDuplicates()
    {
        var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        var list   = await Globbing.GetDuplicatesTask(folder);

        if (list.Count > 0)
        {
            AnsiConsole.MarkupLine($"[bold green]Found {list.Count} duplicate files.[/]");
            foreach (var item in list)
            {
                try
                {
                    System.IO.File.Delete(item.FullPath);
                }
                catch (Exception ex)
                {
                    AnsiConsole.MarkupLine(
                        $"[red]Failed to delete {item.FullPath}: {ex.Message}[/]");
                }
            }

            AnsiConsole.MarkupLine("[bold green]Deletion complete.[/]");
        }
        else
        {
            AnsiConsole.MarkupLine("[green]No duplicate files were found.[/]");
        }

        SpectreConsoleHelpers.ContinuePrompt();
    }
}

💡 小贴士AddExcludePatterns 对于跳过需要提升权限的目录或你根本不想触碰的目录非常有用。

摘要

  • 使用 Spectre.Console 实现精致、交互式的控制台提示(登录、菜单等)。
  • 利用 file‑globbing (Microsoft.Extensions.FileSystemGlobbing) 根据模式定位并操作文件组。
  • 在 Visual Studio 解决方案中将可复用代码组织在类库项目中,以保持整洁并可在多个控制台应用之间共享。

祝编码愉快!

源代码

files.[/]");

} else
{
    AnsiConsole.MarkupLine($"[bold green]No duplicate files found in {folder}.[/]");
    return;
}

foreach (var (index, item) in list.Index())
{
    try
    {
        if (File.Exists(item.FullName))
        {
            File.Delete(item.FullName);
        }
        else
        {
            AnsiConsole.MarkupLine($"[yellow bold]{item.FullName}[/]");
        }
    }
    catch (Exception e)
    {
        AnsiConsole.MarkupLine($"[red bold]Failed to delete " +
                                $"{index} {item.FullName}[/]");
    }
}

摘要

无论开发者是沉浸于代码、在遇到卡点时使用人工智能,还是不使用 AI,都应该每周至少尝试学习一点新东西。Karen 每周会尝试学习几次新东西。

0 浏览
Back to Blog

相关文章

阅读更多 »