{"@attributes":{"version":"2.0"},"channel":{"title":"\u5bd2\u6d41\u306e\u7f16\u7a0b\u7b14\u8bb0","link":"https:\/\/blog.coldwind.top\/","description":"Recent content on \u5bd2\u6d41\u306e\u7f16\u7a0b\u7b14\u8bb0","generator":"Hugo -- gohugo.io","language":"zh-cn","lastBuildDate":"Thu, 05 Feb 2026 00:00:00 +0000","item":[{"title":"\u4f60\u597d\uff0c\u4e16\u754c\uff01","link":"https:\/\/blog.coldwind.top\/posts\/hello-world\/","pubDate":"Sun, 18 Feb 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/hello-world\/","description":"<img src=\"https:\/\/blog.coldwind.top\/posts\/hello-world\/cover.jpg\" alt=\"Featured image of post \u4f60\u597d\uff0c\u4e16\u754c\uff01\" \/><p>\u6b22\u8fce\u6765\u5230\u6211\u7684\u535a\u5ba2\uff01<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u300aCommunityToolkit.Mvvm \u793e\u533a\u5de5\u5177\u5305\u4ece\u5165\u95e8\u5230\u7cbe\u901a\u300b\u7cfb\u5217\u6559\u7a0b\u5df2\u7ecf\u57fa\u672c\u5b8c\u5de5\uff01\u4f60\u53ef\u4ee5<a class=\"link\" href=\"https:\/\/mvvm.coldwind.top\/\" target=\"_blank\" rel=\"noopener\"\n>\u70b9\u51fb\u8fd9\u91cc<\/a>\u67e5\u770b\uff0c\u5e76\u5728\u8bc4\u8bba\u533a\u7559\u4e0b\u4f60\u7684\u5b9d\u8d35\u610f\u89c1\u3002<\/div>\n<\/div>\n<p>\u867d\u7136\u535a\u5ba2\u7684\u7edd\u5927\u591a\u6570\u6240\u9700\u529f\u80fd\u90fd\u5df2\u7ecf\u5b9e\u73b0\uff0c\u4f46\u4ecd\u6709\u4e00\u4e9b\u7ec6\u8282\u9700\u8981\u5fae\u8c03\uff0c\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li><input disabled=\"\" type=\"checkbox\"> \u53f3\u4fa7\u76ee\u5f55\u5bbd\u5ea6\u592a\u5927<\/li>\n<li><input disabled=\"\" type=\"checkbox\"> \u535a\u5ba2\u6b63\u6587\u7684\u6807\u9898\u4e0b\u65b9\u4e0d\u9700\u8981\u663e\u793a\u6458\u8981\u5185\u5bb9<\/li>\n<li><input disabled=\"\" type=\"checkbox\"> \u6dfb\u52a0\u7528\u6237\u8bbf\u95ee\u7edf\u8ba1<\/li>\n<li><input disabled=\"\" type=\"checkbox\"> \u9605\u8bfb\u65f6\u957f\u7684\u8ba1\u7b97\u5e76\u4e0d\u5341\u5206\u51c6\u786e<\/li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> \u53bb\u6389\u6587\u7ae0\u5c0f\u6807\u9898\u524d\u9762\u7684\u201c#\u201d\u53f7<\/li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> \u6dfb\u52a0 RSS \u8ba2\u9605\u529f\u80fd<\/li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> \u6dfb\u52a0\u4e00\u4e2a\u300c\u5173\u4e8e\u6211\u300d\u9875\u9762<\/li>\n<li><input checked=\"\" disabled=\"\" type=\"checkbox\"> \u6dfb\u52a0\u8bc4\u8bba\u533a<\/li>\n<\/ul>\n<p>\u66f4\u591a\u5173\u4e8e\u6211\u7684\u4fe1\u606f\uff0c\u8bf7\u67e5\u770b<a class=\"link\" href=\"https:\/\/blog.coldwind.top\/about\" >\u5173\u4e8e\u6211<\/a>\u9875\u9762\u3002<\/p>\n<p>\u672c\u535a\u5ba2\u4f7f\u7528 Hugo \u642d\u5efa\uff0c\u4e3b\u9898\u662f <a class=\"link\" href=\"https:\/\/github.com\/CaiJimmy\/hugo-theme-stack\" target=\"_blank\" rel=\"noopener\"\n>Stack<\/a>\u3002<\/p>\n<p>\u5c01\u9762\u56fe\u7247\u4f7f\u7528 <a class=\"link\" href=\"https:\/\/github.com\/lllyasviel\/Fooocus\" target=\"_blank\" rel=\"noopener\"\n>Fooocus<\/a> \u7ed8\u5236\u3002<\/p>"},{"title":"\u4e0d\u8981\u8f7b\u6613\u4f7f\u7528\u5927\u800c\u5168\u7684\u6269\u5c55\u5e93","link":"https:\/\/blog.coldwind.top\/posts\/dont-easily-use-comprehensive-extension-libraries\/","pubDate":"Thu, 05 Feb 2026 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/dont-easily-use-comprehensive-extension-libraries\/","description":"<p>NuGet \u4e0a\u6709\u5f88\u591a\u5927\u800c\u5168\u7684 C# \u6269\u5c55\u5e93\u3002\u5b83\u4eec\u901a\u5e38\u4f1a\u4e3a\u5404\u79cd\u5e38\u7528\u7684\u7c7b\u578b\u63d0\u4f9b\u76f8\u5f53\u591a\u7684\u6269\u5c55\u65b9\u6cd5\uff0c\u4ece\u800c\u8f85\u52a9\u6211\u4eec\u7684\u5f00\u53d1\u3002\u6700\u5e38\u89c1\u7684\u529f\u80fd\u6709\uff1a<\/p>\n<ul>\n<li>\u5b57\u7b26\u4e32\u5904\u7406<\/li>\n<li>\u96c6\u5408\u5904\u7406<\/li>\n<li>\u6587\u4ef6\u64cd\u4f5c<\/li>\n<li>\u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316<\/li>\n<li>\u7f51\u7edc\u8bf7\u6c42<\/li>\n<li>\u65e5\u671f\u65f6\u95f4\u5904\u7406<\/li>\n<\/ul>\n<p>\u7b49\u7b49\u3002\u4f46\u6211\u7684\u5efa\u8bae\u662f\uff0c<strong>\u4e0d\u8981\u8f7b\u6613\u4f7f\u7528\u8fd9\u4e9b\u5927\u800c\u5168\u7684\u6269\u5c55\u5e93<\/strong>\u3002\u6211\u4eec\u4eca\u5929\u5c31\u6765\u63a2\u8ba8\u4e00\u4e0b\u8fd9\u4e2a\u95ee\u9898\u3002\u4e3a\u4e86\u907f\u514d\u9ad8\u7ea7\u9ed1\u6216\u8005\u62c9\u8e29\u4e4b\u7c7b\u7684\u5acc\u7591\uff0c\u8fd9\u6b21\u6211\u4e0d\u4f1a\u70b9\u540d\u5177\u4f53\u7684\u5e93\uff0c\u4f46\u662f\u4f1a\u901a\u8fc7\u4e00\u4e9b\u4f8b\u5b50\u6559\u5927\u5bb6\u5982\u4f55\u5224\u65ad\u4e00\u4e2a\u5e93\u662f\u5426\u9002\u5408\u4f7f\u7528\uff0c\u4ee5\u53ca\u8be5\u5982\u4f55\u6b63\u786e\u5730\u5b66\u4e60\u548c\u5229\u7528\u5b83\u4eec\u3002<\/p>\n<h2 id=\"\u539f\u56e0\u4e00\u529f\u80fd\u5927\u591a\u6570\u7528\u4e0d\u4e0a\u800c\u4e14\u6c61\u67d3\u57fa\u672c\u7c7b\u578b\">\n\u539f\u56e0\u4e00\uff1a\u529f\u80fd\u5927\u591a\u6570\u7528\u4e0d\u4e0a\uff0c\u800c\u4e14\u6c61\u67d3\u57fa\u672c\u7c7b\u578b\n<a href=\"#%e5%8e%9f%e5%9b%a0%e4%b8%80%e5%8a%9f%e8%83%bd%e5%a4%a7%e5%a4%9a%e6%95%b0%e7%94%a8%e4%b8%8d%e4%b8%8a%e8%80%8c%e4%b8%94%e6%b1%a1%e6%9f%93%e5%9f%ba%e6%9c%ac%e7%b1%bb%e5%9e%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u539f\u56e0\u5c31\u662f\uff0c\u8fd9\u4e9b\u6269\u5c55\u5e93\u5f80\u5f80\u4f1a\u63d0\u4f9b\u4e0a\u767e\u4e2a\u6269\u5c55\u65b9\u6cd5\uff0c\u4f46\u662f\u6211\u4eec\u5b9e\u9645\u7528\u5f97\u5230\u7684\u901a\u5e38\u53ea\u6709 10 \u4e2a\u4ee5\u5185\u3002\u800c\u4e3a\u4e86\u7528\u8fd9\u51e0\u4e2a\u529f\u80fd\uff0c\u6211\u4eec\u5374\u4e0d\u5f97\u4e0d\u5f15\u5165\u6574\u4e2a\u5e93\uff0c\u4ece\u800c\u5bfc\u81f4\u6211\u4eec\u7684\u9879\u76ee\u53d8\u5f97\u81c3\u80bf\u3002<\/p>\n<p>\u66f4\u7cdf\u7cd5\u7684\u662f\uff0c\u8fd9\u4e9b\u6269\u5c55\u5e93\u56e0\u4e3a\u5145\u5206\u6269\u5c55\u4e86\u5e38\u89c1\u7684\u6570\u636e\u7c7b\u578b\uff08\u6bd4\u5982 <code>string<\/code>\u3001<code>IEnumerable&lt;T&gt;<\/code>\u3001<code>DateTime<\/code> \u7b49\u7b49\uff09\uff0c\u4f1a\u5bfc\u81f4\u4ee3\u7801\u8865\u5168\u65f6\u51fa\u73b0\u5927\u91cf\u65e0\u5173\u7684\u6269\u5c55\u65b9\u6cd5\uff0c\u5f71\u54cd\u5f00\u53d1\u6548\u7387\u3002\u5982\u679c\u6211\u4eec\u5c06\u8fd9\u4e2a\u5e93\u5f15\u5165\u5230\u56e2\u961f\u9879\u76ee\u4e2d\uff0c\u90a3\u5c31\u66f4\u9ebb\u70e6\u4e86\uff0c\u56e2\u961f\u6210\u5458\u5728\u7f16\u5199\u4ee3\u7801\u65f6\u4e5f\u4f1a\u88ab\u8fd9\u4e9b\u65e0\u5173\u7684\u6269\u5c55\u65b9\u6cd5\u5e72\u6270\u3002<\/p>\n<p>\u53ef\u80fd\u6709\u4eba\u4f1a\u8bf4\uff0c\u8fd9\u4e9b\u6269\u5c55\u5e93\u90fd\u4f1a\u5c06\u65b9\u6cd5\u653e\u5728\u7279\u5b9a\u7684\u547d\u540d\u7a7a\u95f4\u4e0b\uff0c\u6211\u4eec\u53ea\u9700\u8981\u4e0d\u5f15\u5165\u8fd9\u4e2a\u547d\u540d\u7a7a\u95f4\u5c31\u884c\u4e86\u3002\u7406\u8bba\u4e0a\u662f\u8fd9\u6837\u6ca1\u9519\uff0c\u4f46\u5b9e\u9645\u4e0a\u73b0\u5728\u7684 IDE \u90fd\u76f8\u5f53\u667a\u80fd\u3002\u5373\u4fbf\u4f60\u6ca1\u6709\u5f15\u5165\u547d\u540d\u7a7a\u95f4\uff0c\u901a\u5e38\u4e5f\u4f1a\u770b\u5230\u8fd9\u4e9b\u65b9\u6cd5\u7684\u63d0\u793a\uff0c\u5e76\u4e14\u5982\u679c\u4f60\u4e0d\u614e\u4f7f\u7528\uff0cIDE \u8fd8\u4f1a\u81ea\u52a8\u5e2e\u4f60\u6dfb\u52a0 <code>using<\/code> \u8bed\u53e5\uff0c\u4ece\u800c\u5f15\u5165\u4e86\u6574\u4e2a\u6269\u5c55\u5e93\u3002\u6240\u4ee5\u53ea\u8981\u4f60\u7684\u9879\u76ee\u6dfb\u52a0\u4e86\u8fd9\u4e2a\u6269\u5c55\u5e93\uff0c\u5c31\u5f88\u96be\u907f\u514d\u6c61\u67d3\u3002<\/p>\n<h2 id=\"\u539f\u56e0\u4e8c\u6269\u5c55\u5e93\u53ef\u80fd\u5f15\u5165\u4e0d\u5fc5\u8981\u7684\u4f9d\u8d56\">\n\u539f\u56e0\u4e8c\uff1a\u6269\u5c55\u5e93\u53ef\u80fd\u5f15\u5165\u4e0d\u5fc5\u8981\u7684\u4f9d\u8d56\n<a href=\"#%e5%8e%9f%e5%9b%a0%e4%ba%8c%e6%89%a9%e5%b1%95%e5%ba%93%e5%8f%af%e8%83%bd%e5%bc%95%e5%85%a5%e4%b8%8d%e5%bf%85%e8%a6%81%e7%9a%84%e4%be%9d%e8%b5%96\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6709\u4e9b\u6269\u5c55\u5e93\u4e3a\u4e86\u5145\u5206\u5411\u524d\u517c\u5bb9\uff0c\u5f80\u5f80\u4f1a\u4f7f\u7528\u4e00\u4e9b\u6bd4\u8f83\u8001\u65e7\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u751a\u81f3\u73b0\u5728\u5df2\u7ecf\u88ab\u6807\u8bb0\u4e3a\u8fc7\u65f6\u7684 .NET \u5185\u7f6e\u65b9\u6cd5\u3002\u6bd4\u5982\u4e3a\u4e86\u5b9e\u73b0\u5e8f\u5217\u5316\u53cd\u5e8f\u5217\u5316\uff0c\u5b83\u53ef\u80fd\u4f1a\u5f15\u5165 <code>Newtonsoft.Json<\/code>\uff0c\u800c\u4e0d\u662f\u4f7f\u7528\u73b0\u5728\u66f4\u63a8\u8350\u7684 <code>System.Text.Json<\/code>\uff0c\u751a\u81f3\u6709\u7684\u53ef\u80fd\u8fd8\u5728\u4f7f\u7528 <code>System.Runtime.Serialization.Json<\/code> \u547d\u540d\u7a7a\u95f4\u4e0b\u7684\u8001\u65e7\u65b9\u6cd5\uff1b\u53c8\u6bd4\u5982\u7f51\u7edc\u8bf7\u6c42\uff0c\u5b83\u53ef\u80fd\u4f1a\u4f7f\u7528 <code>HttpWebRequest<\/code>\uff0c\u800c\u4e0d\u662f\u73b0\u5728\u66f4\u63a8\u8350\u7684 <code>HttpClient<\/code>\u3002<\/p>\n<p>\u8fd9\u4e9b\u90fd\u4f1a\u5bfc\u81f4\u6211\u4eec\u7684\u9879\u76ee\u5f15\u5165\u4e00\u4e9b\u4e0d\u5fc5\u8981\u7684\u4f9d\u8d56\uff0c\u4ece\u800c\u589e\u52a0\u9879\u76ee\u7684\u590d\u6742\u5ea6\u548c\u4f53\u79ef\u3002<\/p>\n<h2 id=\"\u539f\u56e0\u4e09\u4f7f\u7528\u8fc7\u65f6\u7684\u6807\u51c6\u5e93\u65b9\u6cd5\">\n\u539f\u56e0\u4e09\uff1a\u4f7f\u7528\u8fc7\u65f6\u7684\u6807\u51c6\u5e93\u65b9\u6cd5\n<a href=\"#%e5%8e%9f%e5%9b%a0%e4%b8%89%e4%bd%bf%e7%94%a8%e8%bf%87%e6%97%b6%e7%9a%84%e6%a0%87%e5%87%86%e5%ba%93%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u4e9b\u6269\u5c55\u5e93\u53ef\u80fd\u56e0\u4e3a\u8981\u517c\u5bb9\u66f4\u65e9\u7248\u672c\u7684 .NET\uff0c\u6216\u56e0\u4e3a\u8fc7\u4e8e\u5e9e\u6742\u96be\u4ee5\u66f4\u65b0\uff0c\u5f80\u5f80\u4f1a\u4f7f\u7528\u4e00\u4e9b\u5df2\u7ecf\u8fc7\u65f6\u7684\u6807\u51c6\u5e93\u65b9\u6cd5\uff0c\u4ece\u800c\u5f71\u54cd\u6211\u4eec\u7684\u4ee3\u7801\u8d28\u91cf\u548c\u6027\u80fd\u3002<\/p>\n<h3 id=\"\u6848\u4f8b\u4e00\u54c8\u5e0c\">\n\u6848\u4f8b\u4e00\uff1a\u54c8\u5e0c\n<a href=\"#%e6%a1%88%e4%be%8b%e4%b8%80%e5%93%88%e5%b8%8c\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u6211\u89c1\u8fc7\u4e00\u4e9b\u60c5\u5f62\uff0c\u6bd4\u5982\u8ba1\u7b97 MD5\uff0c\u5b83\u867d\u7136\u4f7f\u7528\u4e86 .NET \u5185\u7f6e\u7684 <code>MD5<\/code> \u7c7b\uff0c\u4f46\u5374\u6ca1\u6709\u4f7f\u7528\u73b0\u5728\u66f4\u63a8\u8350\u7684\u65b9\u5f0f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8fc7\u65f6\u7684\u7528\u6cd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">md5<\/span> <span class=\"p\">=<\/span> <span class=\"n\">MD5<\/span><span class=\"p\">.<\/span><span class=\"n\">Create<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">hash<\/span> <span class=\"p\">=<\/span> <span class=\"n\">md5<\/span><span class=\"p\">.<\/span><span class=\"n\">ComputeHash<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u73b0\u4ee3\u7684\u7528\u6cd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">hash<\/span> <span class=\"p\">=<\/span> <span class=\"n\">MD5<\/span><span class=\"p\">.<\/span><span class=\"n\">HashData<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u770b\u8d77\u6765\u53ef\u80fd\u6ca1\u4ec0\u4e48\uff0c\u4f46\u5b9e\u9645\u4e0a\u8fd9\u4e24\u79cd\u65b9\u5f0f\u7684\u6027\u80fd\u5dee\u522b\u8fd8\u662f\u5f88\u53ef\u89c2\u7684\u3002\u4f20\u7edf\u7684 <code>MD5.Create()<\/code> \u4f1a\u5728\u6258\u7ba1\u5806\u4e0a\u521b\u5efa\u4e00\u4e2a\u52a0\u5bc6\u7b97\u6cd5\u5b9e\u4f8b\uff0c\u800c .NET 5 \u65b0\u589e\u7684 <code>MD5.HashData<\/code> \u662f\u9759\u6001\u65b9\u6cd5\uff0c\u5185\u90e8\u901a\u5e38\u4f1a\u590d\u7528\u6216\u901a\u8fc7\u66f4\u5e95\u5c42\uff08\u5f80\u5f80\u662f\u65e0\u72b6\u6001\u7684\uff09\u7684\u65b9\u5f0f\u76f4\u63a5\u8c03\u7528\u64cd\u4f5c\u7cfb\u7edf\u6216\u8fd0\u884c\u65f6\u7684\u52a0\u5bc6\u5e93\u3002<\/p>\n<p>\u4e0d\u4ec5\u5982\u6b64\uff0c<code>HashData<\/code> \u63d0\u4f9b\u652f\u6301 <code>ReadOnlySpan&lt;byte&gt;<\/code> \u7684\u91cd\u8f7d\u3002\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u54c8\u5e0c\u503c\u76f4\u63a5\u5199\u5165\u9884\u5148\u5206\u914d\u597d\u7684\u7f13\u51b2\u533a\uff08\u5982 stackalloc \u5206\u914d\u7684\u6808\u5185\u5b58\uff09\uff0c\u4ece\u800c\u5b9e\u73b0\u5b8c\u5168\u4e0d\u5206\u914d\u5806\u5185\u5b58\u3002<\/p>\n<p>\u7b80\u5355\u8dd1\u4e00\u4e2a\u5206\uff0c\u53ef\u4ee5\u770b\u5230\u65b0\u65b9\u6cd5\u4e0d\u4ec5\u6548\u7387\u9ad8\uff0c\u800c\u4e14\u51e0\u4e4e\u6ca1\u6709 GC \u5f00\u9500\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>Method<\/th>\n<th style=\"text-align: right\">Mean<\/th>\n<th style=\"text-align: right\">Error<\/th>\n<th style=\"text-align: right\">StdDev<\/th>\n<th style=\"text-align: right\">Gen0<\/th>\n<th style=\"text-align: right\">Gen1<\/th>\n<th style=\"text-align: right\">Allocated<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ComputeHash<\/td>\n<td style=\"text-align: right\">335.7 ns<\/td>\n<td style=\"text-align: right\">35.04 ns<\/td>\n<td style=\"text-align: right\">1.92 ns<\/td>\n<td style=\"text-align: right\">0.0172<\/td>\n<td style=\"text-align: right\">0.0005<\/td>\n<td style=\"text-align: right\">216 B<\/td>\n<\/tr>\n<tr>\n<td>HashData<\/td>\n<td style=\"text-align: right\">192.1 ns<\/td>\n<td style=\"text-align: right\">11.67 ns<\/td>\n<td style=\"text-align: right\">0.64 ns<\/td>\n<td style=\"text-align: right\">0.0031<\/td>\n<td style=\"text-align: right\">0.0002<\/td>\n<td style=\"text-align: right\">40 B<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u56e0\u6b64\uff0c\u5982\u679c\u6211\u4eec\u4f7f\u7528\u8fd9\u4e9b\u5927\u800c\u5168\u7684\u6269\u5c55\u5e93\uff0c\u53ef\u80fd\u4f1a\u65e0\u610f\u4e2d\u5f15\u5165\u4e00\u4e9b\u8fc7\u65f6\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u5f71\u54cd\u6211\u4eec\u7684\u4ee3\u7801\u8d28\u91cf\u548c\u6027\u80fd\u3002<\/p>\n<h3 id=\"\u6848\u4f8b\u4e8c\u5b57\u7b26\u4e32\u5904\u7406\">\n\u6848\u4f8b\u4e8c\uff1a\u5b57\u7b26\u4e32\u5904\u7406\n<a href=\"#%e6%a1%88%e4%be%8b%e4%ba%8c%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%a4%84%e7%90%86\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5b57\u7b26\u4e32\u5904\u7406\u4e5f\u662f\u4e00\u4e2a\u91cd\u707e\u533a\u3002\u56e0\u4e3a\u5728\u6700\u8fd1\u51e0\u5e74\uff0c<code>Span<\/code> \u548c <code>Memory<\/code> \u7684\u5f15\u5165\uff0c.NET \u5728\u5b57\u7b26\u4e32\u5904\u7406\u65b9\u9762\u6709\u4e86\u5f88\u5927\u7684\u6539\u8fdb\u3002\u5f88\u591a\u4ee5\u524d\u9700\u8981\u5206\u914d\u5806\u5185\u5b58\u7684\u64cd\u4f5c\uff0c\u73b0\u5728\u90fd\u53ef\u4ee5\u901a\u8fc7 <code>Span&lt;char&gt;<\/code> \u6765\u5b9e\u73b0\u96f6\u5206\u914d\u7684\u9ad8\u6548\u5904\u7406\u3002\u9664\u6b64\u4e4b\u5916\uff0c\u73b0\u5728\u7684 .NET \u5e95\u5c42\u8fd8\u4f1a\u5229\u7528 SIMD \u6307\u4ee4\u96c6\u6765\u52a0\u901f\u5b57\u7b26\u4e32\u5904\u7406\u64cd\u4f5c\u3002<\/p>\n<p>\u6bd4\u5982\u6211\u89c1\u8fc7\u6709\u4e00\u4e2a\u5e93\u63d0\u4f9b\u4e86 <code>ContainsAll<\/code> \u65b9\u6cd5\uff0c\u7528\u4e8e\u68c0\u67e5\u4e00\u4e2a\u5b57\u7b26\u4e32\u662f\u5426\u5305\u542b\u591a\u4e2a\u5b50\u4e32\u3002\u8fd9\u4e2a\u65b9\u6cd5\u7684\u5b9e\u73b0\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">ContainsAll<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">source<\/span><span class=\"p\">,<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">values<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"k\">value<\/span> <span class=\"k\">in<\/span> <span class=\"n\">values<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span><span class=\"p\">)<\/span> <span class=\"p\">&lt;<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u662f\u4e00\u4e2a\u5728\u73b0\u5728\u770b\u6765\u6bd4\u8f83\u7cdf\u7cd5\u7684\u5b9e\u73b0\u3002\u5bf9\u4e8e\u5224\u65ad\u662f\u5426\u5305\u542b\u5b50\u5b57\u7b26\u4e32\u8fd9\u6837\u7684\u9700\u6c42\uff0c\u7528 <code>Contains<\/code> \u7684\u6548\u7387\u662f\u663e\u8457\u9ad8\u4e8e <code>IndexOf<\/code> \u7684\uff0c\u56e0\u4e3a <code>Contains<\/code> \u65b9\u6cd5\u5728\u5e95\u5c42\u5df2\u7ecf\u505a\u4e86\u5f88\u591a\u4f18\u5316\uff0c\u6bd4\u5982\u501f\u52a9 <code>Span<\/code>\uff0c\u4ee5\u53ca\u5229\u7528 SIMD \u6307\u4ee4\u96c6\u6765\u52a0\u901f\u641c\u7d22\u8fc7\u7a0b\u3002\u8fd9\u91cc\u5c31\u4e0d\u8d34\u8dd1\u5206\u4e86\uff0c\u6211\u5728\u81ea\u5df1\u7684\u8bbe\u5907\u4e0a\u6d4b\u51fa\u4e86\u8d85\u8fc7 40 \u500d\u7684\u6027\u80fd\u63d0\u5347\u3002<\/p>\n<p>\u6240\u4ee5\u4e00\u4e2a\u66f4\u52a0\u9ad8\u6548\u7684\u5b9e\u73b0\u65b9\u5f0f\u53ef\u4ee5\u662f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">ContainsAll<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">source<\/span><span class=\"p\">,<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">values<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">values<\/span><span class=\"p\">.<\/span><span class=\"n\">All<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u662f\u7684\uff0cLINQ \u5728\u6700\u8fd1\u51e0\u4e2a\u7248\u672c\u7684 .NET \u4e2d\u4e5f\u8fce\u6765\u4e86\u76f8\u5f53\u591a\u7684\u66f4\u65b0\u3002\u8bb8\u591a\u5e38\u7528\u7684\u65b9\u6cd5\u73b0\u5728\u90fd\u53ef\u4ee5\u505a\u5230\u6ca1\u6709 GC \u5f00\u9500\u3002\u4f46\u9057\u61be\u7684\u662f\uff0c\u8fd9\u4e9b\u65b0\u53d8\u5316\u5728\u90a3\u4e9b\u6269\u5c55\u5e93\u8bde\u751f\u7684\u5e74\u4ee3\u53ef\u80fd\u8fd8\u6ca1\u6709\u51fa\u73b0\uff0c\u6240\u4ee5\u5b83\u4eec\u7684\u5b9e\u73b0\u65b9\u5f0f\u5f80\u5f80\u6bd4\u8f83\u843d\u540e\u3002<\/p>\n<h2 id=\"\u6211\u7684\u5efa\u8bae\">\n\u6211\u7684\u5efa\u8bae\n<a href=\"#%e6%88%91%e7%9a%84%e5%bb%ba%e8%ae%ae\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u867d\u7136\u6211\u4e0a\u9762\u63d0\u5230\u4e86\u8fd9\u4e9b\u95ee\u9898\uff0c\u800c\u4e14\u6211\u786e\u5b9e\u4e0d\u5efa\u8bae\uff08\u81f3\u5c11\u662f\u5728\u73b0\u5728\uff09\u4f7f\u7528\u8fd9\u4e9b\u5927\u800c\u5168\u7684\u6269\u5c55\u5e93\uff0c\u4f46\u6211\u5e76\u4e0d\u662f\u8bf4\u5b83\u4eec\u5b8c\u5168\u6ca1\u6709\u4ef7\u503c\u3002\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u51e0\u79cd\u65b9\u5f0f\u6765\u5145\u5206\u5229\u7528\u6216\u5b66\u4e60\u5b83\u4eec\uff1a<\/p>\n<ol>\n<li>\u6211\u4eec\u8981\u9762\u5bf9\u7684\u662f\u5f88\u8001\u7684\u9879\u76ee\uff08\u4f8b\u5982 .NET Framework 4.x\uff09\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c.NET \u7684\u540e\u7eed\u5f88\u591a\u4f18\u5316\u548c\u65b0\u7684\u6807\u51c6\u5e93\u65b9\u6cd5\u90fd\u8fd8\u6ca1\u6709\u51fa\u73b0\uff0c\u6240\u4ee5\u5c31\u66f4\u8c08\u4e0d\u4e0a\u6027\u80fd\u95ee\u9898\u4e86\u3002\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u8fd9\u4e9b\u6269\u5c55\u5e93\u6765\u63d0\u5347\u5f00\u53d1\u6548\u7387\uff0c\u548c\u5f25\u8865\u65e7\u6807\u51c6\u5e93\u7f3a\u5931\u7684\u4e00\u4e9b\u529f\u80fd\u3002<\/li>\n<li>\u6211\u4eec\u53ef\u4ee5\u5b66\u4e60\u548c\u501f\u9274\u8fd9\u4e9b\u6269\u5c55\u5e93\u7684\u8bbe\u8ba1\u601d\u8def\u548c\u5b9e\u73b0\u65b9\u5f0f\u3002\u867d\u7136\u5b83\u4eec\u53ef\u80fd\u5728\u6027\u80fd\u4e0a\u4e0d\u591f\u7406\u60f3\uff0c\u4f46\u5728\u529f\u80fd\u8bbe\u8ba1\u548c API \u8bbe\u8ba1\u4e0a\uff0c\u8fd8\u662f\u6709\u5f88\u591a\u503c\u5f97\u6211\u4eec\u5b66\u4e60\u7684\u5730\u65b9\u7684\u3002<\/li>\n<li>\u6211\u4eec\u53ef\u4ee5\u4ece\u8fd9\u4e9b\u6269\u5c55\u5e93\u4e2d\u6311\u9009\u51fa\u6211\u4eec\u771f\u6b63\u9700\u8981\u7684\u529f\u80fd\uff0c\u7136\u540e\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684\u7248\u672c\uff0c\u6216\u8005\u53ea\u662f\u7b80\u5355\u5730\u590d\u5236\u7c98\u8d34\u5230\u6211\u4eec\u81ea\u5df1\u7684\u9879\u76ee\u4e2d\u3002\u8fd9\u6837\u65e2\u80fd\u6ee1\u8db3\u6211\u4eec\u7684\u9700\u6c42\uff0c\u53c8\u80fd\u907f\u514d\u5f15\u5165\u4e0d\u5fc5\u8981\u7684\u4f9d\u8d56\u548c\u6027\u80fd\u95ee\u9898\u3002<\/li>\n<\/ol>\n<p>\u603b\u4e4b\uff0c<strong>\u4e0d\u8981\u8f7b\u6613\u4f7f\u7528\u5927\u800c\u5168\u7684\u6269\u5c55\u5e93<\/strong>\uff0c\u6211\u4eec\u5e94\u8be5\u6839\u636e\u81ea\u5df1\u7684\u5b9e\u9645\u9700\u6c42\u6765\u9009\u62e9\u548c\u4f7f\u7528\u8fd9\u4e9b\u5e93\uff0c\u540c\u65f6\u4e5f\u8981\u6ce8\u610f\u5b83\u4eec\u53ef\u80fd\u5e26\u6765\u7684\u6027\u80fd\u548c\u4f9d\u8d56\u95ee\u9898\u3002<\/p>"},{"title":"\u5982\u4f55\u5728\u672c\u5730\u5ba2\u6237\u7aef\u4f7f\u7528 EF Core","link":"https:\/\/blog.coldwind.top\/posts\/use-efcore-in-client-app\/","pubDate":"Mon, 02 Feb 2026 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/use-efcore-in-client-app\/","description":"<p>Entity Framework Core (EF Core) \u662f\u4e00\u4e2a\u5f3a\u5927\u7684\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\uff08ORM\uff09\u6846\u67b6\uff0c\u901a\u5e38\u7528\u4e8e\u670d\u52a1\u5668\u7aef\u5e94\u7528\u7a0b\u5e8f\u4e2d\u4e0e\u6570\u636e\u5e93\u4ea4\u4e92\u3002\u901a\u5e38\u6211\u4eec\u4f1a\u5c06\u5b83\u7528\u4e8e ASP.NET Core \u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u5b83\u7684\u914d\u7f6e\u65b9\u5f0f\u4e5f\u7edd\u5bf9\u53ef\u4ee5\u8bf4\u662f\u76f8\u5f53\u6210\u719f\u4e86\u3002\u4f46\u6709\u65f6\u5019\u6211\u4eec\u5728\u505a\u672c\u5730\u5ba2\u6237\u7aef\u5e94\u7528\u7a0b\u5e8f\uff08\u4f8b\u5982 WPF\u3001WinForms \u6216 Avalonia \u5e94\u7528\u7a0b\u5e8f\uff09\u65f6\uff0c\u4e5f\u5e0c\u671b\u5229\u7528 EF Core \u6765\u7b80\u5316\u6570\u636e\u8bbf\u95ee\u5c42\u7684\u5f00\u53d1\u3002\u90a3\u4e48\u6211\u4eec\u9700\u8981\u6ce8\u610f\u4e9b\u4ec0\u4e48\uff1f\u6700\u4f73\u5b9e\u8df5\u662f\u600e\u6837\u7684\uff1f\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u5c31\u6765\u63a2\u8ba8\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<h2 id=\"\u56de\u987e-ef-core-\u5728-aspnet-core-\u4e2d\u7684\u4f7f\u7528\">\n\u56de\u987e EF Core \u5728 ASP.NET Core \u4e2d\u7684\u4f7f\u7528\n<a href=\"#%e5%9b%9e%e9%a1%be-ef-core-%e5%9c%a8-aspnet-core-%e4%b8%ad%e7%9a%84%e4%bd%bf%e7%94%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6211\u4eec\u6765\u5feb\u901f\u56de\u987e\u4e00\u4e0b\u5728 ASP.NET Core \u5e94\u7528\u7a0b\u5e8f\u4e2d\u4f7f\u7528 EF Core \u7684\u5178\u578b\u65b9\u5f0f\u3002\u4ee5\u4e00\u4e2a\u6bd4\u8f83\u65b0\uff08.NET 6+\uff09\u7684\u9879\u76ee\u4e3a\u4f8b\uff0c\u901a\u5e38\u6211\u4eec\u4f1a\u5728\u7a0b\u5e8f\u5165\u53e3\u8fdb\u884c\u5982\u4e0b\u7684\u914d\u7f6e\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">builder<\/span> <span class=\"p\">=<\/span> <span class=\"n\">WebApplication<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateBuilder<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u914d\u7f6e DbContext<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddDbContext<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">AppDbContext<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">options<\/span> <span class=\"p\">=&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">options<\/span><span class=\"p\">.<\/span><span class=\"n\">UseSqlServer<\/span><span class=\"p\">(<\/span><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Configuration<\/span><span class=\"p\">.<\/span><span class=\"n\">GetConnectionString<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;DefaultConnection&#34;<\/span><span class=\"p\">)));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5176\u4ed6\u670d\u52a1\u914d\u7f6e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u5176\u5b9e\u6709\u4e00\u4e2a\u9690\u5f0f\u7684\u914d\u7f6e\uff0c\u5c31\u662f\u6211\u4eec\u5c06 <code>DbContext<\/code> \u7684\u751f\u547d\u5468\u671f\u8bbe\u7f6e\u4e3a\u4e86\u4f5c\u7528\u57df\uff08Scoped\uff09\u3002\u5728 ASP.NET Core \u4e2d\uff0c\u6bcf\u4e2a HTTP \u8bf7\u6c42\u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4f5c\u7528\u57df\uff0c\u56e0\u6b64\u6bcf\u4e2a\u8bf7\u6c42\u90fd\u4f1a\u6709\u4e00\u4e2a\u72ec\u7acb\u7684 <code>DbContext<\/code> \u5b9e\u4f8b\u3002\u8fd9\u79cd\u65b9\u5f0f\u6709\u52a9\u4e8e\u786e\u4fdd\u6570\u636e\u7684\u4e00\u81f4\u6027\u548c\u9694\u79bb\u6027\u3002<\/p>\n<p>\u8fd9\u4e2a\u65b9\u6848\u5728\u670d\u52a1\u5668\u7aef\u5e94\u7528\u7a0b\u5e8f\u4e2d\u53ef\u4ee5\u8bf4\u662f\u975e\u5e38\u6807\u51c6\u4e14\u6b63\u786e\u7684\uff0c\u4f46\u662f\u8fd9\u4e2a\u95ee\u9898\u5230\u4e86\u672c\u5730\u5ba2\u6237\u7aef\uff0c\u60c5\u51b5\u5c31\u4e0d\u592a\u76f8\u540c\u4e86\u3002\u5bf9\u4e8e\u5ba2\u6237\u7aef\u7a0b\u5e8f\u6765\u8bf4\uff0c\u901a\u5e38\u5e76\u6ca1\u6709\u4f5c\u7528\u57df\u8fd9\u4e48\u4e00\u4e2a\u6982\u5ff5\u3002\u5ba2\u6237\u7aef\u7a0b\u5e8f\u4e00\u822c\u662f\u5355\u7528\u6237\u7684\uff0c\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7684\u751f\u547d\u5468\u671f\u5c31\u662f\u4e00\u4e2a\u5927\u7684\u4f5c\u7528\u57df\u3002\u5982\u679c\u6211\u4eec\u76f4\u63a5\u5c06 <code>DbContext<\/code> \u6ce8\u518c\u4e3a\u4f5c\u7528\u57df\u751f\u547d\u5468\u671f\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u5b83\u5c31\u4f1a\u53d8\u6210\u5355\u4f8b\u751f\u547d\u5468\u671f\uff0c\u8fd9\u6837\u5c31\u4f1a\u5e26\u6765\u4e00\u4e9b\u95ee\u9898\uff1a<\/p>\n<ol>\n<li><strong>\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898<\/strong>\uff1a<code>DbContext<\/code> \u4e0d\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\uff0c\u5982\u679c\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e0b\uff08\u4f8b\u5982 UI \u7ebf\u7a0b\u548c\u540e\u53f0\u7ebf\u7a0b\uff09\u5171\u4eab\u540c\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6570\u636e\u635f\u574f\u6216\u5f02\u5e38\u3002<\/li>\n<li><strong>\u5185\u5b58\u6cc4\u6f0f<\/strong>\uff1a\u957f\u65f6\u95f4\u6301\u6709 <code>DbContext<\/code> \u5b9e\u4f8b\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\uff0c\u56e0\u4e3a\u5b83\u4f1a\u8ddf\u8e2a\u6240\u6709\u7684\u5b9e\u4f53\u72b6\u6001\uff0c\u968f\u7740\u65f6\u95f4\u7684\u63a8\u79fb\uff0c\u8fd9\u4e9b\u72b6\u6001\u4f1a\u4e0d\u65ad\u7d2f\u79ef\u3002<\/li>\n<\/ol>\n<p>\u56e0\u6b64\uff0c\u5982\u4f55\u89e3\u51b3\u8fd9\u4e24\u4e2a\u95ee\u9898\u5c31\u6210\u4e86\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u4f7f\u7528 EF Core \u65f6\u9700\u8981\u91cd\u70b9\u8003\u8651\u7684\u5185\u5bb9\u3002<\/p>\n<h2 id=\"\u65b9\u6cd5\u4e00\u6ce8\u518c\u4e3a\u77ac\u6001transient\u751f\u547d\u5468\u671f\">\n\u65b9\u6cd5\u4e00\uff1a\u6ce8\u518c\u4e3a\u77ac\u6001\uff08Transient\uff09\u751f\u547d\u5468\u671f\n<a href=\"#%e6%96%b9%e6%b3%95%e4%b8%80%e6%b3%a8%e5%86%8c%e4%b8%ba%e7%9e%ac%e6%80%81transient%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6211\u4eec\u6765\u770b\u4e00\u79cd\u76f8\u5bf9\u6765\u8bf4\u6bd4\u8f83\u7b80\u5355\u7684\u65b9\u5f0f\u3002\u65e2\u7136\u6ce8\u518c\u4e3a\u4f5c\u7528\u57df\uff0c\u5b9e\u9645\u4e0a\u5c31\u76f8\u5f53\u4e8e\u5355\u4f8b\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u5c06 <code>DbContext<\/code> \u6ce8\u518c\u4e3a\u77ac\u6001\u751f\u547d\u5468\u671f\u3002\u8fd9\u6837\u5728\u6bcf\u4e2a\u88ab\u6ce8\u5165\u670d\u52a1\u7684\u7c7b\u4e2d\uff0c\u5b83\u90fd\u4f1a\u83b7\u5f97\u4e00\u4e2a\u65b0\u7684 <code>DbContext<\/code> \u5b9e\u4f8b\uff0c\u4ece\u800c\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u907f\u514d\u4e86\u4e00\u4e9b\u95ee\u9898\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6ce8\u518c DbContext \u670d\u52a1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddDbContext<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">AppDbContext<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">options<\/span> <span class=\"p\">=&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">options<\/span><span class=\"p\">.<\/span><span class=\"n\">UseSqlServer<\/span><span class=\"p\">(<\/span><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Configuration<\/span><span class=\"p\">.<\/span><span class=\"n\">GetConnectionString<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;DefaultConnection&#34;<\/span><span class=\"p\">)),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ServiceLifetime<\/span><span class=\"p\">.<\/span><span class=\"n\">Transient<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f7f\u7528 DbContext \u7684\u670d\u52a1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MyViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">AppDbContext<\/span> <span class=\"n\">_dbContext<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MyViewModel<\/span><span class=\"p\">(<\/span><span class=\"n\">AppDbContext<\/span> <span class=\"n\">dbContext<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_dbContext<\/span> <span class=\"p\">=<\/span> <span class=\"n\">dbContext<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">LoadData<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">items<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_dbContext<\/span><span class=\"p\">.<\/span><span class=\"n\">Items<\/span><span class=\"p\">.<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5904\u7406\u6570\u636e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5bf9\u4e8e\u4e00\u4e2a\u5ba2\u6237\u7aef\u7a0b\u5e8f\uff0c\u5c24\u5176\u662f MVVM \u6a21\u5f0f\uff0c\u4e00\u4e2a\u5178\u578b\u7684\u60c5\u51b5\u662f\u6211\u4eec\u5c06 <code>DbContext<\/code> \u6ce8\u5165\u5230 ViewModel \u4e2d\u4f7f\u7528\u3002\u5f53\u7136\u5bf9\u4e8e\u66f4\u590d\u6742\u7684\u573a\u666f\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u5c06\u6570\u636e\u8bbf\u95ee\u903b\u8f91\u5c01\u88c5\u5230\u4e00\u4e2a Repository \u6216 Service \u5c42\u4e2d\uff0c\u7136\u540e\u518d\u5c06\u8fd9\u4e9b\u670d\u52a1\u6ce8\u5165\u5230 ViewModel \u4e2d\u3002\u81f3\u4e8e\u6ca1\u6709\u4f7f\u7528 MVVM \u6a21\u5f0f\u7684\u60c5\u5f62\uff0c\u6211\u4eec\u57fa\u672c\u4e0a\u4e5f\u4e0d\u4f1a\u641e DI \u5bb9\u5668\uff0c\u6240\u4ee5\u4e5f\u5c31\u4e0d\u8003\u8651\u8fd9\u4e9b\u95ee\u9898\u4e86\u3002<\/div>\n<\/div>\n<p>\u90a3\u4e48\u8fd9\u6709\u6ca1\u6709\u95ee\u9898\u5462\uff1f\u7b54\u6848\u662f\u6709\u7684\uff0c\u800c\u4e14\u8fd9\u4e2a\u65b9\u6848\u5e76\u4e0d\u7406\u60f3\u3002\u6bd4\u5982\u6211\u4eec\u770b\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86 CommunityToolkit.Mvvm \u6765\u7b80\u5316 ViewModel \u7684\u7f16\u5199\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span> <span class=\"p\">:<\/span> <span class=\"n\">ViewModelBase<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">AppDbContext<\/span> <span class=\"n\">_dbContext<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [ObservableProperty]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">ObservableCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Item<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_loadedItems<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">(<\/span><span class=\"n\">AppDbContext<\/span> <span class=\"n\">dbContext<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_dbContext<\/span> <span class=\"p\">=<\/span> <span class=\"n\">dbContext<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [RelayCommand(AllowConcurrent = true)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">LoadDataAsync<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">_dbContext<\/span><span class=\"p\">.<\/span><span class=\"n\">Items<\/span><span class=\"p\">.<\/span><span class=\"n\">ToListAsync<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">LoadedItems<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">items<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u5c06 <code>DbContext<\/code> \u6ce8\u5165\u5230\u4e86 <code>MainViewModel<\/code> \u4e2d\uff0c\u5e76\u4e14\u5728 <code>LoadDataAsync<\/code> \u65b9\u6cd5\u4e2d\u4f7f\u7528\u5b83\u6765\u52a0\u8f7d\u6570\u636e\u3002\u8fd9\u91cc\u5176\u5b9e\u5c31\u5df2\u7ecf\u51fa\u73b0\u4e0d\u5c11\u95ee\u9898\u4e86\uff1a<\/p>\n<ol>\n<li><code>MainViewModel<\/code> \u7684\u5b9e\u4f8b\u901a\u5e38\u751f\u547d\u5468\u671f\u975e\u5e38\u957f\uff08\u53ef\u80fd\u4e0e\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f\u76f8\u540c\uff09\uff0c\u800c <code>DbContext<\/code> \u88ab\u6ce8\u518c\u4e3a\u77ac\u6001\u751f\u547d\u5468\u671f\uff0c\u8fd9\u5c31\u610f\u5473\u7740\u6bcf\u6b21\u8c03\u7528 <code>LoadDataAsync<\/code> \u65b9\u6cd5\u65f6\uff0c\u5b9e\u9645\u4e0a\u90fd\u662f\u5728\u4f7f\u7528\u540c\u4e00\u4e2a <code>DbContext<\/code> \u5b9e\u4f8b\u3002\u90a3\u8fd9\u5176\u5b9e\u5e76\u6ca1\u6709\u6bd4\u5355\u4f8b\u5f3a\u591a\u5c11\uff0c\u6700\u591a\u5c31\u662f\u4e0d\u7528\u548c\u5176\u4ed6\u670d\u52a1\u5171\u7528\u540c\u4e00\u4e2a\u5b9e\u4f8b\u800c\u5df2\u3002\u957f\u65f6\u95f4\u4f7f\u7528\u4e0b\u53bb\uff0c<code>DbContext<\/code> \u4ecd\u7136\u4f1a\u79ef\u7d2f\u5927\u91cf\u7684\u72b6\u6001\uff0c\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\u7684\u95ee\u9898\u3002<\/li>\n<li>\u8fd9\u91cc\u6211\u6545\u610f\u5c06 <code>LoadDataAsync<\/code> \u65b9\u6cd5\u8bbe\u7f6e\u4e3a\u5141\u8bb8\u5e76\u53d1\u6267\u884c\uff08<code>AllowConcurrent = true<\/code>\uff09\u3002\u8fd9\u5c31\u610f\u5473\u7740\u5982\u679c\u7528\u6237\u5feb\u901f\u591a\u6b21\u70b9\u51fb\u52a0\u8f7d\u6309\u94ae\uff0c\u5c31\u4f1a\u5bfc\u81f4\u591a\u4e2a\u7ebf\u7a0b\u540c\u65f6\u8bbf\u95ee\u540c\u4e00\u4e2a <code>DbContext<\/code> \u5b9e\u4f8b\uff0c\u4ece\u800c\u5f15\u53d1\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u3002<\/li>\n<\/ol>\n<p>\u6240\u4ee5\u8bf4\uff0c\u867d\u7136\u5c06 <code>DbContext<\/code> \u6ce8\u518c\u4e3a\u77ac\u6001\u751f\u547d\u5468\u671f\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u53ef\u4ee5\u5de5\u4f5c\uff0c\u4f46\u5b83\u5e76\u4e0d\u662f\u4e00\u4e2a\u7406\u60f3\u7684\u89e3\u51b3\u65b9\u6848\u3002\u9664\u975e\u6211\u4eec\u80fd\u4fdd\u8bc1\u4f7f\u7528\u5b83\u7684\u4ee3\u7801\u7edd\u5bf9\u4e0d\u4f1a\u5e76\u53d1\u6267\u884c\uff0c\u5e76\u4e14\u751f\u547d\u5468\u671f\u6bd4\u8f83\u77ed\uff08\u6bd4\u5982\u4e00\u4e2a\u8868\u5355\u7684\u89c6\u56fe\u6a21\u578b\uff09\uff0c\u5426\u5219\u6211\u4eec\u8fd8\u662f\u9700\u8981\u5bfb\u627e\u66f4\u597d\u7684\u65b9\u6cd5\u3002<\/p>\n<h2 id=\"\u65b9\u6cd5\u4e8c\u4e3a\u670d\u52a1\u6ce8\u5165\u4f5c\u7528\u57df\">\n\u65b9\u6cd5\u4e8c\uff1a\u4e3a\u670d\u52a1\u6ce8\u5165\u4f5c\u7528\u57df\n<a href=\"#%e6%96%b9%e6%b3%95%e4%ba%8c%e4%b8%ba%e6%9c%8d%e5%8a%a1%e6%b3%a8%e5%85%a5%e4%bd%9c%e7%94%a8%e5%9f%9f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u65e2\u7136\u4e0a\u9762\u7684\u601d\u8def\u8d70\u4e0d\u901a\uff0c\u6211\u4eec\u6050\u6015\u5c31\u4e0d\u80fd\u7b80\u5355\u5730\u7ed9\u89c6\u56fe\u6a21\u578b\u76f4\u63a5\u6ce8\u5165 <code>DbContext<\/code> \u4e86\u3002\u4e3a\u4e86\u89e3\u51b3\u4e0a\u9762\u7684\u95ee\u9898\uff0c\u6211\u4eec\u5e94\u8be5\u8ba9\u89c6\u56fe\u6a21\u578b\u64cd\u4f5c\u6570\u636e\u5e93\u7684\u65b9\u6cd5\u6709\u673a\u4f1a\u6bcf\u6b21\u90fd\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u5b9e\u4f8b\u3002\u987a\u7740\u8fd9\u4e2a\u601d\u8def\uff0c\u6211\u4eec\u53ef\u4ee5\u8ba9 <code>DbContext<\/code> \u7ee7\u7eed\u6ce8\u518c\u4e3a\u4f5c\u7528\u57df\u751f\u547d\u5468\u671f\uff0c\u7136\u540e\u4e3a\u89c6\u56fe\u6a21\u578b\u6ce8\u5165\u4e00\u4e2a <code>IServiceScopeFactory<\/code>\uff0c\u6bcf\u6b21\u9700\u8981\u8bbf\u95ee\u6570\u636e\u5e93\u65f6\uff0c\u5c31\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4f5c\u7528\u57df\uff0c\u4ece\u800c\u83b7\u5f97\u4e00\u4e2a\u65b0\u7684 <code>DbContext<\/code> \u5b9e\u4f8b\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span> <span class=\"p\">:<\/span> <span class=\"n\">ViewModelBase<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">IServiceScopeFactory<\/span> <span class=\"n\">_scopeFactory<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [ObservableProperty]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">ObservableCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Item<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_loadedItems<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">(<\/span><span class=\"n\">IServiceScopeFactory<\/span> <span class=\"n\">scopeFactory<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_scopeFactory<\/span> <span class=\"p\">=<\/span> <span class=\"n\">scopeFactory<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [RelayCommand(AllowConcurrent = true)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">LoadDataAsync<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">scope<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_scopeFactory<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateScope<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">dbContext<\/span> <span class=\"p\">=<\/span> <span class=\"n\">scope<\/span><span class=\"p\">.<\/span><span class=\"n\">ServiceProvider<\/span><span class=\"p\">.<\/span><span class=\"n\">GetRequiredService<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">AppDbContext<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">dbContext<\/span><span class=\"p\">.<\/span><span class=\"n\">Items<\/span><span class=\"p\">.<\/span><span class=\"n\">ToListAsync<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">LoadedItems<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">items<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u8fd9\u91cc\u6211\u4eec\u4e3a <code>scope<\/code> \u4f7f\u7528\u4e86 <code>using<\/code> \u8bed\u53e5\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u786e\u4fdd\u5728\u65b9\u6cd5\u6267\u884c\u5b8c\u6210\u540e\uff0c\u4f5c\u7528\u57df\u4f1a\u88ab\u6b63\u786e\u5730\u91ca\u653e\uff0c\u4ece\u800c\u907f\u514d\u5185\u5b58\u6cc4\u6f0f\u7684\u95ee\u9898\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u6211\u4eec\u6ca1\u6709\u4e3a <code>dbContext<\/code> \u4f7f\u7528 <code>using<\/code> \u8bed\u53e5\uff0c\u56e0\u4e3a\u5b83\u662f\u7531 <code>scope<\/code> \u7ba1\u7406\u7684\uff0c\u800c\u540e\u8005\u4f1a\u5728 <code>using<\/code> \u5757\u7ed3\u675f\u65f6\u81ea\u52a8\u91ca\u653e\u5b83\u6240\u521b\u5efa\u7684\u6240\u6709\u670d\u52a1\u5b9e\u4f8b\u3002<\/div>\n<\/div>\n<h2 id=\"\u65b9\u6cd5\u4e09\u4f7f\u7528-idbcontextfactory\">\n\u65b9\u6cd5\u4e09\uff1a\u4f7f\u7528 <code>IDbContextFactory<\/code>\n<a href=\"#%e6%96%b9%e6%b3%95%e4%b8%89%e4%bd%bf%e7%94%a8-idbcontextfactory\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6216\u8005\u6211\u4eec\u8fd8\u53ef\u4ee5\u66f4\u7b80\u5355\u4e00\u4e9b\uff0c\u6211\u4eec\u76f4\u63a5\u5c06 <code>DbContext<\/code> \u6ce8\u518c\u4e3a\u77ac\u6001\u751f\u547d\u5468\u671f\uff0c\u7136\u540e\u4e3a\u89c6\u56fe\u6a21\u578b\u6ce8\u5165\u4e00\u4e2a <code>IDbContextFactory&lt;AppDbContext&gt;<\/code>\uff0c\u6bcf\u6b21\u9700\u8981\u8bbf\u95ee\u6570\u636e\u5e93\u65f6\uff0c\u5c31\u901a\u8fc7\u5de5\u5382\u521b\u5efa\u4e00\u4e2a\u65b0\u7684 <code>DbContext<\/code> \u5b9e\u4f8b\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span> <span class=\"p\">:<\/span> <span class=\"n\">ViewModelBase<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">IDbContextFactory<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">AppDbContext<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_dbContextFactory<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [ObservableProperty]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">ObservableCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Item<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_loadedItems<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">(<\/span><span class=\"n\">IDbContextFactory<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">AppDbContext<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">dbContextFactory<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_dbContextFactory<\/span> <span class=\"p\">=<\/span> <span class=\"n\">dbContextFactory<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [RelayCommand(AllowConcurrent = true)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">LoadDataAsync<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">dbContext<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_dbContextFactory<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateDbContext<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">dbContext<\/span><span class=\"p\">.<\/span><span class=\"n\">Items<\/span><span class=\"p\">.<\/span><span class=\"n\">ToListAsync<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">LoadedItems<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">items<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\uff0c\u6211\u4eec\u8fd8\u8981\u7a0d\u5fae\u4fee\u6539\u4e00\u4e0b\u670d\u52a1\u7684\u6ce8\u518c\u3002\u8fd9\u6b21\u6211\u4eec\u5c31\u4e0d\u7528 <code>AddDbContext<\/code> \u4e86\uff0c\u800c\u662f\u4f7f\u7528 <code>AddDbContextFactory<\/code> \u6765\u6ce8\u518c <code>DbContext<\/code> \u5de5\u5382\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6ce8\u518c DbContext \u5de5\u5382<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddDbContextFactory<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">AppDbContext<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">options<\/span> <span class=\"p\">=&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">options<\/span><span class=\"p\">.<\/span><span class=\"n\">UseSqlServer<\/span><span class=\"p\">(<\/span><span class=\"n\">connectionString<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u4f7f\u7528\u5de5\u5382\u65b9\u6cd5\u521b\u5efa\u4e00\u4e2a <code>DbContext<\/code> \u7684\u5b9e\u4f8b\u5c31\u7c7b\u4f3c\u4e8e\u6211\u4eec\u624b\u52a8\u4f7f\u7528 <code>new<\/code> \u5173\u952e\u5b57\u521b\u5efa\u4e00\u4e2a\u5bf9\u8c61\u4e00\u6837\u3002\u6bcf\u6b21\u8c03\u7528 <code>CreateDbContext<\/code> \u65b9\u6cd5\u65f6\uff0c\u90fd\u4f1a\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684 <code>DbContext<\/code> \u5b9e\u4f8b\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u907f\u514d\u7ebf\u7a0b\u5b89\u5168\u548c\u5185\u5b58\u6cc4\u6f0f\u7684\u95ee\u9898\u3002\u4f46\u56e0\u6b64\u6211\u4eec\u4e5f\u8981\u624b\u52a8\u5904\u7406\u5b83\u7684\u751f\u547d\u5468\u671f\uff0c\u786e\u4fdd\u5728\u4f7f\u7528\u5b8c\u6210\u540e\u6b63\u786e\u5730\u91ca\u653e\u5b83\u3002\u6240\u4ee5\u4e0a\u9762\u6211\u4eec\u5bf9\u5b83\u4f7f\u7528\u4e86 <code>using<\/code> \u8bed\u53e5\u3002<\/div>\n<\/div>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u603b\u7684\u6765\u8bf4\uff0c\u5728\u672c\u5730\u5ba2\u6237\u7aef\u5e94\u7528\u7a0b\u5e8f\u4e2d\u4f7f\u7528 EF Core \u65f6\uff0c\u6211\u4eec\u9700\u8981\u7279\u522b\u6ce8\u610f <code>DbContext<\/code> \u7684\u751f\u547d\u5468\u671f\u4ee5\u53ca\u7ebf\u7a0b\u5b89\u5168\u3002\u53ea\u8981\u89e3\u51b3\u4e86\u8fd9\u4e24\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u653e\u5fc3\u5730\u5728\u5ba2\u6237\u7aef\u7a0b\u5e8f\u4e2d\u4f7f\u7528 EF Core \u6765\u7b80\u5316\u6570\u636e\u8bbf\u95ee\u5c42\u7684\u5f00\u53d1\u3002<\/p>"},{"title":"\u5982\u4f55\u5728\u7c7b\u5916\u79fb\u9664\u7c7b\u7684\u4e8b\u4ef6\u8ba2\u9605\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/how-to-remove-event-handler-outside-a-class.md\/","pubDate":"Thu, 22 Jan 2026 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/how-to-remove-event-handler-outside-a-class.md\/","description":"<p>\u67d0\u4e9b\u65f6\u5019\uff0c\u6211\u4eec\u51fa\u4e8e\u5bf9\u7b2c\u4e09\u65b9\u7c7b\u5e93\u7684\u5b9a\u5236\u9700\u6c42\uff0c\u53ef\u80fd\u9700\u8981\u5728\u7c7b\u5916\u79fb\u9664\u8be5\u7c7b\u7684\u4e8b\u4ef6\u8ba2\u9605\u3002\u7136\u800c\uff0c\u4e8b\u4ef6\u672c\u8eab\u5c31\u662f\u4e00\u4e2a\u5c01\u88c5\u826f\u597d\u7684\u6210\u5458\uff0c\u76f4\u63a5\u8bbf\u95ee\u548c\u4fee\u6539\u4e8b\u4ef6\u7684\u8ba2\u9605\u5217\u8868\u5e76\u4e0d\u5bb9\u6613\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c\u4e3a\u4e8b\u4ef6\u6ce8\u518c\u7684\u65b9\u6cd5\u53ef\u80fd\u8fd8\u662f\u79c1\u6709\u7684\uff0c\u8fd9\u66f4\u662f\u589e\u52a0\u4e86\u96be\u5ea6\u3002\u6211\u4eec\u8fd9\u6b21\u5c31\u6765\u63a2\u8ba8\u5982\u4f55\u901a\u8fc7\u53cd\u5c04\u673a\u5236\u5b9e\u73b0\u8fd9\u4e00\u76ee\u6807\u3002<\/p>\n<h2 id=\"\u7b80\u5355\u60c5\u51b5\">\n\u7b80\u5355\u60c5\u51b5\n<a href=\"#%e7%ae%80%e5%8d%95%e6%83%85%e5%86%b5\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6211\u4eec\u5148\u6765\u770b\u4e00\u4e2a\u6700\u57fa\u672c\u7684\u4f8b\u5b50\u3002\u8fd9\u91cc\u6709\u4e00\u4e2a <code>Demo<\/code> \u7c7b\uff0c\u5b83\u5b9a\u4e49\u4e86\u4e00\u4e2a\u4e8b\u4ef6 <code>MyEvent<\/code>\uff0c\u5e76\u5728\u6784\u9020\u51fd\u6570\u4e2d\u4e3a\u8be5\u4e8b\u4ef6\u6ce8\u518c\u4e86\u4e00\u4e2a\u4e8b\u4ef6\u5904\u7406\u5668 <code>MyEventHandler<\/code>\uff0c\u5e76\u4e14\u4e5f\u662f\u8fd9\u4e2a\u7c7b\u7684\u79c1\u6709\u65b9\u6cd5\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Demo<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Demo<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">MyEvent<\/span> <span class=\"p\">+=<\/span> <span class=\"n\">MyEventHandler<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">event<\/span> <span class=\"n\">EventHandler<\/span><span class=\"p\">?<\/span> <span class=\"n\">MyEvent<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">void<\/span> <span class=\"n\">MyEventHandler<\/span><span class=\"p\">(<\/span><span class=\"kt\">object?<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">EventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyEvent event triggered&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u8fd9\u4e2a\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u53cd\u5c04\u6765\u62ff\u5230 <code>MyEvent<\/code> \u4e8b\u4ef6\u7684\u5e95\u5c42\u5b57\u6bb5\uff0c\u7136\u540e\u5c06\u5b83\u7f6e\u7a7a\uff0c\u4ece\u800c\u79fb\u9664\u6240\u6709\u7684\u4e8b\u4ef6\u8ba2\u9605\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">demo<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Demo<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">Demo<\/span><span class=\"p\">).<\/span><span class=\"n\">GetField<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyEvent&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span> <span class=\"p\">|<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">NonPublic<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">eventField<\/span><span class=\"p\">.<\/span><span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">demo<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u4e00\u6765\uff0c<code>MyEvent<\/code> \u4e8b\u4ef6\u7684\u6240\u6709\u8ba2\u9605\u90fd\u88ab\u79fb\u9664\u4e86\u3002<\/p>\n<h2 id=\"\u4e8b\u4ef6\u58f0\u660e\u5728\u57fa\u7c7b\u4e0a\">\n\u4e8b\u4ef6\u58f0\u660e\u5728\u57fa\u7c7b\u4e0a\n<a href=\"#%e4%ba%8b%e4%bb%b6%e5%a3%b0%e6%98%8e%e5%9c%a8%e5%9f%ba%e7%b1%bb%e4%b8%8a\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6709\u65f6\u5019\uff0c\u4e8b\u4ef6\u53ef\u80fd\u58f0\u660e\u5728\u7c7b\u7684\u57fa\u7c7b\u4e0a\uff0c\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Base<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">event<\/span> <span class=\"n\">EventHandler<\/span><span class=\"p\">?<\/span> <span class=\"n\">MyEvent<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Demo<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Base<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Demo<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">MyEvent<\/span> <span class=\"p\">+=<\/span> <span class=\"n\">MyEventHandler<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">void<\/span> <span class=\"n\">MyEventHandler<\/span><span class=\"p\">(<\/span><span class=\"kt\">object?<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">EventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyEvent event triggered&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u65f6\u5019\u4e0a\u9762\u7684\u65b9\u6cd5\u5c31\u4e0d\u594f\u6548\u4e86\u3002\u6211\u4eec\u9700\u8981\u5728\u53cd\u5c04\u65f6\u6307\u5b9a\u6b63\u786e\u7684\u7c7b\u578b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">Base<\/span><span class=\"p\">).<\/span><span class=\"n\">GetField<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyEvent&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span> <span class=\"p\">|<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">NonPublic<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">eventField<\/span><span class=\"p\">.<\/span><span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">demo<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u518d\u590d\u6742\u4e00\u70b9\uff0c\u6211\u4eec\u751a\u81f3\u90fd\u4e0d\u77e5\u9053\u8fd9\u4e2a\u4e8b\u4ef6\u5230\u5e95\u58f0\u660e\u5728\u54ea\u4e2a\u7c7b\u4e0a\uff0c\u8fd9\u65f6\u5019\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u904d\u5386\u7ee7\u627f\u94fe\u6765\u67e5\u627e\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">Type<\/span><span class=\"p\">?<\/span> <span class=\"n\">type<\/span> <span class=\"p\">=<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">Demo<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">FieldInfo<\/span><span class=\"p\">?<\/span> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"n\">type<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"n\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">GetField<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyEvent&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span> <span class=\"p\">|<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">NonPublic<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">eventField<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">type<\/span> <span class=\"p\">=<\/span> <span class=\"n\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">BaseType<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">eventField<\/span><span class=\"p\">.<\/span><span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">demo<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u79fb\u9664\u7279\u5b9a\u7684\u4e8b\u4ef6\u5904\u7406\u65b9\u6cd5\">\n\u79fb\u9664\u7279\u5b9a\u7684\u4e8b\u4ef6\u5904\u7406\u65b9\u6cd5\n<a href=\"#%e7%a7%bb%e9%99%a4%e7%89%b9%e5%ae%9a%e7%9a%84%e4%ba%8b%e4%bb%b6%e5%a4%84%e7%90%86%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e0a\u9762\u7684\u65b9\u6cd5\u90fd\u4f1a\u79fb\u9664\u6240\u6709\u7684\u4e8b\u4ef6\u8ba2\u9605\u3002\u5982\u679c\u6211\u4eec\u53ea\u60f3\u79fb\u9664\u7279\u5b9a\u7684\u65b9\u6cd5\u600e\u4e48\u529e\uff1f\u6b64\u65f6\u6211\u4eec\u6709\u4e24\u79cd\u65b9\u5f0f\u3002\u9996\u5148\u6211\u4eec\u53ef\u4ee5\u5c1d\u8bd5\u83b7\u53d6\u4e8b\u4ef6\u7684\u59d4\u6258\u5b9e\u4f8b\uff0c\u7136\u540e\u4ece\u4e2d\u79fb\u9664\u7279\u5b9a\u7684\u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">Demo<\/span><span class=\"p\">).<\/span><span class=\"n\">GetField<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyEvent&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span> <span class=\"p\">|<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">NonPublic<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">eventDelegate<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">MulticastDelegate<\/span><span class=\"p\">?)<\/span><span class=\"n\">eventField<\/span><span class=\"p\">.<\/span><span class=\"n\">GetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">demo<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">eventDelegate<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">handler<\/span> <span class=\"k\">in<\/span> <span class=\"n\">eventDelegate<\/span><span class=\"p\">.<\/span><span class=\"n\">GetInvocationList<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">handler<\/span><span class=\"p\">.<\/span><span class=\"n\">Method<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span> <span class=\"p\">==<\/span> <span class=\"s\">&#34;MyEventHandler&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">eventDelegate<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">MulticastDelegate<\/span><span class=\"p\">?)<\/span><span class=\"n\">Delegate<\/span><span class=\"p\">.<\/span><span class=\"n\">Remove<\/span><span class=\"p\">(<\/span><span class=\"n\">eventDelegate<\/span><span class=\"p\">,<\/span> <span class=\"n\">handler<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">eventField<\/span><span class=\"p\">.<\/span><span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">demo<\/span><span class=\"p\">,<\/span> <span class=\"n\">eventDelegate<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">C# \u4e2d\u4e8b\u4ef6\u662f\u57fa\u4e8e\u59d4\u6258\u5b9e\u73b0\u7684\u3002\u6bcf\u4e2a\u4e8b\u4ef6\u5728\u5e95\u5c42\u90fd\u6709\u4e00\u4e2a\u4e0e\u4e4b\u5173\u8054\u7684\u59d4\u6258\u5b57\u6bb5\uff0c\u8fd9\u4e2a\u5b57\u6bb5\u4fdd\u5b58\u4e86\u6240\u6709\u6ce8\u518c\u5230\u8be5\u4e8b\u4ef6\u7684\u5904\u7406\u65b9\u6cd5\u3002\u5f53\u4e8b\u4ef6\u88ab\u89e6\u53d1\u65f6\uff0c\u5b9e\u9645\u4e0a\u662f\u8c03\u7528\u8fd9\u4e2a\u59d4\u6258\uff0c\u4ece\u800c\u4f9d\u6b21\u8c03\u7528\u6240\u6709\u6ce8\u518c\u7684\u65b9\u6cd5\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u8fd9\u4e2a\u59d4\u6258\u901a\u5e38\u662f\u4e00\u4e2a\u591a\u64ad\u59d4\u6258\uff08Multicast Delegate\uff09\uff0c\u5b83\u4e0a\u9762\u6709\u4e00\u4e2a\u65b9\u6cd5\u5217\u8868\uff0c\u5305\u542b\u4e86\u6240\u6709\u6ce8\u518c\u7684\u4e8b\u4ef6\u5904\u7406\u5668\u3002<\/div>\n<\/div>\n<p>\u53e6\u4e00\u79cd\u65b9\u5f0f\u662f\u76f4\u63a5\u901a\u8fc7\u53cd\u5c04\u83b7\u53d6\u7279\u5b9a\u7684\u65b9\u6cd5\uff0c\u7136\u540e\u501f\u52a9 <code>Delegate<\/code> \u521b\u9020\u8fd9\u4e2a\u65b9\u6cd5\u7684\u59d4\u6258\u5b9e\u4f8b\uff0c\u518d\u4ece\u4e8b\u4ef6\u4e2d\u79fb\u9664\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">methodInfo<\/span> <span class=\"p\">=<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">Demo<\/span><span class=\"p\">).<\/span><span class=\"n\">GetMethod<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyEventHandler&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span> <span class=\"p\">|<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">NonPublic<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">eventInfo<\/span> <span class=\"p\">=<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">Demo<\/span><span class=\"p\">).<\/span><span class=\"n\">GetEvent<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyEvent&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span> <span class=\"p\">|<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Public<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">handlerDelegate<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Delegate<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateDelegate<\/span><span class=\"p\">(<\/span><span class=\"n\">eventInfo<\/span><span class=\"p\">.<\/span><span class=\"n\">EventHandlerType<\/span><span class=\"p\">,<\/span> <span class=\"n\">demo<\/span><span class=\"p\">,<\/span> <span class=\"n\">methodInfo<\/span><span class=\"p\">!);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">eventInfo<\/span><span class=\"p\">.<\/span><span class=\"n\">RemoveEventHandler<\/span><span class=\"p\">(<\/span><span class=\"n\">demo<\/span><span class=\"p\">,<\/span> <span class=\"n\">handlerDelegate<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u901a\u8fc7\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u7c7b\u5916\u6210\u529f\u5730\u79fb\u9664\u7c7b\u7684\u4e8b\u4ef6\u8ba2\u9605\u4e86\u3002<\/p>\n<h2 id=\"\u6574\u7406\u4e3a\u901a\u7528\u65b9\u6cd5\">\n\u6574\u7406\u4e3a\u901a\u7528\u65b9\u6cd5\n<a href=\"#%e6%95%b4%e7%90%86%e4%b8%ba%e9%80%9a%e7%94%a8%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\uff0c\u7ed3\u5408\u4e0a\u9762\u7684\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u4e24\u4e2a\u901a\u7528\u7684\u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">void<\/span> <span class=\"n\">ClearEventHandler<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">obj<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">eventName<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">handlerName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Type<\/span><span class=\"p\">?<\/span> <span class=\"n\">type<\/span> <span class=\"p\">=<\/span> <span class=\"n\">obj<\/span><span class=\"p\">.<\/span><span class=\"n\">GetType<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">FieldInfo<\/span><span class=\"p\">?<\/span> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"n\">type<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"n\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">GetField<\/span><span class=\"p\">(<\/span><span class=\"n\">eventName<\/span><span class=\"p\">,<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span> <span class=\"p\">|<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">NonPublic<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">eventField<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">type<\/span> <span class=\"p\">=<\/span> <span class=\"n\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">BaseType<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">eventField<\/span> <span class=\"k\">is<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">InvalidOperationException<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;Event field &#39;{eventName}&#39; not found.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">eventDelegate<\/span> <span class=\"p\">=<\/span> <span class=\"n\">eventField<\/span><span class=\"p\">.<\/span><span class=\"n\">GetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">obj<\/span><span class=\"p\">)<\/span> <span class=\"k\">as<\/span> <span class=\"n\">MulticastDelegate<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">eventDelegate<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">handler<\/span> <span class=\"k\">in<\/span> <span class=\"n\">eventDelegate<\/span><span class=\"p\">.<\/span><span class=\"n\">GetInvocationList<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">handler<\/span><span class=\"p\">.<\/span><span class=\"n\">Method<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span> <span class=\"p\">==<\/span> <span class=\"n\">handlerName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">eventDelegate<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">MulticastDelegate<\/span><span class=\"p\">?)<\/span><span class=\"n\">Delegate<\/span><span class=\"p\">.<\/span><span class=\"n\">Remove<\/span><span class=\"p\">(<\/span><span class=\"n\">eventDelegate<\/span><span class=\"p\">,<\/span> <span class=\"n\">handler<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">eventField<\/span><span class=\"p\">.<\/span><span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">obj<\/span><span class=\"p\">,<\/span> <span class=\"n\">eventDelegate<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">void<\/span> <span class=\"n\">ClearAllEventHandlers<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">obj<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">eventName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Type<\/span><span class=\"p\">?<\/span> <span class=\"n\">type<\/span> <span class=\"p\">=<\/span> <span class=\"n\">obj<\/span><span class=\"p\">.<\/span><span class=\"n\">GetType<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">FieldInfo<\/span><span class=\"p\">?<\/span> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"n\">type<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">eventField<\/span> <span class=\"p\">=<\/span> <span class=\"n\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">GetField<\/span><span class=\"p\">(<\/span><span class=\"n\">eventName<\/span><span class=\"p\">,<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">Instance<\/span> <span class=\"p\">|<\/span> <span class=\"n\">BindingFlags<\/span><span class=\"p\">.<\/span><span class=\"n\">NonPublic<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">eventField<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">type<\/span> <span class=\"p\">=<\/span> <span class=\"n\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">BaseType<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">eventField<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">eventField<\/span><span class=\"p\">.<\/span><span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">obj<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u5206\u522b\u7528\u4e8e\u79fb\u9664\u7279\u5b9a\u7684\u4e8b\u4ef6\u5904\u7406\u65b9\u6cd5\u548c\u79fb\u9664\u6240\u6709\u7684\u4e8b\u4ef6\u8ba2\u9605\u3002\u5e76\u4e14\u5b83\u4eec\u90fd\u80fd\u5904\u7406\u4e8b\u4ef6\u58f0\u660e\u5728\u4efb\u610f\u57fa\u7c7b\u4e0a\u7684\u60c5\u51b5\u3002<\/p>"},{"title":"\u5982\u4f55\u5728 C# \u4e2d\u83b7\u53d6\u672c\u673a\u771f\u5b9e IP \u5730\u5740\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/how-to-get-real-local-ip-address\/","pubDate":"Thu, 15 Jan 2026 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/how-to-get-real-local-ip-address\/","description":"<p>\u83b7\u53d6\u672c\u673a IP\n\u5730\u5740\u542c\u8d77\u6765\u662f\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684\u9700\u6c42\uff0c\u4f46\u5b9e\u9645\u64cd\u4f5c\u8d77\u6765\u5374\u5e76\u4e0d\u5bb9\u6613\u3002\u865a\u62df\u7f51\u5361\u3001IPv6\u3001APIPA\n\u5730\u5740\u7b49\u56e0\u7d20\u4f1a\u8ba9\u6211\u4eec\u83b7\u53d6\u5230\u4e00\u5927\u5806 IP\uff0c\u800c\u5982\u4f55\u4ece\u4e2d\u7b5b\u9009\u51fa\u771f\u6b63\u60f3\u8981\u7684\u5c40\u57df\u7f51 IP\n\u624d\u662f\u6211\u4eec\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3002<\/p>\n<h2 id=\"\u5e38\u89c1\u7684\u5751\">\n\u5e38\u89c1\u7684\u5751\n<a href=\"#%e5%b8%b8%e8%a7%81%e7%9a%84%e5%9d%91\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"1-\u83b7\u53d6\u5230\u4e00\u5806-ip-\u5730\u5740\">\n1. \u83b7\u53d6\u5230\u4e00\u5806 IP \u5730\u5740\n<a href=\"#1-%e8%8e%b7%e5%8f%96%e5%88%b0%e4%b8%80%e5%a0%86-ip-%e5%9c%b0%e5%9d%80\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u6700\u76f4\u63a5\u7684\u60f3\u6cd5\u53ef\u80fd\u662f\u4f7f\u7528 <code>Dns.GetHostAddresses<\/code> \u6216 <code>Dns.GetHostEntry<\/code>\n\u6765\u83b7\u53d6\u672c\u673a\u6240\u6709\u7684 IP \u5730\u5740\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">hostName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Dns<\/span><span class=\"p\">.<\/span><span class=\"n\">GetHostName<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">ipAddresses<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Dns<\/span><span class=\"p\">.<\/span><span class=\"n\">GetHostEntry<\/span><span class=\"p\">(<\/span><span class=\"n\">hostName<\/span><span class=\"p\">).<\/span><span class=\"n\">AddressList<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">ip<\/span> <span class=\"k\">in<\/span> <span class=\"n\">ipAddresses<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">ip<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd0\u884c\u540e\u4f60\u53ef\u80fd\u4f1a\u770b\u5230\u7c7b\u4f3c\u8fd9\u6837\u7684\u8f93\u51fa\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">192.168.1.100\n<\/span><\/span><span class=\"line\"><span class=\"cl\">169.254.123.45\n<\/span><\/span><span class=\"line\"><span class=\"cl\">172.17.0.1\n<\/span><\/span><span class=\"line\"><span class=\"cl\">10.0.75.1\n<\/span><\/span><span class=\"line\"><span class=\"cl\">192.168.56.1\n<\/span><\/span><span class=\"line\"><span class=\"cl\">fe80::1234:5678:abcd:ef01%12\n<\/span><\/span><span class=\"line\"><span class=\"cl\">::1\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e48\u591a IP \u5730\u5740\uff0c\u5230\u5e95\u54ea\u4e2a\u624d\u662f\u6211\u4eec\u60f3\u8981\u7684\u771f\u5b9e\u5c40\u57df\u7f51 IP\uff1f<\/p>\n<h3 id=\"2-\u865a\u62df\u7f51\u5361\u7684\u5e72\u6270\">\n2. \u865a\u62df\u7f51\u5361\u7684\u5e72\u6270\n<a href=\"#2-%e8%99%9a%e6%8b%9f%e7%bd%91%e5%8d%a1%e7%9a%84%e5%b9%b2%e6%89%b0\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u73b0\u4ee3\u8ba1\u7b97\u673a\u4e0a\u901a\u5e38\u4f1a\u5b58\u5728\u591a\u79cd\u7c7b\u578b\u7684\u7f51\u7edc\u9002\u914d\u5668\uff1a<\/p>\n<ul>\n<li><strong>\u7269\u7406\u7f51\u5361<\/strong>\uff1a\u771f\u5b9e\u7684\u4ee5\u592a\u7f51\u5361\u6216 Wi-Fi \u9002\u914d\u5668<\/li>\n<li><strong>\u865a\u62df\u7f51\u5361<\/strong>\uff1a\n<ul>\n<li>VMware\u3001VirtualBox\u3001Hyper-V \u7b49\u865a\u62df\u673a\u8f6f\u4ef6\u521b\u5efa\u7684\u865a\u62df\u7f51\u5361<\/li>\n<li>Docker Desktop \u521b\u5efa\u7684\u865a\u62df\u7f51\u5361\uff08\u5982 vEthernet\uff09<\/li>\n<li>VPN \u8f6f\u4ef6\u521b\u5efa\u7684\u865a\u62df\u9002\u914d\u5668<\/li>\n<li>WSL2 \u521b\u5efa\u7684\u865a\u62df\u7f51\u5361<\/li>\n<li>\u84dd\u7259\u9002\u914d\u5668<\/li>\n<li>\u56de\u73af\u5730\u5740\uff08Loopback\uff09<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u8fd9\u4e9b\u865a\u62df\u7f51\u5361\u90fd\u4f1a\u6709\u81ea\u5df1\u7684 IP \u5730\u5740\uff0c\u5bfc\u81f4\u6211\u4eec\u83b7\u53d6\u5230\u4e00\u5927\u5806\u65e0\u7528\u7684\u5730\u5740\u3002<\/p>\n<h3 id=\"3-ipv4-vs-ipv6\">\n3. IPv4 vs IPv6\n<a href=\"#3-ipv4-vs-ipv6\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u9664\u4e86\u865a\u62df\u7f51\u5361\u7684\u95ee\u9898\uff0c\u8fd8\u6709 IPv4 \u548c IPv6 \u7684\u533a\u522b\uff1a<\/p>\n<ul>\n<li><strong>IPv4<\/strong>\uff1a\u5982 <code>192.168.1.100<\/code>\uff08\u6211\u4eec\u901a\u5e38\u60f3\u8981\u7684\uff09<\/li>\n<li><strong>IPv6<\/strong>\uff1a\u5982 <code>fe80::1234:5678:abcd:ef01%12<\/code>\uff08\u94fe\u8def\u672c\u5730\u5730\u5740\uff09<\/li>\n<li><strong>IPv6 \u672c\u5730\u56de\u73af<\/strong>\uff1a<code>::1<\/code>\uff08\u76f8\u5f53\u4e8e IPv4 \u7684 <code>127.0.0.1<\/code>\uff09<\/li>\n<\/ul>\n<p>\u5728\u5927\u591a\u6570\u5c40\u57df\u7f51\u573a\u666f\u4e2d\uff0c\u6211\u4eec\u60f3\u8981\u7684\u662f IPv4 \u5730\u5740\u3002<\/p>\n<h2 id=\"\u89e3\u51b3\u65b9\u6848\">\n\u89e3\u51b3\u65b9\u6848\n<a href=\"#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"\u65b9\u6cd5\u4e00\u4f7f\u7528-networkinterface-\u83b7\u53d6\">\n\u65b9\u6cd5\u4e00\uff1a\u4f7f\u7528 NetworkInterface \u83b7\u53d6\n<a href=\"#%e6%96%b9%e6%b3%95%e4%b8%80%e4%bd%bf%e7%94%a8-networkinterface-%e8%8e%b7%e5%8f%96\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u8fd9\u4e2a\u65b9\u6cd5\u901a\u8fc7 <code>NetworkInterface<\/code>\n\u83b7\u53d6\u6240\u6709\u7f51\u7edc\u63a5\u53e3\uff0c\u8fc7\u6ee4\u51fa\u6b63\u5728\u8fd0\u884c\u7684\u7f51\u5361\uff0c\u6392\u9664\u865a\u62df\u7f51\u5361\uff0c\u7136\u540e\u6839\u636e\u63a5\u53e3\u7d22\u5f15\u6392\u5e8f\u9009\u62e9\u6700\u4f73\nIP\u3002\u4e0b\u9762\u7684\u4f8b\u5b50\u4e2d\u6392\u9664\u4e86 VMware \u865a\u62df\u7f51\u5361\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"kt\">string?<\/span> <span class=\"n\">GetBestIPByMetric<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">bestIp<\/span> <span class=\"p\">=<\/span> <span class=\"n\">NetworkInterface<\/span><span class=\"p\">.<\/span><span class=\"n\">GetAllNetworkInterfaces<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">n<\/span><span class=\"p\">.<\/span><span class=\"n\">OperationalStatus<\/span> <span class=\"p\">==<\/span> <span class=\"n\">OperationalStatus<\/span><span class=\"p\">.<\/span><span class=\"n\">Up<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">!<\/span><span class=\"n\">n<\/span><span class=\"p\">.<\/span><span class=\"n\">Description<\/span><span class=\"p\">.<\/span><span class=\"n\">ToLower<\/span><span class=\"p\">().<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;vmware&#34;<\/span><span class=\"p\">))<\/span> <span class=\"c1\">\/\/ \u6392\u9664 VMware \u865a\u62df\u7f51\u5361<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">SelectMany<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">n<\/span><span class=\"p\">.<\/span><span class=\"n\">GetIPProperties<\/span><span class=\"p\">().<\/span><span class=\"n\">UnicastAddresses<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">a<\/span><span class=\"p\">.<\/span><span class=\"n\">Address<\/span><span class=\"p\">.<\/span><span class=\"n\">AddressFamily<\/span> <span class=\"p\">==<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"n\">Net<\/span><span class=\"p\">.<\/span><span class=\"n\">Sockets<\/span><span class=\"p\">.<\/span><span class=\"n\">AddressFamily<\/span><span class=\"p\">.<\/span><span class=\"n\">InterNetwork<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"k\">new<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">IP<\/span> <span class=\"p\">=<\/span> <span class=\"n\">a<\/span><span class=\"p\">.<\/span><span class=\"n\">Address<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Description<\/span> <span class=\"p\">=<\/span> <span class=\"n\">n<\/span><span class=\"p\">.<\/span><span class=\"n\">Description<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u83b7\u53d6\u7f51\u5361\u7684 IPv4 \u63a5\u53e3\u6307\u6807<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Metric<\/span> <span class=\"p\">=<\/span> <span class=\"n\">n<\/span><span class=\"p\">.<\/span><span class=\"n\">GetIPProperties<\/span><span class=\"p\">().<\/span><span class=\"n\">GetIPv4Properties<\/span><span class=\"p\">()?.<\/span><span class=\"n\">Index<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">OrderBy<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Metric<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ \u7d22\u5f15\u901a\u5e38\u53cd\u6620\u4e86\u7ed1\u5b9a\u987a\u5e8f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">FirstOrDefault<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">bestIp<\/span><span class=\"p\">?.<\/span><span class=\"n\">IP<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u7cbe\u786e\u53ef\u63a7\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u6dfb\u52a0\u8fc7\u6ee4\u6761\u4ef6\uff0c\u4e14\u4e0d\u4f9d\u8d56\u8def\u7531\u8868\u3002\u7f3a\u70b9\u662f\u9700\u8981\u624b\u52a8\u7ef4\u62a4\u865a\u62df\u7f51\u5361\u7684\u6392\u9664\u5217\u8868\uff0c\u4e0d\u540c\u865a\u62df\u7f51\u5361\u7684\u540d\u79f0\u548c\u63cf\u8ff0\u53ef\u80fd\u4e0d\u540c\u3002<\/p>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u63a5\u53e3\u7d22\u5f15\uff08Index\uff09\u901a\u5e38\u53cd\u6620\u4e86\u7f51\u5361\u7684\u7ed1\u5b9a\u987a\u5e8f\u548c\u4f18\u5148\u7ea7\uff0c\u7d22\u5f15\u8d8a\u5c0f\u4f18\u5148\u7ea7\u8d8a\u9ad8\u3002\u901a\u8fc7\n<code>GetIPv4Properties().Index<\/code> \u53ef\u4ee5\u83b7\u53d6\u8fd9\u4e2a\u503c\u3002<\/div>\n<\/div>\n<h3 id=\"\u65b9\u6cd5\u4e8c\u4f7f\u7528-socket-\u8fde\u63a5\u5916\u90e8\u5730\u5740\">\n\u65b9\u6cd5\u4e8c\uff1a\u4f7f\u7528 Socket \u8fde\u63a5\u5916\u90e8\u5730\u5740\n<a href=\"#%e6%96%b9%e6%b3%95%e4%ba%8c%e4%bd%bf%e7%94%a8-socket-%e8%bf%9e%e6%8e%a5%e5%a4%96%e9%83%a8%e5%9c%b0%e5%9d%80\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u8fd9\u662f\u4e00\u4e2a\u975e\u5e38\u7ecf\u5178\u4e14\u5de7\u5999\u7684\u65b9\u6cd5\u3002\u901a\u8fc7\u521b\u5efa\u4e00\u4e2a UDP Socket \u5e76&quot;\u8fde\u63a5&quot;\u5230\u5916\u90e8\u5730\u5740\uff08\u5982\nGoogle DNS \u7684 8.8.8.8\uff09\uff0c\u8ba9\u64cd\u4f5c\u7cfb\u7edf\u6839\u636e\u8def\u7531\u8868\u81ea\u52a8\u9009\u62e9\u6700\u5408\u9002\u7684\u672c\u5730 IP\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"kt\">string?<\/span> <span class=\"n\">GetLocalIp<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">Socket<\/span> <span class=\"n\">socket<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Socket<\/span><span class=\"p\">(<\/span><span class=\"n\">AddressFamily<\/span><span class=\"p\">.<\/span><span class=\"n\">InterNetwork<\/span><span class=\"p\">,<\/span> <span class=\"n\">SocketType<\/span><span class=\"p\">.<\/span><span class=\"n\">Dgram<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">try<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8fd9\u91cc\u4f7f\u7528\u4e00\u4e2a\u4f2a\u9020\u7684\u5916\u90e8\u5730\u5740\u3002<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5373\u4f7f\u65ad\u7f51\uff0c\u7cfb\u7edf\u4e5f\u4f1a\u6839\u636e\u8def\u7531\u8868\u8fd4\u56de\u6700\u5339\u914d\u7684\u7269\u7406\u7f51\u5361 IP<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">socket<\/span><span class=\"p\">.<\/span><span class=\"n\">Connect<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;8.8.8.8&#34;<\/span><span class=\"p\">,<\/span> <span class=\"m\">65530<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">endPoint<\/span> <span class=\"p\">=<\/span> <span class=\"n\">socket<\/span><span class=\"p\">.<\/span><span class=\"n\">LocalEndPoint<\/span> <span class=\"k\">as<\/span> <span class=\"n\">IPEndPoint<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">endPoint<\/span><span class=\"p\">?.<\/span><span class=\"n\">Address<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">catch<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5982\u679c\u6ca1\u6709\u4efb\u4f55\u7f51\u5361\u8fde\u63a5\uff0c\u4f1a\u8fdb\u5165\u8fd9\u91cc<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"s\">&#34;127.0.0.1&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u8fd9\u91cc\u4f7f\u7528\u7684\u662f UDP \u534f\u8bae\uff08<code>SocketType.Dgram<\/code>\uff09\uff0c<code>Connect<\/code>\n\u65b9\u6cd5\u53ea\u662f\u8bbe\u7f6e\u9ed8\u8ba4\u76ee\u6807\u5730\u5740\uff0c<strong>\u4e0d\u4f1a\u771f\u6b63\u53d1\u9001\u6570\u636e\u5305<\/strong>\u3002\u56e0\u6b64\u5373\u4f7f\u65ad\u7f51\u4e5f\u80fd\u6b63\u5e38\u5de5\u4f5c\uff0c\u7cfb\u7edf\u4f1a\u6839\u636e\u8def\u7531\u8868\u8fd4\u56de\u6700\u5339\u914d\u7684\u672c\u5730\nIP\u3002<\/div>\n<\/div>\n<p>\u8fd9\u4e2a\u65b9\u6cd5\u4ee3\u7801\u6700\u7b80\u6d01\uff0c\u80fd\u81ea\u52a8\u907f\u5f00\u865a\u62df\u7f51\u5361\u3002\u4f46\u5982\u679c\u5c40\u57df\u7f51\u4e0e\u5916\u7f51\u5b8c\u5168\u9694\u79bb\uff0c\u8def\u7531\u8868\u4e2d\u6ca1\u6709\u76f8\u5e94\u8def\u7531\u65f6\u53ef\u80fd\u5931\u6548\u3002<\/p>\n<h3 id=\"\u65b9\u6cd5\u4e09\u4f7f\u7528-wmi-\u67e5\u8be2\u7269\u7406\u7f51\u5361\">\n\u65b9\u6cd5\u4e09\uff1a\u4f7f\u7528 WMI \u67e5\u8be2\u7269\u7406\u7f51\u5361\n<a href=\"#%e6%96%b9%e6%b3%95%e4%b8%89%e4%bd%bf%e7%94%a8-wmi-%e6%9f%a5%e8%af%a2%e7%89%a9%e7%90%86%e7%bd%91%e5%8d%a1\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u8fd9\u4e2a\u65b9\u6cd5\u5229\u7528 Windows Management Instrumentation (WMI)\n\u6765\u67e5\u8be2\u7cfb\u7edf\u4e2d\u6807\u8bb0\u4e3a\u7269\u7406\u9002\u914d\u5668\u7684\u7f51\u5361\uff0c\u7136\u540e\u4e0e <code>NetworkInterface<\/code> \u7684 DeviceID\n\u8fdb\u884c\u5339\u914d\uff0c\u4ece\u800c\u51c6\u786e\u8fc7\u6ee4\u51fa\u7269\u7406\u7f51\u5361\u7684 IP\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">void<\/span> <span class=\"n\">GetRealIP<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u4f7f\u7528 WMI \u67e5\u8be2\u7269\u7406\u7f51\u5361<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">searcher<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ManagementObjectSearcher<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter = True&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">physicalIds<\/span> <span class=\"p\">=<\/span> <span class=\"n\">searcher<\/span><span class=\"p\">.<\/span><span class=\"n\">Get<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Cast<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">ManagementBaseObject<\/span><span class=\"p\">&gt;()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;DeviceID&#34;<\/span><span class=\"p\">].<\/span><span class=\"n\">ToString<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">interfaces<\/span> <span class=\"p\">=<\/span> <span class=\"n\">NetworkInterface<\/span><span class=\"p\">.<\/span><span class=\"n\">GetAllNetworkInterfaces<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">ni<\/span> <span class=\"k\">in<\/span> <span class=\"n\">interfaces<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5339\u914d\u7269\u7406\u7f51\u5361 ID \u5e76\u4e14\u72b6\u6001\u4e3a Up<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">physicalIds<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">Id<\/span><span class=\"p\">)<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">OperationalStatus<\/span> <span class=\"p\">==<\/span> <span class=\"n\">OperationalStatus<\/span><span class=\"p\">.<\/span><span class=\"n\">Up<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">props<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">GetIPProperties<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">ipv4<\/span> <span class=\"p\">=<\/span> <span class=\"n\">props<\/span><span class=\"p\">.<\/span><span class=\"n\">UnicastAddresses<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">FirstOrDefault<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Address<\/span><span class=\"p\">.<\/span><span class=\"n\">AddressFamily<\/span> <span class=\"p\">==<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"n\">Net<\/span><span class=\"p\">.<\/span><span class=\"n\">Sockets<\/span><span class=\"p\">.<\/span><span class=\"n\">AddressFamily<\/span><span class=\"p\">.<\/span><span class=\"n\">InterNetwork<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ipv4<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6392\u9664\u6389 169.254.x.x (\u81ea\u52a8\u914d\u7f6e\u5730\u5740)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ipv4<\/span><span class=\"p\">.<\/span><span class=\"n\">Address<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">().<\/span><span class=\"n\">StartsWith<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;169.254&#34;<\/span><span class=\"p\">))<\/span> <span class=\"k\">continue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;\u7f51\u5361\u540d\u79f0: {ni.Description}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;\u771f\u5b9e\u5c40\u57df\u7f51 IP: {ipv4.Address}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u65b9\u6cd5\u4ece\u51c6\u786e\u6027\u6765\u8bf4\u662f\u6700\u53ef\u9760\u7684\uff0c\u80fd\u4ece\u64cd\u4f5c\u7cfb\u7edf\u5e95\u5c42\u8bc6\u522b\u7269\u7406\u7f51\u5361\u3002\u4f46\u5b83\u6709\u660e\u663e\u7684\u5c40\u9650\u6027\uff1a<\/p>\n<ul>\n<li>\u9700\u8981\u5f15\u7528 <code>System.Management<\/code> NuGet \u5305<\/li>\n<li>\u53ea\u80fd\u5728 Windows \u5e73\u53f0\u4f7f\u7528\uff0c\u4e0d\u652f\u6301\u8de8\u5e73\u53f0<\/li>\n<li>WMI \u67e5\u8be2\u76f8\u5bf9\u8f83\u6162\uff0c\u6027\u80fd\u654f\u611f\u573a\u666f\u9700\u8981\u7f13\u5b58\u7ed3\u679c<\/li>\n<\/ul>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\"><code>169.254.x.x<\/code> \u662f APIPA\uff08Automatic Private IP\nAddressing\uff09\u5730\u5740\u6bb5\uff0c\u5f53 DHCP \u670d\u52a1\u5668\u4e0d\u53ef\u7528\u65f6\uff0cWindows\n\u4f1a\u81ea\u52a8\u5206\u914d\u8fd9\u4e2a\u8303\u56f4\u7684\u5730\u5740\u3002\u8fd9\u901a\u5e38\u4e0d\u662f\u6211\u4eec\u60f3\u8981\u7684\u771f\u5b9e\u5c40\u57df\u7f51\u5730\u5740\u3002<\/div>\n<\/div>\n<h3 id=\"\u65b9\u6cd5\u56dbnetworkinterface-\u8bc4\u5206\u673a\u5236\u7ec8\u6781\u65b9\u6848\">\n\u65b9\u6cd5\u56db\uff1aNetworkInterface \u8bc4\u5206\u673a\u5236\uff08\u7ec8\u6781\u65b9\u6848\uff09\n<a href=\"#%e6%96%b9%e6%b3%95%e5%9b%9bnetworkinterface-%e8%af%84%e5%88%86%e6%9c%ba%e5%88%b6%e7%bb%88%e6%9e%81%e6%96%b9%e6%a1%88\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u515c\u515c\u8f6c\u8f6c\u5c1d\u8bd5\u4e86\u5404\u79cd\u65b9\u6cd5\u540e\uff0c\u53d1\u73b0\u8fd8\u662f\u56de\u5230 <code>NetworkInterface<\/code>\n\u6700\u7b80\u5355\u4e14\u6709\u6548\u3002\u4e0b\u9762\u8fd9\u4e2a\u65b9\u6848\u76f8\u5f53\u4e8e <a class=\"link\" href=\"#%e6%96%b9%e6%b3%95%e4%b8%80%e4%bd%bf%e7%94%a8-networkinterface-%e8%8e%b7%e5%8f%96\" >\u65b9\u6cd5\u4e00<\/a>\n\u7684\u589e\u5f3a\u7248\uff0c\u901a\u8fc7\u66f4\u5168\u9762\u7684\u8fc7\u6ee4\u6761\u4ef6\u548c\u8bc4\u5206\u673a\u5236\u6765\u9009\u62e9\u6700\u4f73 IP \u5730\u5740\uff1a<\/p>\n<ul>\n<li>\u6392\u9664\u66f4\u591a\u79cd\u7c7b\u7684\u865a\u62df\u7f51\u5361\uff08Clash\u3001ZeroTier\u3001Tailscale\u3001WireGuard\u3001VMware\u3001Docker\n\u7b49\uff09<\/li>\n<li>\u6392\u9664\u7279\u6b8a IP \u6bb5\uff08Docker \u7684 172.16-31.x.x\u3001\u7f51\u7edc\u57fa\u51c6\u6d4b\u8bd5\u7684 198.18.x.x\u3001APIPA \u7684\n169.254.x.x\uff09<\/li>\n<li>\u4f7f\u7528\u8bc4\u5206\u7cfb\u7edf\u7efc\u5408\u8bc4\u4f30\uff1a\u6709\u7f51\u5173 +100 \u5206\uff0c\u4ee5\u592a\u7f51\/\u65e0\u7ebf\u7f51\u5361 +50\n\u5206\uff0c\u77e5\u540d\u5382\u5546\uff08Intel\u3001Realtek \u7b49\uff09+30 \u5206<\/li>\n<\/ul>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><span class=\"lnt\">40\n<\/span><span class=\"lnt\">41\n<\/span><span class=\"lnt\">42\n<\/span><span class=\"lnt\">43\n<\/span><span class=\"lnt\">44\n<\/span><span class=\"lnt\">45\n<\/span><span class=\"lnt\">46\n<\/span><span class=\"lnt\">47\n<\/span><span class=\"lnt\">48\n<\/span><span class=\"lnt\">49\n<\/span><span class=\"lnt\">50\n<\/span><span class=\"lnt\">51\n<\/span><span class=\"lnt\">52\n<\/span><span class=\"lnt\">53\n<\/span><span class=\"lnt\">54\n<\/span><span class=\"lnt\">55\n<\/span><span class=\"lnt\">56\n<\/span><span class=\"lnt\">57\n<\/span><span class=\"lnt\">58\n<\/span><span class=\"lnt\">59\n<\/span><span class=\"lnt\">60\n<\/span><span class=\"lnt\">61\n<\/span><span class=\"lnt\">62\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">GetRealLocalIP<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">allInterfaces<\/span> <span class=\"p\">=<\/span> <span class=\"n\">NetworkInterface<\/span><span class=\"p\">.<\/span><span class=\"n\">GetAllNetworkInterfaces<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">candidates<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;(<\/span><span class=\"n\">IPAddress<\/span> <span class=\"n\">Ip<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Score<\/span><span class=\"p\">)&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">ni<\/span> <span class=\"k\">in<\/span> <span class=\"n\">allInterfaces<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">OperationalStatus<\/span> <span class=\"p\">!=<\/span> <span class=\"n\">OperationalStatus<\/span><span class=\"p\">.<\/span><span class=\"n\">Up<\/span><span class=\"p\">)<\/span> <span class=\"k\">continue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">NetworkInterfaceType<\/span> <span class=\"p\">==<\/span> <span class=\"n\">NetworkInterfaceType<\/span><span class=\"p\">.<\/span><span class=\"n\">Loopback<\/span><span class=\"p\">)<\/span> <span class=\"k\">continue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">NetworkInterfaceType<\/span> <span class=\"p\">==<\/span> <span class=\"n\">NetworkInterfaceType<\/span><span class=\"p\">.<\/span><span class=\"n\">Tunnel<\/span><span class=\"p\">)<\/span> <span class=\"k\">continue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">desc<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">Description<\/span><span class=\"p\">.<\/span><span class=\"n\">ToLower<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">name<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">.<\/span><span class=\"n\">ToLower<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;wintun&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;clash&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;virtual&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;vmware&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;vbox&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;hyper-v&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;zerotier&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;tailscale&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;wireguard&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;docker&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">name<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;vethernet&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">name<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;wsl&#34;<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">continue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">ipProps<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">GetIPProperties<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">ipv4Addrs<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ipProps<\/span><span class=\"p\">.<\/span><span class=\"n\">UnicastAddresses<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">a<\/span><span class=\"p\">.<\/span><span class=\"n\">Address<\/span><span class=\"p\">.<\/span><span class=\"n\">AddressFamily<\/span> <span class=\"p\">==<\/span> <span class=\"n\">AddressFamily<\/span><span class=\"p\">.<\/span><span class=\"n\">InterNetwork<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">addr<\/span> <span class=\"k\">in<\/span> <span class=\"n\">ipv4Addrs<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">ipStr<\/span> <span class=\"p\">=<\/span> <span class=\"n\">addr<\/span><span class=\"p\">.<\/span><span class=\"n\">Address<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ipStr<\/span><span class=\"p\">.<\/span><span class=\"n\">StartsWith<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;169.254&#34;<\/span><span class=\"p\">))<\/span> <span class=\"k\">continue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ipStr<\/span><span class=\"p\">.<\/span><span class=\"n\">StartsWith<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;198.18.&#34;<\/span><span class=\"p\">))<\/span> <span class=\"k\">continue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ipStr<\/span><span class=\"p\">.<\/span><span class=\"n\">StartsWith<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;172.&#34;<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">parts<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ipStr<\/span><span class=\"p\">.<\/span><span class=\"n\">Split<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;.&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">parts<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span> <span class=\"p\">==<\/span> <span class=\"m\">4<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">TryParse<\/span><span class=\"p\">(<\/span><span class=\"n\">parts<\/span><span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">],<\/span> <span class=\"k\">out<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">secondOctet<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">secondOctet<\/span> <span class=\"p\">&gt;=<\/span> <span class=\"m\">16<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">secondOctet<\/span> <span class=\"p\">&lt;=<\/span> <span class=\"m\">31<\/span><span class=\"p\">)<\/span> <span class=\"k\">continue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">score<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ipProps<\/span><span class=\"p\">.<\/span><span class=\"n\">GatewayAddresses<\/span><span class=\"p\">.<\/span><span class=\"n\">Any<\/span><span class=\"p\">(<\/span><span class=\"n\">g<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">!<\/span><span class=\"n\">g<\/span><span class=\"p\">.<\/span><span class=\"n\">Address<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">().<\/span><span class=\"n\">Equals<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;0.0.0.0&#34;<\/span><span class=\"p\">)))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">score<\/span> <span class=\"p\">+=<\/span> <span class=\"m\">100<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">NetworkInterfaceType<\/span> <span class=\"p\">==<\/span> <span class=\"n\">NetworkInterfaceType<\/span><span class=\"p\">.<\/span><span class=\"n\">Ethernet<\/span> <span class=\"p\">||<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ni<\/span><span class=\"p\">.<\/span><span class=\"n\">NetworkInterfaceType<\/span> <span class=\"p\">==<\/span> <span class=\"n\">NetworkInterfaceType<\/span><span class=\"p\">.<\/span><span class=\"n\">Wireless80211<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">score<\/span> <span class=\"p\">+=<\/span> <span class=\"m\">50<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;intel&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;realtek&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;atheros&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">||<\/span> <span class=\"n\">desc<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;broadcom&#34;<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">score<\/span> <span class=\"p\">+=<\/span> <span class=\"m\">30<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">candidates<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">((<\/span><span class=\"n\">addr<\/span><span class=\"p\">.<\/span><span class=\"n\">Address<\/span><span class=\"p\">,<\/span> <span class=\"n\">score<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">candidates<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">==<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"s\">&#34;192.168.1.100&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">candidates<\/span><span class=\"p\">.<\/span><span class=\"n\">OrderByDescending<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">c<\/span><span class=\"p\">.<\/span><span class=\"n\">Score<\/span><span class=\"p\">).<\/span><span class=\"n\">First<\/span><span class=\"p\">().<\/span><span class=\"n\">Ip<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u7248\u672c\u8986\u76d6\u4e86\u51e0\u4e4e\u6240\u6709\u5e38\u89c1\u573a\u666f\uff0c\u901a\u8fc7\u591a\u7ef4\u5ea6\u8bc4\u5206\u786e\u4fdd\u9009\u62e9\u7684\u662f\u771f\u6b63\u5728\u4f7f\u7528\u7684\u7269\u7406\u7f51\u5361\nIP\u3002\u8bc4\u5206\u673a\u5236\u6bd4\u7b80\u5355\u7684\u7d22\u5f15\u6392\u5e8f\u6216\u4f9d\u8d56\u8def\u7531\u8868\u66f4\u667a\u80fd\uff0c\u80fd\u9002\u5e94\u5404\u79cd\u590d\u6742\u7f51\u7edc\u73af\u5883\u3002<\/p>\n<div class=\"notice warning\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"><\/i>Warning\n<\/div>\n<div class=\"notice-content\">\u867d\u7136\u8fd9\u4e2a\u65b9\u6cd5\u63d0\u4f9b\u4e86\u6700\u5927\u7684\u7075\u6d3b\u6027\u548c\u51c6\u786e\u6027\uff0c\u4f46\u4ee3\u7801\u8f83\u957f\uff0c\u7ef4\u62a4\u6210\u672c\u76f8\u5bf9\u8f83\u9ad8\u3002\u9700\u8981\u6839\u636e\u5b9e\u9645\u9047\u5230\u7684\u865a\u62df\u7f51\u5361\u7c7b\u578b\u6301\u7eed\u66f4\u65b0\u8fc7\u6ee4\u5217\u8868\u3002<\/div>\n<\/div>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u83b7\u53d6\u672c\u673a\u771f\u5b9e IP \u5730\u5740\u770b\u4f3c\u7b80\u5355\uff0c\u5b9e\u5219\u9700\u8981\u5904\u7406\u865a\u62df\u7f51\u5361\u3001\u7279\u6b8a IP\n\u6bb5\u3001\u591a\u7f51\u5361\u7b49\u590d\u6742\u60c5\u51b5\u3002\u672c\u6587\u4ecb\u7ecd\u4e86\u56db\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u52a3\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u65b9\u6cd5<\/th>\n<th>\u4f18\u70b9<\/th>\n<th>\u7f3a\u70b9<\/th>\n<th>\u9002\u7528\u573a\u666f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u65b9\u6cd5\u4e00\uff08\u57fa\u7840 NetworkInterface\uff09<\/td>\n<td>\u53ef\u63a7\u6027\u5f3a\uff0c\u4ee3\u7801\u76f8\u5bf9\u7b80\u5355<\/td>\n<td>\u9700\u8981\u624b\u52a8\u7ef4\u62a4\u6392\u9664\u5217\u8868<\/td>\n<td>\u4e00\u822c\u573a\u666f<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5\u4e8c\uff08Socket \u8fde\u63a5\uff09<\/td>\n<td>\u4ee3\u7801\u6700\u7b80\u6d01\uff0c\u81ea\u52a8\u9009\u62e9<\/td>\n<td>\u5b8c\u5168\u9694\u79bb\u7f51\u7edc\u53ef\u80fd\u5931\u6548<\/td>\n<td>\u5feb\u901f\u5b9e\u73b0<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5\u4e09\uff08WMI \u67e5\u8be2\uff09<\/td>\n<td>\u6700\u51c6\u786e\uff0c\u7cfb\u7edf\u5c42\u9762\u8bc6\u522b<\/td>\n<td>\u4ec5\u9650 Windows\uff0c\u6027\u80fd\u8f83\u6162<\/td>\n<td>Windows \u4e13\u7528<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5\u56db\uff08\u8bc4\u5206\u673a\u5236\uff09<\/td>\n<td>\u6700\u7075\u6d3b\u51c6\u786e\uff0c\u8986\u76d6\u5168\u9762<\/td>\n<td>\u4ee3\u7801\u8f83\u957f\uff0c\u7ef4\u62a4\u6210\u672c\u9ad8<\/td>\n<td>\u590d\u6742\u7f51\u7edc\u73af\u5883<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5927\u5bb6\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u5b9e\u9645\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\uff0c\u6216\u8005\u7ed3\u5408\u591a\u79cd\u65b9\u6cd5\u4ee5\u83b7\u5f97\u6700\u4f73\u6548\u679c\u3002<\/p>"},{"title":"\u5982\u4f55\u5728\u4e0d\u4f7f\u7528 .gitignore \u7684\u60c5\u51b5\u4e0b\u5ffd\u7565\u4ee3\u7801\u4ed3\u5e93\u4e2d\u7684\u6587\u4ef6\u6216\u6587\u4ef6\u5939","link":"https:\/\/blog.coldwind.top\/posts\/ignore-file-in-repo-without-using-gitignore\/","pubDate":"Thu, 06 Nov 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/ignore-file-in-repo-without-using-gitignore\/","description":"<p>\u6211\u4eec\u5728\u7ba1\u7406\u4ee3\u7801\u4ed3\u5e93\u65f6\uff0c\u6709\u65f6\u5019\u4f1a\u5728\u9879\u76ee\u4e2d\u5f15\u5165\u4e00\u4e9b\u989d\u5916\u7684\u6587\u4ef6\u6216\u6587\u4ef6\u5939\uff0c\u5e38\u89c1\u7684\u6bd4\u5982\u6211\u4eec\u60f3\u4e34\u65f6\u6d4b\u8bd5\u6548\u679c\u7684 <code>test<\/code> \u6587\u4ef6\uff0c\u6216 <code>.vscode<\/code>\u3001<code>.idea<\/code>\u3001<code>.github<\/code> \u7b49\u914d\u7f6e\u6587\u4ef6\u5939\u3002\u8fd9\u4e9b\u6587\u4ef6\u6216\u6587\u4ef6\u5939\u53ef\u80fd\u4e0d\u9002\u5408\u88ab\u63d0\u4ea4\u5230\u7248\u672c\u63a7\u5236\u7cfb\u7edf\u4e2d\uff0c\u4f46\u6211\u4eec\u53c8\u4e0d\u60f3\u4f7f\u7528 <code>.gitignore<\/code> \u6587\u4ef6\u6765\u5ffd\u7565\u5b83\u4eec\uff0c\u56e0\u4e3a\u8fd9\u6837\u6211\u4eec\u5c31\u9700\u8981\u5c06 <code>.gitignore<\/code> \u6587\u4ef6\u4e5f\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e2d\uff0c\u5f71\u54cd\u5176\u4ed6\u534f\u4f5c\u8005\uff08\u6216\u8005\u8ba9\u5176\u4ed6\u4eba\u5bdf\u89c9\u5230\u4f60\u53ef\u80fd\u5728\u672c\u5730\u4ed3\u5e93\u505a\u4e86\u4ec0\u4e48 :)<\/p>\n<p>\u6709\u4e00\u4e2a\u7b28\u65b9\u6cd5\uff0c\u5c31\u662f\u4fee\u6539\u672c\u5730\u7684 .gitignore \u6587\u4ef6\uff0c\u4f46\u662f\u4e0d\u63d0\u4ea4\u5b83\u3002\u8fd9\u6837\u867d\u7136\u53ef\u4ee5\u8fbe\u5230\u5ffd\u7565\u6587\u4ef6\u7684\u76ee\u7684\uff0c\u4f46\u62c9\u53d6\u4ee3\u7801\u65f6\uff0c\u5982\u679c\u5176\u4ed6\u534f\u4f5c\u8005\u66f4\u65b0\u4e86 <code>.gitignore<\/code> \u6587\u4ef6\uff0c\u4f60\u7684\u672c\u5730\u4fee\u6539\u5c31\u4f1a\u88ab\u8986\u76d6\uff0c\u5bfc\u81f4\u5ffd\u7565\u8bbe\u7f6e\u5931\u6548\u3002\u6216\u8005\u8005\u4f60\u9700\u8981\u9891\u7e41\u5730\u624b\u52a8\u5408\u5e76 <code>.gitignore<\/code> \u6587\u4ef6\uff0c\u589e\u52a0\u4e86\u7ef4\u62a4\u6210\u672c\u3002<\/p>\n<p>\u90a3\u4e48\uff0c\u6709\u6ca1\u6709\u4e00\u79cd\u65b9\u6cd5\u53ef\u4ee5\u5728\u4e0d\u4f7f\u7528 <code>.gitignore<\/code> \u7684\u60c5\u51b5\u4e0b\uff0c\u5ffd\u7565\u8fd9\u4e9b\u6587\u4ef6\u6216\u6587\u4ef6\u5939\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002\u4e0b\u9762\u6211\u4eec\u5c31\u7b80\u5355\u4ecb\u7ecd\u51e0\u79cd\u65b9\u5f0f\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-git-update-index---assume-unchanged\">\n\u4f7f\u7528 <code>git update-index --assume-unchanged<\/code>\n<a href=\"#%e4%bd%bf%e7%94%a8-git-update-index---assume-unchanged\" class=\"anchor\">&para;<\/a>\n<\/h2><p>Git \u63d0\u4f9b\u4e86\u4e00\u4e2a\u547d\u4ee4 <code>git update-index --assume-unchanged &lt;file&gt;<\/code>\uff0c\u53ef\u4ee5\u8ba9 Git \u5ffd\u7565\u5bf9\u6307\u5b9a\u6587\u4ef6\u7684\u66f4\u6539\u3002\u8fd9\u6837\uff0c\u5373\u4f7f\u4f60\u5728\u672c\u5730\u4fee\u6539\u4e86\u8be5\u6587\u4ef6\uff0cGit \u4e5f\u4e0d\u4f1a\u5c06\u5176\u6807\u8bb0\u4e3a\u5df2\u66f4\u6539\u72b6\u6001\u3002<\/p>\n<p>\u4f8b\u5982\uff0c\u5982\u679c\u4f60\u6709\u4e00\u4e2a\u540d\u4e3a <code>test.py<\/code> \u7684\u6587\u4ef6\uff0c\u4f60\u53ef\u4ee5\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bash\" data-lang=\"bash\"><span class=\"line\"><span class=\"cl\">git update-index --assume-unchanged test.py\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u5c31\u4f1a\u53d1\u73b0\uff0c\u5b83\u4e0d\u4f1a\u51fa\u73b0\u5728 <code>git status<\/code> \u7684\u8f93\u51fa\u4e2d\u4e86\u3002<\/p>\n<p>\u5982\u679c\u4f60\u60f3\u6062\u590d\u5bf9\u8be5\u6587\u4ef6\u7684\u8ddf\u8e2a\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bash\" data-lang=\"bash\"><span class=\"line\"><span class=\"cl\">git update-index --no-assume-unchanged test.py\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u662f\u8fd9\u4e2a\u65b9\u6cd5\u6709\u4e00\u4e2a\u7f3a\u70b9\uff0c\u5c31\u662f\u5b83\u4e0d\u80fd\u4f7f\u7528\u901a\u914d\u7b26\u6765\u5ffd\u7565\u591a\u4e2a\u6587\u4ef6\u6216\u6587\u4ef6\u5939\uff0c\u4f60\u9700\u8981\u5bf9\u6bcf\u4e2a\u6587\u4ef6\u5355\u72ec\u6267\u884c\u8be5\u547d\u4ee4\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u5047\u5982\u8fd9\u4e2a\u6587\u4ef6\u5df2\u7ecf\u88ab\u63d0\u4ea4\u5230\u4e86\u4ed3\u5e93\u4e2d\uff0c\u5e76\u4e14\u5176\u4ed6\u534f\u4f5c\u8005\u4fee\u6539\u4e86\u5b83\u540e\u88ab\u62c9\u53d6\u5230\u4e86\u672c\u5730\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u65e0\u6cd5\u5bdf\u89c9\u5230\u8fd9\u4e9b\u66f4\u6539\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-gitinfoexclude\">\n\u4f7f\u7528 <code>.git\/info\/exclude<\/code>\n<a href=\"#%e4%bd%bf%e7%94%a8-gitinfoexclude\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u53e6\u4e00\u4e2a\u65b9\u6cd5\u662f\u4f7f\u7528 Git \u4ed3\u5e93\u4e2d\u7684 <code>.git\/info\/exclude<\/code> \u6587\u4ef6\u3002\u8fd9\u4e2a\u6587\u4ef6\u7684\u4f5c\u7528\u7c7b\u4f3c\u4e8e <code>.gitignore<\/code>\uff0c\u4f46\u5b83\u662f\u672c\u5730\u7684\uff0c\u4e0d\u4f1a\u88ab\u63d0\u4ea4\u5230\u8fdc\u7a0b\u4ed3\u5e93\u3002\u800c\u4e14\u5b83\u7684\u8bed\u6cd5\u89c4\u5219\u662f\u548c <code>.gitignore<\/code> \u4e00\u6837\u7684\uff0c\u652f\u6301\u4f7f\u7528\u901a\u914d\u7b26\u3002<\/p>\n<p>\u4f60\u53ef\u4ee5\u5728 <code>.git\/info\/exclude<\/code> \u6587\u4ef6\u4e2d\u6dfb\u52a0\u4f60\u60f3\u5ffd\u7565\u7684\u6587\u4ef6\u6216\u6587\u4ef6\u5939\u8def\u5f84\u3002\u4f8b\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">test.*\n<\/span><\/span><span class=\"line\"><span class=\"cl\">.vscode\/\n<\/span><\/span><span class=\"line\"><span class=\"cl\">.idea\/\n<\/span><\/span><span class=\"line\"><span class=\"cl\">.github\/\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[Pp]ublish\/\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u65b9\u5f0f\u5c31\u6bd4\u8f83\u9002\u5408\u5ffd\u7565\u591a\u4e2a\u6587\u4ef6\u6216\u6587\u4ef6\u5939\uff0c\u800c\u4e14\u4e0d\u4f1a\u5f71\u54cd\u5176\u4ed6\u534f\u4f5c\u8005\u3002<\/p>\n<p>\u53e6\u5916\uff0c<code>.git<\/code> \u6587\u4ef6\u5939\u901a\u5e38\u662f\u9690\u85cf\u7684\uff0c\u5e76\u4e14\u5728 VS Code \u7b49\u7f16\u8f91\u5668\u4e2d\u9ed8\u8ba4\u4e5f\u662f\u9690\u85cf\u7684\u3002\u5982\u679c\u4f60\u9700\u8981\u7f16\u8f91 <code>.git\/info\/exclude<\/code> \u6587\u4ef6\uff0c\u53ef\u4ee5\u5728\u7f16\u8f91\u5668\u4e2d\u6253\u5f00\u9690\u85cf\u6587\u4ef6\u5939\uff0c\u6216\u8005\u4f7f\u7528\u547d\u4ee4\u884c\u7f16\u8f91\u5668\u8fdb\u884c\u4fee\u6539\u3002\u4ee5 VS Code \u4e3a\u4f8b\uff0c\u53ef\u4ee5\u6253\u5f00\u7ec8\u7aef\uff0c\u8fdb\u5165\u9879\u76ee\u6839\u76ee\u5f55\uff0c\u7136\u540e\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bash\" data-lang=\"bash\"><span class=\"line\"><span class=\"cl\">code .git\/info\/exclude\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u5c31\u53ef\u4ee5\u76f4\u63a5\u5728 VS Code \u4e2d\u7f16\u8f91\u8be5\u6587\u4ef6\u4e86\u3002<\/p>"},{"title":"\u5206\u4eab\u4e00\u4e9b\u9488\u5bf9 WPF \u5f00\u53d1\u8005\u7684 Avalonia \u5f00\u53d1\u6280\u5de7","link":"https:\/\/blog.coldwind.top\/posts\/avalonia-tips-for-wpf-developers\/","pubDate":"Thu, 23 Oct 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/avalonia-tips-for-wpf-developers\/","description":"<p>Avalonia \u5728\u8bbe\u8ba1\u4e0a\u501f\u9274\u4e86 WPF \u7684\u8bb8\u591a\u6982\u5ff5\uff0c\u5f00\u53d1\u4f53\u9a8c\u6765\u8bf4\u4e5f\u6709\u5f88\u591a\u76f8\u4f3c\u4e4b\u5904\u3002\u6bd4\u5982 XAML \u8bed\u6cd5\u3001\u6570\u636e\u7ed1\u5b9a\u3001\u6837\u5f0f\u4e0e\u6a21\u677f\u7b49\u7b49\uff0c\u8fd9\u4f7f\u5f97 WPF \u5f00\u53d1\u8005\u80fd\u591f\u8f83\u5feb\u4e0a\u624b Avalonia\u3002\u7136\u800c\uff0cAvalonia \u4e5f\u6709\u5176\u72ec\u7279\u4e4b\u5904\u548c\u6700\u4f73\u5b9e\u8df5\u3002\u5982\u679c\u5bf9\u8fd9\u4e9b\u4e0d\u591f\u4e86\u89e3\uff0cWPF \u5f00\u53d1\u8005\u53ef\u80fd\u4f1a\u5c06\u4e00\u4e9b WPF \u7684\u4e60\u60ef\u76f4\u63a5\u5957\u7528\u5230 Avalonia \u4e0a\uff0c\u5bfc\u81f4\u4ee3\u7801\u4e0d\u591f\u9ad8\u6548\u6216\u96be\u4ee5\u7ef4\u62a4\u3002<\/p>\n<p>\u672c\u6587\u5c06\u5206\u4eab\u4e00\u4e9b\u9488\u5bf9 WPF \u5f00\u53d1\u8005\u5728\u4f7f\u7528 Avalonia \u65f6\u7684\u5b9e\u7528\u5efa\u8bae\uff0c\u5e2e\u52a9\u5927\u5bb6\u66f4\u597d\u5730\u9002\u5e94\u548c\u5229\u7528 Avalonia \u7684\u7279\u6027\uff0c\u4ece\u800c\u63d0\u5347\u5f00\u53d1\u6548\u7387\u548c\u5e94\u7528\u6027\u80fd\u3002<\/p>\n<h2 id=\"\u5e03\u5c40\u63a7\u4ef6\u7684\u6539\u826f\">\n\u5e03\u5c40\u63a7\u4ef6\u7684\u6539\u826f\n<a href=\"#%e5%b8%83%e5%b1%80%e6%8e%a7%e4%bb%b6%e7%9a%84%e6%94%b9%e8%89%af\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"\u5b50\u63a7\u4ef6\u95f4\u8ddd\">\n\u5b50\u63a7\u4ef6\u95f4\u8ddd\n<a href=\"#%e5%ad%90%e6%8e%a7%e4%bb%b6%e9%97%b4%e8%b7%9d\" class=\"anchor\">&para;<\/a>\n<\/h3><p>Avalonia \u4e3a\u4e00\u4e9b\u5e38\u7528\u7684\u5e03\u5c40\u63a7\u4ef6\u63d0\u4f9b\u4e86\u65b9\u4fbf\u597d\u7528\u7684\u5c5e\u6027\u3002\u5176\u4e2d\u6700\u65b9\u4fbf\u7684\u5c31\u662f\u4e0e <code>Spacing<\/code> \u76f8\u5173\u7684\u4e00\u4e9b\u5c5e\u6027\u3002\u5728 WPF \u4e2d\uff0c\u5982\u679c\u60f3\u8ba9\u63a7\u4ef6\u4e4b\u95f4\u6709\u95f4\u8ddd\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528 <code>Margin<\/code> \u5c5e\u6027\uff0c\u5bfc\u81f4\u4ee3\u7801\u770b\u8d77\u6765\u975e\u5e38\u5197\u957f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel<\/span> <span class=\"na\">Orientation=<\/span><span class=\"s\">&#34;Horizontal&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 1&#34;<\/span> <span class=\"na\">Margin=<\/span><span class=\"s\">&#34;0,0,10,0&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 2&#34;<\/span> <span class=\"na\">Margin=<\/span><span class=\"s\">&#34;0,0,10,0&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 3&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u662f\u5728 Avalonia \u4e2d\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 <code>Spacing<\/code> \u5c5e\u6027\u6765\u8bbe\u7f6e\u63a7\u4ef6\u4e4b\u95f4\u7684\u95f4\u8ddd\uff0c\u4f7f\u4ee3\u7801\u66f4\u52a0\u7b80\u6d01\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel<\/span> <span class=\"na\">Orientation=<\/span><span class=\"s\">&#34;Horizontal&#34;<\/span> <span class=\"na\">Spacing=<\/span><span class=\"s\">&#34;10&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 1&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 2&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 3&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u9664\u4e86 <code>StackPanel<\/code>\uff0c<code>WrapPanel<\/code>\u3001<code>Grid<\/code> \u548c <code>UniformGrid<\/code> \u4e5f\u652f\u6301 <code>Spacing<\/code> \u5c5e\u6027\u3002\u5177\u4f53\u6765\u8bf4\uff1a<\/p>\n<ul>\n<li><code>StackPanel<\/code>\uff1a\n<ul>\n<li><code>Spacing<\/code>\uff1a\u8bbe\u7f6e\u5b50\u9879\u4e4b\u95f4\u7684\u95f4\u8ddd<\/li>\n<\/ul>\n<\/li>\n<li><code>WrapPanel<\/code>\uff1a\n<ul>\n<li><code>ItemSpacing<\/code>\uff1a\u8bbe\u7f6e\u5b50\u9879\u4e4b\u95f4\u7684\u95f4\u8ddd<\/li>\n<li><code>LineSpacing<\/code>\uff1a\u8bbe\u7f6e\u884c\u4e4b\u95f4\u7684\u95f4\u8ddd<\/li>\n<li><code>ItemsAlignment<\/code>\uff1a\u8bbe\u7f6e\u6574\u884c\uff08\u6216\u5217\uff0c\u53d6\u51b3\u4e8e\u65b9\u5411\uff09\u7684\u5bf9\u9f50\u65b9\u5f0f<\/li>\n<\/ul>\n<\/li>\n<li><code>Grid<\/code> \u4e0e <code>UniformGrid<\/code>\uff1a\n<ul>\n<li><code>RowSpacing<\/code>\uff1a\u8bbe\u7f6e\u884c\u4e4b\u95f4\u7684\u95f4\u8ddd<\/li>\n<li><code>ColumnSpacing<\/code>\uff1a\u8bbe\u7f6e\u5217\u4e4b\u95f4\u7684\u95f4\u8ddd<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u4f7f\u7528\u8fd9\u4e9b\u5c5e\u6027\u53ef\u4ee5\u8ba9\u5e03\u5c40\u4ee3\u7801\u66f4\u52a0\u7b80\u6d01\u6613\u8bfb\uff0c\u907f\u514d\u4e86\u5927\u91cf\u7684 <code>Margin<\/code> \u8bbe\u7f6e\u3002<\/p>\n<h3 id=\"grid-\u63a7\u4ef6\">\n<code>Grid<\/code> \u63a7\u4ef6\n<a href=\"#grid-%e6%8e%a7%e4%bb%b6\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5728 Avalonia \u4e2d\uff0c<code>Grid<\/code> \u4e5f\u8fce\u6765\u4e86\u4e00\u4e9b\u5f00\u53d1\u4f53\u9a8c\u7684\u4f18\u5316\u3002\u9664\u4e86\u4e0a\u9762\u63d0\u5230\u7684 <code>RowSpacing<\/code> \u548c <code>ColumnSpacing<\/code> \u5c5e\u6027\u5916\uff0c<code>Grid<\/code> \u8fd8\u652f\u6301 <code>RowDefinitions<\/code> \u548c <code>ColumnDefinitions<\/code> \u7684\u7b80\u5316\u8bed\u6cd5\u3002\u6211\u4eec\u73b0\u5728\u53ef\u4ee5\u7528\u5b57\u7b26\u4e32\u7684\u5f62\u5f0f\u6765\u5feb\u901f\u5b9a\u4e49\u884c\u548c\u5217\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Grid<\/span> <span class=\"na\">ColumnDefinitions=<\/span><span class=\"s\">&#34;Auto,*,100&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- WPF \u7684\u505a\u6cd5 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Grid.RowDefinitions&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;RowDefinition<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;Auto&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;RowDefinition<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;*&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;RowDefinition<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;100&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Grid.RowDefinitions&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u5982\u679c\u9700\u8981\u64cd\u4f5c\u8fd9\u4e9b <code>Definition<\/code>\uff0c\u6bd4\u5982\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u8c03\u6574\u5b83\u4eec\u7684\u53ef\u89c1\u6027\u3001\u5c3a\u5bf8\u7b49\uff0c\u90a3\u6211\u4eec\u4ecd\u7136\u9700\u8981\u4f7f\u7528\u4f20\u7edf\u7684\u65b9\u5f0f\u6765\u5b9a\u4e49\u3002<\/div>\n<\/div>\n<p>\u6b64\u5916\uff0c\u5982\u679c\u6211\u4eec\u7684\u5e03\u5c40\u8981\u6c42\u975e\u5e38\u7b80\u5355\uff0c\u6bd4\u5982\u5e76\u4e0d\u4f1a\u7528\u5230\u884c\u4e0e\u5217\uff0c\u53ea\u662f\u7b80\u5355\u5730\u5c06\u5b50\u63a7\u4ef6\u5806\u53e0\u5728\u4e00\u8d77\uff0c\u6700\u591a\u662f\u501f\u52a9\u5b83\u4eec\u7684 <code>Alignment<\/code> \u5c5e\u6027\u6765\u8c03\u6574\u4f4d\u7f6e\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u66f4\u52a0\u8f7b\u91cf\u7684 <code>Panel<\/code> \u63a7\u4ef6\u6765\u66ff\u4ee3 <code>Grid<\/code>\uff0c\u4ee5\u63d0\u5347\u6027\u80fd\u3002\u800c WPF \u56e0\u4e3a\u7f3a\u4e4f\u8fd9\u6837\u7684\u8f7b\u91cf\u7ea7\u5bb9\u5668\uff0c\u5f80\u5f80\u4f1a\u8fc7\u5ea6\u4f7f\u7528 <code>Grid<\/code>\uff0c\u5bfc\u81f4\u6027\u80fd\u4e0b\u964d\u3002\u4e5f\u56e0\u6b64\uff0c\u4e0d\u5c11\u7b2c\u4e09\u65b9\u63a7\u4ef6\u5e93\u63d0\u4f9b\u4e86\u8bf8\u5982 <code>SimplePanel<\/code> \u4e4b\u7c7b\u7684\u8f7b\u91cf\u7ea7\u5bb9\u5668\u6765\u5f25\u8865\u8fd9\u4e00\u7f3a\u9677\u3002<\/p>\n<h2 id=\"\u96c6\u5408\u7c7b\u578b\">\n\u96c6\u5408\u7c7b\u578b\n<a href=\"#%e9%9b%86%e5%90%88%e7%b1%bb%e5%9e%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 WPF \u4e2d\uff0c\u6211\u4eec\u90fd\u77e5\u9053\uff0c\u5982\u679c\u60f3\u8981\u8ba9\u524d\u53f0\u7684 <code>ItemsControl<\/code>\uff08\u53ca\u5176\u5b50\u7c7b\uff0c\u5982 <code>ListBox<\/code>\u3001<code>ComboBox<\/code> \u7b49\uff09\u80fd\u591f\u54cd\u5e94\u96c6\u5408\u7684\u53d8\u5316\uff0c\u6211\u4eec\u9700\u8981\u4f7f\u7528 <code>ObservableCollection&lt;T&gt;<\/code> \u4f5c\u4e3a\u6570\u636e\u6e90\uff0c\u56e0\u4e3a\u5b83\u5b9e\u73b0\u4e86 <code>INotifyCollectionChanged<\/code> \u63a5\u53e3\uff0c\u80fd\u591f\u5728\u96c6\u5408\u53d1\u751f\u53d8\u5316\u65f6\u901a\u77e5 UI \u66f4\u65b0\u3002<\/p>\n<p>\u800c\u5728 Avalonia \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u4f7f\u7528\u5b83\u63d0\u4f9b\u7684 <code>AvaloniaList&lt;T&gt;<\/code> \u4f5c\u4e3a\u96c6\u5408\u7c7b\u578b\u3002\u7b80\u5355\u6765\u8bf4\uff0c<code>AvaloniaList&lt;T&gt;<\/code> \u63d0\u4f9b\u4e86\u4ee5\u4e0b\u51e0\u6761\u989d\u5916\u7684\u529f\u80fd\uff1a<\/p>\n<ol>\n<li>\u53ef\u4ee5\u8bbe\u7f6e <code>ResetBehavior<\/code> \u5c5e\u6027\u6765\u63a7\u5236\u96c6\u5408\u88ab\u6e05\u7a7a\u65f6\u89e6\u53d1\u7684\u662f <code>NotifyCollectionChangedAction.Reset<\/code> \u8fd8\u662f <code>Remove<\/code>\uff1a<code>Reset<\/code> \u4ec5\u901a\u77e5\uff0c\u4f46\u4e8b\u4ef6\u53c2\u6570\u4e0d\u5305\u542b\u5177\u4f53\u5220\u9664\u4e86\u54ea\u4e9b\u5143\u7d20\uff0c\u800c <code>Remove<\/code> \u5219\u4f1a\u5305\u542b\u88ab\u5220\u9664\u7684\u5143\u7d20\u5217\u8868<\/li>\n<li>\u63d0\u4f9b\u4e86 <code>Validate<\/code> \u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728\u6dfb\u52a0\u5143\u7d20\u65f6\u8fdb\u884c\u9a8c\u8bc1<\/li>\n<li>\u63d0\u4f9b\u4e86 <code>AddRange<\/code> \u548c <code>RemoveRange<\/code> \u65b9\u6cd5\uff0c\u53ef\u4ee5\u4e00\u6b21\u6027\u6dfb\u52a0\u6216\u79fb\u9664\u591a\u4e2a\u5143\u7d20<\/li>\n<\/ol>\n<p>\u8fd9\u4e9b\u65b0\u529f\u80fd\u53ef\u4ee5\u8bf4\u662f\u663e\u8457\u63d0\u5347\u4e86 <code>ObservableCollection&lt;T&gt;<\/code> \u7684\u4f7f\u7528\u4f53\u9a8c\u3002<\/p>\n<p>Avalonia \u8fd8\u63d0\u4f9b\u4e86 <code>AvaloniaDictionary&lt;,&gt;<\/code>\uff0c\u5b83\u662f\u4e00\u4e2a\u5177\u5907\u901a\u77e5\u529f\u80fd\u7684\u5b57\u5178\u7c7b\u578b\u3002WPF \u56e0\u4e3a\u7f3a\u4e4f\u7c7b\u4f3c <code>ObservableDictionary&lt;,&gt;<\/code> \u7684\u7c7b\u578b\uff0c\u5f80\u5f80\u9700\u8981\u5f00\u53d1\u8005\u81ea\u884c\u5b9e\u73b0\uff0c\u800c Avalonia \u5219\u76f4\u63a5\u63d0\u4f9b\u4e86\u73b0\u6210\u7684\u89e3\u51b3\u65b9\u6848\u4f9b\u6211\u4eec\u4f7f\u7528\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u5bf9\u4e8e <code>DataGrid<\/code> \u63a7\u4ef6\uff0cAvalonia \u8fd8\u63d0\u4f9b\u4e86 <code>DataGridCollectionView<\/code>\uff0c\u5b83\u662f\u4e00\u4e2a\u652f\u6301\u6392\u5e8f\u3001\u8fc7\u6ee4\u3001\u5206\u7ec4\u7b49\u529f\u80fd\u7684\u96c6\u5408\u89c6\u56fe\u7c7b\u578b\uff0c\u53ef\u4ee5\u5927\u5927\u63d0\u9ad8\u6570\u636e\u5c55\u793a\u7684\u7075\u6d3b\u6027\u3002\u5728 11.3.x \u7248\u672c\u7684 Avalonia \u4e2d\uff0c\u5b83\u88ab\u8fc1\u79fb\u5230\u4e86 <code>Avalonia.Controls.DataGrid<\/code> \u5305\u4e2d\uff0c\u65b9\u4fbf\u6211\u4eec\u5355\u72ec\u5f15\u7528\u3002<\/p>\n<h2 id=\"\u503c\u8f6c\u6362\u5668\">\n\u503c\u8f6c\u6362\u5668\n<a href=\"#%e5%80%bc%e8%bd%ac%e6%8d%a2%e5%99%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 WPF \u4e2d\uff0c\u6211\u4eec\u5e38\u5e38\u9700\u8981\u4e0e\u503c\u8f6c\u6362\u5668\uff08<code>IValueConverter<\/code>\uff09\u6253\u4ea4\u9053\uff0c\u4ee5\u4fbf\u5728\u6570\u636e\u7ed1\u5b9a\u65f6\u5bf9\u6570\u636e\u8fdb\u884c\u8f6c\u6362\u3002WPF \u539f\u751f\u51e0\u4e4e\u53ea\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6211\u4eec\u7528\u5f97\u4e0a\u7684\u8f6c\u6362\u5668\u2014\u2014<code>BooleanToVisibilityConverter<\/code>\u3002\u5176\u4ed6\u7684\u8f6c\u6362\u5668\u901a\u5e38\u9700\u8981\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u3002\u8fd9\u540c\u65f6\u4e5f\u56e0\u4e3a WPF \u7684\u7ed1\u5b9a\u8bed\u6cd5\u4e0d\u591f\u7075\u6d3b\uff0c\u5bfc\u81f4\u8fde\u4e00\u4e2a\u7b80\u5355\u7684\u5e03\u5c14\u503c\u53d6\u53cd\u90fd\u9700\u8981\u6211\u4eec\u81ea\u5df1\u5199\u8f6c\u6362\u5668\u3002<\/p>\n<p>\u800c\u5728 Avalonia \u4e2d\uff0c\u60c5\u51b5\u5219\u5927\u4e0d\u76f8\u540c\u3002\u751a\u81f3\u53ef\u4ee5\u8bf4\uff0c\u5728\u9047\u5230\u770b\u4f3c\u9700\u8981\u6211\u4eec\u5199\u503c\u8f6c\u6362\u5668\u7684\u573a\u666f\u65f6\uff0c\u6211\u4eec\u5e94\u8be5\u5148\u8003\u8651\u662f\u5426\u53ef\u4ee5\u901a\u8fc7 Avalonia \u63d0\u4f9b\u7684\u5185\u7f6e\u529f\u80fd\u6765\u5b9e\u73b0\uff0c\u5e76\u4e14\u5f88\u591a\u65f6\u5019\u90fd\u662f\u53ef\u4ee5\u7684\u3002<\/p>\n<h3 id=\"\u5185\u7f6e\u8f6c\u6362\u5668\">\n\u5185\u7f6e\u8f6c\u6362\u5668\n<a href=\"#%e5%86%85%e7%bd%ae%e8%bd%ac%e6%8d%a2%e5%99%a8\" class=\"anchor\">&para;<\/a>\n<\/h3><p>Avalonia \u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u5185\u7f6e\u503c\u8f6c\u6362\u5668\uff0c\u6db5\u76d6\u4e86\u5e38\u89c1\u7684\u8f6c\u6362\u9700\u6c42\u3002\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li><code>BoolConverters<\/code>\n<ul>\n<li>\u63d0\u4f9b\u4e86\u4e00\u4e9b\u591a\u503c\u8f6c\u6362\u5668\uff08<code>IMultiValueConverter<\/code>\uff09\uff0c\u5982 <code>AndConverter<\/code>\u3001<code>OrConverter<\/code> \u7b49\uff0c\u53ef\u7528\u4e8e <code>MultiBinding<\/code><\/li>\n<li>\u63d0\u4f9b\u4e86\u5e03\u5c14\u503c\u7684\u53d6\u53cd\u8f6c\u6362\u5668 <code>NotConverter<\/code>\uff0c\u4f46\u901a\u5e38\u53ef\u4ee5\u7528\u7ed1\u5b9a\u8868\u8fbe\u5f0f\u7684\u7279\u6b8a\u8bed\u6cd5\u6765\u5b9e\u73b0<\/li>\n<\/ul>\n<\/li>\n<li><code>StringConverters<\/code>\n<ul>\n<li>\u63d0\u4f9b\u4e86\u4e00\u4e9b\u4e0e\u5b57\u7b26\u4e32\u6709\u5173\u7684\u8f6c\u6362\u5668\uff0c\u5982 <code>IsNullOrEmpty<\/code>\u3001<code>IsNullOrWhiteSpace<\/code> \u7b49<\/li>\n<\/ul>\n<\/li>\n<li><code>ObjectConverters<\/code>\n<ul>\n<li>\u63d0\u4f9b\u4e86\u4e00\u4e9b\u4e0e\u5bf9\u8c61\u6709\u5173\u7684\u8f6c\u6362\u5668\uff0c\u5982 <code>IsNull<\/code>\u3001<code>IsNotNull<\/code>\u3001<code>Equal<\/code>\u3001<code>NotEqual<\/code> \u7b49<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u8fd0\u7528\u8fd9\u4e9b\u5185\u7f6e\u7684\u8f6c\u6362\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u6613\u5b9e\u73b0\u5f88\u591a\u5e38\u89c1\u7684\u9700\u6c42\uff0c\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"c\">&lt;!-- \u53ea\u6709\u5f53\u6240\u6709\u5f00\u5173\u90fd\u6253\u5f00\u65f6\uff0c\u63d0\u4ea4\u6309\u94ae\u624d\u53ef\u7528 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ToggleSwitch<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;Toggle1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ToggleSwitch<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;Toggle2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ToggleSwitch<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;Toggle3&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Submit&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button.IsEnabled&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;MultiBinding<\/span> <span class=\"na\">Converter=<\/span><span class=\"s\">&#34;{x:Static BoolConverters.AndConverter}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Binding<\/span> <span class=\"na\">ElementName=<\/span><span class=\"s\">&#34;Toggle1&#34;<\/span> <span class=\"na\">Path=<\/span><span class=\"s\">&#34;IsChecked&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Binding<\/span> <span class=\"na\">ElementName=<\/span><span class=\"s\">&#34;Toggle2&#34;<\/span> <span class=\"na\">Path=<\/span><span class=\"s\">&#34;IsChecked&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Binding<\/span> <span class=\"na\">ElementName=<\/span><span class=\"s\">&#34;Toggle3&#34;<\/span> <span class=\"na\">Path=<\/span><span class=\"s\">&#34;IsChecked&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/MultiBinding&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Button.IsEnabled&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Button&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ListBox<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;MyListBox&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">IsVisible=<\/span><span class=\"s\">&#34;{Binding #MyListBox.SelectedItem, Converter={x:Static ObjectConverters.IsNotNull}}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> An item is selected\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/TextBlock&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"\u7ed1\u5b9a\u8868\u8fbe\u5f0f\">\n\u7ed1\u5b9a\u8868\u8fbe\u5f0f\n<a href=\"#%e7%bb%91%e5%ae%9a%e8%a1%a8%e8%be%be%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h3><p>Avalonia \u7684\u7ed1\u5b9a\u8868\u8fbe\u5f0f\u8bed\u6cd5\u4e5f\u6bd4 WPF \u66f4\u52a0\u7075\u6d3b\u5f3a\u5927\u3002\u6211\u4eec\u53ef\u4ee5\u5728\u7ed1\u5b9a\u8def\u5f84\u4e2d\u76f4\u63a5\u4f7f\u7528\u4e00\u4e9b\u7279\u6b8a\u7684\u8bed\u6cd5\u6765\u5b9e\u73b0\u7b80\u5355\u7684\u8f6c\u6362\u9700\u6c42\uff0c\u800c\u65e0\u9700\u501f\u52a9\u503c\u8f6c\u6362\u5668\u3002<\/p>\n<p>\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"c\">&lt;!-- \u5e03\u5c14\u503c\u53d6\u53cd --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ToggleSwitch<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;MyToggle&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">IsVisible=<\/span><span class=\"s\">&#34;{Binding #MyToggle.IsChecked, Path=!}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> The toggle is off\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/TextBlock&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c\">&lt;!-- \u5b57\u7b26\u4e32\u4e0d\u4e3a\u7a7a --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBox<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;MyTextBox&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">IsVisible=<\/span><span class=\"s\">&#34;{Binding !!#MyTextBox.Text}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> Text is not empty\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/TextBlock&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u901a\u8fc7\u8fd9\u4e9b\u5185\u7f6e\u7684\u8f6c\u6362\u5668\u548c\u7075\u6d3b\u7684\u7ed1\u5b9a\u8868\u8fbe\u5f0f\u8bed\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u5927\u5927\u51cf\u5c11\u81ea\u5b9a\u4e49\u503c\u8f6c\u6362\u5668\u7684\u7f16\u5199\uff0c\u4ece\u800c\u7b80\u5316\u4ee3\u7801\uff0c\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\u3002<\/p>\n<h3 id=\"\u51fd\u6570\u503c\u8f6c\u6362\u5668\">\n\u51fd\u6570\u503c\u8f6c\u6362\u5668\n<a href=\"#%e5%87%bd%e6%95%b0%e5%80%bc%e8%bd%ac%e6%8d%a2%e5%99%a8\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5982\u679c\u4e0a\u9762\u7684\u8fd9\u4e9b\u65b9\u5f0f\u8fd8\u4e0d\u80fd\u6ee1\u8db3\uff0c\u90a3\u4e48\u6216\u8bb8\u4f9d\u7136\u4e0d\u5fc5\u6025\u4e8e\u53bb\u5199\u503c\u8f6c\u6362\u5668\u3002Avalonia \u8fd8\u63d0\u4f9b\u4e86\u51fd\u6570\u503c\u8f6c\u6362\u5668\uff08<code>FuncValueConverter<\/code>\uff09\uff0c\u5b83\u5141\u8bb8\u6211\u4eec\u5feb\u901f\u5730\u5728\u540e\u53f0\u4ee3\u7801\u4e2d\u5b9a\u4e49\u4e00\u4e2a\u8f6c\u6362\u51fd\u6570\uff0c\u5e76\u5c06\u5176\u76f4\u63a5\u7528\u4e8e\u7ed1\u5b9a\u4e2d\uff0c\u800c\u65e0\u9700\u521b\u5efa\u4e00\u4e2a\u5b8c\u6574\u7684\u8f6c\u6362\u5668\u7c7b\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MyViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">FuncValueConverter<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"kt\">bool<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">StringToBoolConverter<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">str<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">str<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBox<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;MyTextBox&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">IsVisible=<\/span><span class=\"s\">&#34;{Binding #MyTextBox.Text, Converter={x:Static local:MyViewModel.StringToBoolConverter}}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> Text is not empty\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/TextBlock&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f\uff0c\u6211\u4eec\u53ef\u4ee5\u5feb\u901f\u5730\u5b9e\u73b0\u4e00\u4e9b\u7b80\u5355\u7684\u8f6c\u6362\u903b\u8f91\uff0c\u800c\u65e0\u9700\u7f16\u5199\u5197\u957f\u7684\u8f6c\u6362\u5668\u7c7b\uff0c\u4ece\u800c\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\u3002\u5982\u679c\u5e0c\u671b\u4f20\u5165\u53c2\u6570\uff08<code>ConverterParameter<\/code>\uff09\uff0c\u5b83\u8fd8\u6709\u4e00\u4e2a <code>FuncValueConverter&lt;TIn, TParam, TOut&gt;<\/code> \u7684\u91cd\u8f7d\u7248\u672c\uff0c\u53ef\u4ee5\u6ee1\u8db3\u8fd9\u4e00\u9700\u6c42\u3002\u6b64\u5916\uff0c\u6211\u4eec\u8fd8\u6709 <code>FuncMultiValueConverter<\/code> \u53ef\u4f9b\u4f7f\u7528\uff0c\u9002\u7528\u4e8e\u591a\u503c\u7ed1\u5b9a\u7684\u573a\u666f\u3002<\/p>\n<p>\u4f46\u9700\u8981\u6ce8\u610f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u5b58\u5728\u4e00\u5b9a\u5c40\u9650\u6027\uff1a\u5b83\u53ea\u652f\u6301\u6b63\u5411\u8f6c\u6362\uff08<code>Convert<\/code> \u65b9\u6cd5\uff09\uff0c\u4e0d\u652f\u6301\u53cd\u5411\u8f6c\u6362\uff08<code>ConvertBack<\/code> \u65b9\u6cd5\uff09\u3002\u56e0\u6b64\uff0c\u5982\u679c\u9700\u8981\u66f4\u590d\u6742\u7684\u8f6c\u6362\u903b\u8f91\uff0c\u4ecd\u7136\u9700\u8981\u7f16\u5199\u5b8c\u6574\u7684\u503c\u8f6c\u6362\u5668\u7c7b\u3002<\/p>\n<h2 id=\"xmlns-\u547d\u540d\u7a7a\u95f4\">\nxmlns \u547d\u540d\u7a7a\u95f4\n<a href=\"#xmlns-%e5%91%bd%e5%90%8d%e7%a9%ba%e9%97%b4\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 WPF \u4e2d\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\u5f15\u5165\u4e00\u4e2a\u7a0b\u5e8f\u96c6\u4e2d\u7684\u63a7\u4ef6\u6216\u7c7b\u578b\uff0c\u901a\u5e38\u9700\u8981\u5728 XAML \u6587\u4ef6\u7684\u5f00\u5934\u4f7f\u7528 <code>xmlns<\/code> \u58f0\u660e\u4e00\u4e2a\u547d\u540d\u7a7a\u95f4\uff0c\u5e76\u6307\u5b9a\u7a0b\u5e8f\u96c6\u540d\u79f0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"na\">xmlns:md=<\/span><span class=\"s\">&#34;http:\/\/materialdesigninxaml.net\/winfx\/xaml\/themes&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:local=<\/span><span class=\"s\">&#34;clr-namespace:MyApp.Controls&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:classlib=<\/span><span class=\"s\">&#34;clr-namespace:ClassLibrary.Controls;assembly=ClassLibrary&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u5728\u5f53\u524d\u7a0b\u5e8f\u96c6\uff0c\u90a3\u4e48\u6211\u4eec\u53ea\u9700\u8981 <code>clr-namespace<\/code> \u5373\u53ef\uff1b\u5982\u679c\u662f\u5176\u4ed6\u7a0b\u5e8f\u96c6\uff0c\u5219\u9700\u8981\u52a0\u4e0a <code>assembly<\/code> \u90e8\u5206\u3002<\/p>\n<p>\u8fd9\u6837\u7684\u65b9\u5f0f\u5728 Avalonia \u4e2d\u540c\u6837\u9002\u7528\uff0c\u4f46 Avalonia \u8fd8\u63d0\u4f9b\u4e86\u66f4\u52a0\u7b80\u6d01\u7684 <code>using<\/code> \u8bed\u6cd5\uff0c\u5141\u8bb8\u6211\u4eec\u76f4\u63a5\u4f7f\u7528\u7a0b\u5e8f\u96c6\u540d\u79f0\u6765\u5f15\u5165\u547d\u540d\u7a7a\u95f4\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"na\">xmlns:md=<\/span><span class=\"s\">&#34;http:\/\/materialdesigninxaml.net\/winfx\/xaml\/themes&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:local=<\/span><span class=\"s\">&#34;using:MyApp.Controls&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:classlib=<\/span><span class=\"s\">&#34;using:ClassLibrary.Controls&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53e6\u5916\uff0cAvalonia \u7684\u9ed8\u8ba4 <code>x<\/code> \u547d\u540d\u7a7a\u95f4\u4e5f\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e0d\u5c11\u4fbf\u5229\u3002\u5728 WPF \u4e2d\uff0c\u5982\u679c\u6211\u4eec\u60f3\u5728 XAML \u4e2d\u4f7f\u7528\u4e00\u4e9b\u5e38\u89c1\u7684\u7c7b\u578b\uff0c\u6bd4\u5982 <code>String<\/code>\u3001<code>Int32<\/code>\u3001<code>Boolean<\/code> \u7b49\uff0c\u901a\u5e38\u9700\u8981\u663e\u5f0f\u5730\u5f15\u5165 <code>System<\/code> \u547d\u540d\u7a7a\u95f4\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"na\">xmlns:sys=<\/span><span class=\"s\">&#34;clr-namespace:System;assembly=mscorlib&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:String<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;MyString&#34;<\/span><span class=\"nt\">&gt;<\/span>Hello, World!<span class=\"nt\">&lt;\/sys:String&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;MyInt&#34;<\/span><span class=\"nt\">&gt;<\/span>42<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Boolean<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;MyBool&#34;<\/span><span class=\"nt\">&gt;<\/span>True<span class=\"nt\">&lt;\/sys:Boolean&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\"><p>\u5bf9\u4e8e .NET Framework \u9879\u76ee\uff0c\u6211\u4eec\u5fc5\u987b\u5f15\u5165 <code>mscorlib<\/code> \u7a0b\u5e8f\u96c6\uff1b\u800c\u5bf9\u4e8e .NET 5+ \u9879\u76ee\uff0c\u6211\u4eec\u8fd8\u5c06\u591a\u4e00\u4e9b\u9009\u62e9\uff0c\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li><code>System.Core<\/code><\/li>\n<li><code>System.Runtime<\/code><\/li>\n<li><code>netstandard<\/code><\/li>\n<\/ul><\/div>\n<\/div>\n<p>\u800c\u5728 Avalonia \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 <code>x<\/code> \u547d\u540d\u7a7a\u95f4\u6765\u5f15\u7528\u8fd9\u4e9b\u5e38\u89c1\u7c7b\u578b\uff0c\u65e0\u9700\u989d\u5916\u7684 <code>xmlns<\/code> \u58f0\u660e\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;x:String<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;MyString&#34;<\/span><span class=\"nt\">&gt;<\/span>Hello, World!<span class=\"nt\">&lt;\/x:String&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;x:Int32<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;MyInt&#34;<\/span><span class=\"nt\">&gt;<\/span>42<span class=\"nt\">&lt;\/x:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;x:Boolean<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;MyBool&#34;<\/span><span class=\"nt\">&gt;<\/span>True<span class=\"nt\">&lt;\/x:Boolean&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u7ed3\u8bed\">\n\u7ed3\u8bed\n<a href=\"#%e7%bb%93%e8%af%ad\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u672c\u6587\u4ecb\u7ecd\u4e86\u4e00\u4e9b\u9488\u5bf9 WPF \u5f00\u53d1\u8005\u5728\u4f7f\u7528 Avalonia \u65f6\u7684\u5b9e\u7528\u5efa\u8bae\u3002\u901a\u8fc7\u4e86\u89e3\u548c\u8fd0\u7528\u8fd9\u4e9b Avalonia \u7684\u7279\u6027\u548c\u6700\u4f73\u5b9e\u8df5\uff0cWPF \u5f00\u53d1\u8005\u53ef\u4ee5\u66f4\u597d\u5730\u9002\u5e94 Avalonia \u7684\u5f00\u53d1\u73af\u5883\uff0c\u4ece\u800c\u63d0\u5347\u5f00\u53d1\u6548\u7387\u548c\u5e94\u7528\u6027\u80fd\u3002<\/p>\n<p>\u6211\u4eec\u5728\u4f7f\u7528 Avalonia \u65f6\uff0c\u5e94\u8be5\u5145\u5206\u5229\u7528\u5176\u63d0\u4f9b\u7684\u4e30\u5bcc\u529f\u80fd\u548c\u7075\u6d3b\u8bed\u6cd5\uff0c\u907f\u514d\u7b80\u5355\u5730\u5c06 WPF \u7684\u4e60\u60ef\u76f4\u63a5\u5957\u7528\u5230 Avalonia \u4e0a\u3002\u5e0c\u671b\u672c\u6587\u7684\u5185\u5bb9\u80fd\u591f\u5e2e\u52a9\u5927\u5bb6\u66f4\u597d\u5730\u7406\u89e3\u548c\u4f7f\u7528 Avalonia\uff0c\u6253\u9020\u51fa\u9ad8\u8d28\u91cf\u7684\u8de8\u5e73\u53f0\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>"},{"title":"\u5728 C# \u4e2d\u4f7f\u7528 IComparer \u5b9e\u73b0\u81ea\u5b9a\u4e49\u6392\u5e8f","link":"https:\/\/blog.coldwind.top\/posts\/customize-order-with-icomparer\/","pubDate":"Thu, 09 Oct 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/customize-order-with-icomparer\/","description":"<p>\u5728 C# \u4e2d\u5904\u7406\u6570\u636e\u65f6\uff0c\u6211\u4eec\u6709\u65f6\u5019\u4f1a\u60f3\u7ed9\u67d0\u79cd\u6570\u636e\u4e00\u79cd\u7279\u6b8a\u7684\u6392\u5217\u987a\u5e8f\u3002\u6bd4\u5982\u5bf9\u4e8e\u516c\u53f8\u5458\u5de5\u6392\u5e8f\u65f6\uff0c\u6211\u4eec\u5e0c\u671b\u6309\u7167\u5458\u5de5\u6240\u5c5e\u7684\u90e8\u95e8\u8fdb\u884c\u6392\u5e8f\uff0c\u5e76\u4e14\u5e0c\u671b\u6309\u7167\u4e00\u5b9a\u7684\u4f18\u5148\u7ea7\uff0c\u6bd4\u5982\u201c\u884c\u653f\u3001\u8d22\u52a1\u3001\u4eba\u529b\u8d44\u6e90\u3001\u5e02\u573a\u3001\u9500\u552e\u3001\u8fd0\u8425\u3001\u7814\u53d1\u201d\u8fd9\u6837\u7684\u987a\u5e8f\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5982\u679c\u6211\u4eec\u4f7f\u7528\u9ed8\u8ba4\u7684\u6392\u5e8f\uff08\u5373\u5b57\u5178\u5e8f\uff09\uff0c\u5c31\u65e0\u6cd5\u6ee1\u8db3\u6211\u4eec\u7684\u9700\u6c42\u3002<\/p>\n<p>\u5e78\u8fd0\u7684\u662f\uff0cC# \u63d0\u4f9b\u4e86\u4e00\u4e2a\u975e\u5e38\u5f3a\u5927\u7684\u63a5\u53e3 <code>IComparer<\/code>\uff0c\u5b83\u5141\u8bb8\u6211\u4eec\u81ea\u5b9a\u4e49\u6392\u5e8f\u903b\u8f91\u3002\u901a\u8fc7\u5b9e\u73b0\u8fd9\u4e2a\u63a5\u53e3\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9a\u4e49\u4efb\u4f55\u6211\u4eec\u60f3\u8981\u7684\u6392\u5e8f\u89c4\u5219\u3002<\/p>\n<h2 id=\"icomparer-\u63a5\u53e3\u7684\u5b9a\u4e49\">\nIComparer \u63a5\u53e3\u7684\u5b9a\u4e49\n<a href=\"#icomparer-%e6%8e%a5%e5%8f%a3%e7%9a%84%e5%ae%9a%e4%b9%89\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>IComparer&lt;T&gt;<\/code> \u63a5\u53e3\u5b9a\u4e49\u4e86\u4e00\u4e2a\u65b9\u6cd5 <code>Compare<\/code>\uff0c\u5b83\u63a5\u53d7\u4e24\u4e2a\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4e00\u4e2a\u6574\u6570\u503c\u3002\u8fd9\u4e2a\u6574\u6570\u503c\u7684\u542b\u4e49\u5c31\u662f\u6211\u4eec\u719f\u77e5\u7684 <code>CompareTo<\/code> \u65b9\u6cd5\u7684\u8fd4\u56de\u503c\uff1a<\/p>\n<ul>\n<li>-1\uff1a\u8868\u793a\u7b2c\u4e00\u4e2a\u53c2\u6570\u5c0f\u4e8e\u7b2c\u4e8c\u4e2a\u53c2\u6570<\/li>\n<li>0\uff1a\u8868\u793a\u4e24\u4e2a\u53c2\u6570\u76f8\u7b49<\/li>\n<li>1\uff1a\u8868\u793a\u7b2c\u4e00\u4e2a\u53c2\u6570\u5927\u4e8e\u7b2c\u4e8c\u4e2a\u53c2\u6570<\/li>\n<\/ul>\n<p>\u6240\u4ee5\uff0c\u5982\u679c\u60f3\u8981\u5728\u4f7f\u7528\u5404\u79cd\u5e38\u89c1\u6392\u5e8f\u65b9\u6cd5\uff08\u5982 <code>Array.Sort<\/code>\u3001<code>List&lt;T&gt;.Sort<\/code> \u4ee5\u53ca LINQ \u7684 <code>OrderBy<\/code> \u7b49\uff09\u65f6\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u6392\u5e8f\u903b\u8f91\uff0c\u6211\u4eec\u9700\u8981\u6709\u4e00\u4e2a\u5b9e\u73b0\u4e86\u8fd9\u4e2a\u63a5\u53e3\u7684\u7c7b\uff0c\u5e76\u4e14\u5c06\u4e00\u4e2a\u5b9e\u4f8b\u4f20\u7ed9\u8fd9\u4e9b\u65b9\u6cd5\u3002<\/p>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u8fd9\u4e2a\u63a5\u53e3\u8fd8\u6709\u4e00\u4e2a\u975e\u6cdb\u578b\u7248\u672c <code>IComparer<\/code>\uff0c\u5b83\u7684 <code>Compare<\/code> \u65b9\u6cd5\u63a5\u53d7\u4e24\u4e2a <code>object<\/code> \u7c7b\u578b\u7684\u53c2\u6570\u3002\u867d\u7136\u975e\u6cdb\u578b\u7248\u672c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u53ef\u80fd\u4f1a\u7528\u5230\uff0c\u4f46\u901a\u5e38\u6211\u4eec\u66f4\u503e\u5411\u4e8e\u4f7f\u7528\u6cdb\u578b\u7248\u672c\uff0c\u56e0\u4e3a\u5b83\u63d0\u4f9b\u4e86\u7c7b\u578b\u5b89\u5168\u6027\uff0c\u5e76\u4e14\u4e5f\u51cf\u5c11\u4e86\u5f88\u591a\u6211\u4eec\u5728\u5b9e\u73b0\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9047\u5230\u7684\u7c7b\u578b\u8f6c\u6362\u95ee\u9898\u3002<\/div>\n<\/div>\n<h2 id=\"\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\">\n\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\n<a href=\"#%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e4%be%8b%e5%ad%90\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4ee5\u6211\u4eec\u524d\u9762\u63d0\u5230\u7684\u5458\u5de5\u6392\u5e8f\u4e3a\u4f8b\uff0c\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a <code>Employee<\/code> \u7c7b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Employee<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Department<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a <code>EmployeeComparer<\/code> \u7c7b\u6765\u5b9e\u73b0 <code>IComparer&lt;Employee&gt;<\/code> \u63a5\u53e3\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">EmployeeComparer<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IComparer<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Employee<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">DepartmentOrder<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;\u884c\u653f&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u8d22\u52a1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u4eba\u529b\u8d44\u6e90&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u5e02\u573a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u9500\u552e&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u8fd0\u8425&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u7814\u53d1&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Compare<\/span><span class=\"p\">(<\/span><span class=\"n\">Employee<\/span><span class=\"p\">?<\/span> <span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">Employee<\/span><span class=\"p\">?<\/span> <span class=\"n\">y<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"k\">is<\/span> <span class=\"kc\">null<\/span> <span class=\"p\">||<\/span> <span class=\"n\">y<\/span> <span class=\"k\">is<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArgumentNullException<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">xIndex<\/span> <span class=\"p\">=<\/span> <span class=\"n\">DepartmentOrder<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Department<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">yIndex<\/span> <span class=\"p\">=<\/span> <span class=\"n\">DepartmentOrder<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"p\">.<\/span><span class=\"n\">Department<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">xIndex<\/span> <span class=\"p\">==<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">)<\/span> <span class=\"n\">xIndex<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">MaxValue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">yIndex<\/span> <span class=\"p\">==<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">)<\/span> <span class=\"n\">yIndex<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">MaxValue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">deptComparison<\/span> <span class=\"p\">=<\/span> <span class=\"n\">xIndex<\/span><span class=\"p\">.<\/span><span class=\"n\">CompareTo<\/span><span class=\"p\">(<\/span><span class=\"n\">yIndex<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">deptComparison<\/span> <span class=\"p\">!=<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">deptComparison<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Compare<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">,<\/span> <span class=\"n\">StringComparison<\/span><span class=\"p\">.<\/span><span class=\"n\">Ordinal<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u975e\u6cdb\u578b\u7248\u672c\u4e0e\u4e0a\u9762\u7c7b\u4f3c\uff0c\u53ea\u662f\u53c2\u6570\u7c7b\u578b\u53d8\u6210\u4e86 <code>object<\/code>\uff0c\u5e76\u4e14\u9700\u8981\u8fdb\u884c\u7c7b\u578b\u8f6c\u6362\u3002\u8fd9\u91cc\u4e0d\u518d\u8d58\u8ff0\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e2a\u6bd4\u8f83\u5668\u6765\u6392\u5e8f\u4e00\u4e2a\u5458\u5de5\u5217\u8868\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Employee<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">employees<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">GetEmployeesAsync<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">comparer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">EmployeeComparer<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">employees<\/span><span class=\"p\">.<\/span><span class=\"n\">Sort<\/span><span class=\"p\">(<\/span><span class=\"n\">comparer<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6216\u8005\u4f7f\u7528 LINQ<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sortedEmployees<\/span> <span class=\"p\">=<\/span> <span class=\"n\">employees<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">OrderBy<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">e<\/span><span class=\"p\">,<\/span> <span class=\"n\">comparer<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">ThenBy<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u4e00\u4e2a\u66f4\u901a\u7528\u7684\u4f8b\u5b50\">\n\u4e00\u4e2a\u66f4\u901a\u7528\u7684\u4f8b\u5b50\n<a href=\"#%e4%b8%80%e4%b8%aa%e6%9b%b4%e9%80%9a%e7%94%a8%e7%9a%84%e4%be%8b%e5%ad%90\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5982\u679c\u5728\u6211\u4eec\u7684\u9879\u76ee\u4e2d\uff0c\u65f6\u5e38\u4f1a\u9047\u5230\u8fd9\u6837\u7684\u60c5\u5f62\uff0c\u4e5f\u5c31\u662f\u6211\u4eec\u5e0c\u671b\u624b\u52a8\u6307\u5b9a\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u7684\u6392\u5e8f\u65b9\u5f0f\u3002\u90a3\u4e48\u4e0a\u9762\u7684\u65b9\u5f0f\u53ef\u80fd\u5c31\u4e0d\u591f\u7075\u6d3b\u4e86\uff0c\u56e0\u4e3a\u6211\u4eec\u9700\u8981\u4e3a\u6bcf\u4e00\u79cd\u6570\u636e\u7c7b\u578b\u90fd\u521b\u5efa\u4e00\u4e2a\u6bd4\u8f83\u5668\u7c7b\u3002<\/p>\n<p>\u6b64\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5199\u4e00\u4e2a\u66f4\u52a0\u901a\u7528\u7684\u6bd4\u8f83\u5668\u7c7b <code>CustomComparer&lt;T&gt;<\/code>\uff0c\u5b83\u63a5\u53d7\u4e00\u4e2a\u6392\u5e8f\u89c4\u5219\u5217\u8868\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">sealed<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">CustomComparer<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IComparer<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Dictionary<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_customOrder<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">CustomComparer<\/span><span class=\"p\">(<\/span><span class=\"k\">params<\/span> <span class=\"n\">T<\/span><span class=\"p\">[]<\/span> <span class=\"n\">customOrder<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_customOrder<\/span> <span class=\"p\">=<\/span> <span class=\"n\">customOrder<\/span><span class=\"p\">.<\/span><span class=\"n\">Index<\/span><span class=\"p\">().<\/span><span class=\"n\">ToDictionary<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Item<\/span><span class=\"p\">,<\/span> <span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Index<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Compare<\/span><span class=\"p\">(<\/span><span class=\"n\">T<\/span><span class=\"p\">?<\/span> <span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">T<\/span><span class=\"p\">?<\/span> <span class=\"n\">y<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">==<\/span> <span class=\"kc\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">y<\/span> <span class=\"p\">==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">y<\/span> <span class=\"p\">==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"m\">1<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_customOrder<\/span><span class=\"p\">[<\/span><span class=\"n\">x<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">j<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_customOrder<\/span><span class=\"p\">[<\/span><span class=\"n\">y<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">i<\/span><span class=\"p\">.<\/span><span class=\"n\">CompareTo<\/span><span class=\"p\">(<\/span><span class=\"n\">j<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f7f\u7528\u8fd9\u4e2a\u901a\u7528\u6bd4\u8f83\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5730\u4e3a\u4efb\u4f55\u7c7b\u578b\u6307\u5b9a\u6392\u5e8f\u89c4\u5219\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">departments<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"s\">&#34;\u884c\u653f&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u8d22\u52a1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u4eba\u529b\u8d44\u6e90&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u5e02\u573a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u9500\u552e&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u8fd0\u8425&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u7814\u53d1&#34;<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">departmentComparer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">CustomComparer<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">departments<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sortedEmployees<\/span> <span class=\"p\">=<\/span> <span class=\"n\">employees<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">OrderBy<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Department<\/span><span class=\"p\">,<\/span> <span class=\"n\">departmentComparer<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">ThenBy<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u548c\u524d\u9762\u7684\u4f8b\u5b50\u7565\u6709\u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u91cc\u6211\u4eec\u53ea\u9488\u5bf9 <code>string<\/code> \u8fd9\u4e2a\u7c7b\u578b\u5b9a\u5236\u4e86\u6bd4\u8f83\u5668\u3002\u56e0\u6b64\u5728\u4f7f\u7528\u65f6\uff0c\u6211\u4eec\u9700\u8981\u6307\u5b9a <code>OrderBy<\/code> \u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u4e3a <code>e =&gt; e.Department<\/code>\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u4f20\u5165 <code>e<\/code>\u3002\u800c\u5728\u524d\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u76f4\u63a5\u9488\u5bf9\u7684\u6bd4\u8f83\u5bf9\u8c61\u5c31\u662f <code>Employee<\/code> \u7c7b\u578b\uff0c\u7136\u540e\u6211\u4eec\u5728 <code>Compare<\/code> \u65b9\u6cd5\u4e2d\u5904\u7406\u4e86 <code>Department<\/code> \u5c5e\u6027\u3002<\/div>\n<\/div>\n<p>\u901a\u8fc7\u5b9e\u73b0 <code>IComparer<\/code> \u63a5\u53e3\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u5730\u4e3a\u4efb\u4f55\u6570\u636e\u7c7b\u578b\u5b9a\u5236\u6392\u5e8f\u903b\u8f91\u3002\u8fd9\u4e0d\u4ec5\u63d0\u5347\u4e86\u4ee3\u7801\u7684\u7075\u6d3b\u6027\uff0c\u4e5f\u4f7f\u5f97\u6211\u4eec\u80fd\u591f\u66f4\u597d\u5730\u63a7\u5236\u6570\u636e\u7684\u5c55\u793a\u987a\u5e8f\uff0c\u4ece\u800c\u6ee1\u8db3\u5404\u79cd\u4e1a\u52a1\u9700\u6c42\u3002<\/p>\n<h2 id=\"\u5176\u4ed6\u65b9\u5f0f\">\n\u5176\u4ed6\u65b9\u5f0f\n<a href=\"#%e5%85%b6%e4%bb%96%e6%96%b9%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9664\u4e86\u4f7f\u7528 <code>IComparer<\/code> \u63a5\u53e3\uff0c\u6211\u4eec\u8fd8\u6709\u4e00\u4e9b\u522b\u7684\u65b9\u6cd5\u3002\u6bd4\u5982 <code>Sort<\/code>\u3001<code>OrderBy<\/code> \u7b49\u65b9\u6cd5\u5141\u8bb8\u6211\u4eec\u4f20\u5165\u4e00\u4e2a <code>Comparison&lt;T&gt;<\/code> \u59d4\u6258\u3002\u5b83\u7684\u58f0\u660e\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">delegate<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Comparison<\/span><span class=\"p\">&lt;<\/span><span class=\"k\">in<\/span> <span class=\"n\">T<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">T<\/span> <span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">T<\/span> <span class=\"n\">y<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u6765\u5b9a\u4e49\u6392\u5e8f\u903b\u8f91\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Employee<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">employees<\/span> <span class=\"p\">=<\/span> <span class=\"n\">GetEmployees<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Comparison<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Employee<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">comparison<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">departmentOrder<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"s\">&#34;\u884c\u653f&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u8d22\u52a1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u4eba\u529b\u8d44\u6e90&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u5e02\u573a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u9500\u552e&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u8fd0\u8425&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;\u7814\u53d1&#34;<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">xIndex<\/span> <span class=\"p\">=<\/span> <span class=\"n\">departmentOrder<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Department<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">yIndex<\/span> <span class=\"p\">=<\/span> <span class=\"n\">departmentOrder<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"n\">y<\/span><span class=\"p\">.<\/span><span class=\"n\">Department<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">xIndex<\/span> <span class=\"p\">==<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">)<\/span> <span class=\"n\">xIndex<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">MaxValue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">yIndex<\/span> <span class=\"p\">==<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">)<\/span> <span class=\"n\">yIndex<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">MaxValue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">deptComparison<\/span> <span class=\"p\">=<\/span> <span class=\"n\">xIndex<\/span><span class=\"p\">.<\/span><span class=\"n\">CompareTo<\/span><span class=\"p\">(<\/span><span class=\"n\">yIndex<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">deptComparison<\/span> <span class=\"p\">!=<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">deptComparison<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Compare<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">,<\/span> <span class=\"n\">StringComparison<\/span><span class=\"p\">.<\/span><span class=\"n\">Ordinal<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">employees<\/span><span class=\"p\">.<\/span><span class=\"n\">Sort<\/span><span class=\"p\">(<\/span><span class=\"n\">comparison<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53e6\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u76f4\u63a5\u4fee\u6539\u7c7b\u578b\u672c\u8eab\uff0c\u6765\u5b9e\u73b0 <code>IComparable<\/code> \u63a5\u53e3\uff0c\u4ece\u800c\u5b9a\u4e49\u9ed8\u8ba4\u7684\u6392\u5e8f\u903b\u8f91\u3002\u8fd9\u79cd\u65b9\u6cd5\u6211\u4eec\u5c31\u4e0d\u518d\u505a\u5177\u4f53\u4ecb\u7ecd\u4e86\uff0c\u56e0\u4e3a\u5b83\u5b58\u5728\u663e\u8457\u7684\u5c40\u9650\u6027\uff1a\u6bcf\u4e2a\u7c7b\u578b\u53ea\u80fd\u6709\u4e00\u79cd\u9ed8\u8ba4\u6392\u5e8f\u65b9\u5f0f\u3002\u5982\u679c\u6211\u4eec\u5c06 <code>Employee<\/code> \u7c7b\u578b\u7684\u6bd4\u8f83\u65b9\u5f0f\u786c\u6027\u5b9a\u4e49\u4e3a\u4e86\u201c\u5148\u90e8\u95e8\uff0c\u540e\u59d3\u540d\u201d\u7684\u65b9\u5f0f\uff0c\u90a3\u4e48\u6b64\u540e\u5982\u679c\u6211\u4eec\u60f3\u5728\u4f7f\u7528 LINQ \u65f6\u91c7\u7528\u522b\u7684\u6392\u5e8f\u65b9\u5f0f\uff0c\u5c31\u4f1a\u53d8\u5f97\u975e\u5e38\u9ebb\u70e6\u3002\u8fd9\u79cd\u65b9\u5f0f\u53ea\u9002\u5408\u975e\u5e38\u7b80\u5355\u7684\u6570\u636e\u7c7b\u578b\u53ca\u573a\u666f\uff0c\u6bd4\u5982\u6211\u4eec\u5b9a\u4e49\u4e86\u4e00\u79cd\u5305\u88c5\u7c7b\uff0c\u5b83\u5b9e\u9645\u6392\u5e8f\u4f9d\u9760\u7684\u662f\u5185\u90e8\u7684\u67d0\u4e2a\u6570\u503c\u5c5e\u6027\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u901a\u8fc7\u5b9e\u73b0 <code>IComparer<\/code> \u63a5\u53e3\uff0c\u6211\u4eec\u53ef\u4ee5\u4e3a\u4efb\u4f55\u6570\u636e\u7c7b\u578b\u5b9a\u5236\u6392\u5e8f\u903b\u8f91\uff0c\u4ece\u800c\u6ee1\u8db3\u5404\u79cd\u590d\u6742\u7684\u4e1a\u52a1\u9700\u6c42\u3002\u65e0\u8bba\u662f\u4e3a\u7279\u5b9a\u7c7b\u578b\u521b\u5efa\u4e13\u7528\u7684\u6bd4\u8f83\u5668\uff0c\u8fd8\u662f\u4f7f\u7528\u901a\u7528\u7684\u6bd4\u8f83\u5668\u7c7b\uff0c\u6211\u4eec\u90fd\u80fd\u591f\u7075\u6d3b\u5730\u63a7\u5236\u6570\u636e\u7684\u6392\u5e8f\u65b9\u5f0f\u3002\u6b64\u5916\uff0c\u4f7f\u7528 <code>Comparison&lt;T&gt;<\/code> \u59d4\u6258\u4e5f\u662f\u4e00\u79cd\u7b80\u4fbf\u7684\u65b9\u6cd5\uff0c\u9002\u7528\u4e8e\u7b80\u5355\u7684\u6392\u5e8f\u9700\u6c42\u3002\u603b\u4e4b\uff0c\u638c\u63e1\u8fd9\u4e9b\u6280\u672f\uff0c\u53ef\u4ee5\u8ba9\u6211\u4eec\u5728\u5904\u7406\u6570\u636e\u65f6\u66f4\u52a0\u5f97\u5fc3\u5e94\u624b\u3002<\/p>"},{"title":"\u76d8\u70b9 LINQ \u5728\u6700\u8fd1\u51e0\u4e2a .NET \u7248\u672c\u4e2d\u65b0\u589e\u7684\u529f\u80fd\u548c\u7279\u6027","link":"https:\/\/blog.coldwind.top\/posts\/linq-new-features-added-in-recent-dotnet\/","pubDate":"Thu, 25 Sep 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/linq-new-features-added-in-recent-dotnet\/","description":"<p>LINQ \u8868\u8fbe\u5f0f\u76f8\u4fe1\u6bcf\u4e00\u4f4d C# \u5f00\u53d1\u8005\u90fd\u4e0d\u964c\u751f\uff0cLINQ \u4f5c\u4e3a C# \u8bed\u8a00\u7684\u6838\u5fc3\u529f\u80fd\u4e4b\u4e00\uff0c\u6781\u5927\u5730\u7b80\u5316\u4e86\u6570\u636e\u67e5\u8be2\u548c\u64cd\u4f5c\u7684\u8fc7\u7a0b\u3002\u968f\u7740 .NET \u5e73\u53f0\u7684\u4e0d\u65ad\u53d1\u5c55\uff0cLINQ \u4e5f\u5728\u4e0d\u65ad\u5730\u5f15\u5165\u65b0\u7684\u7279\u6027\u548c\u6539\u8fdb\uff0c\u4ee5\u63d0\u5347\u5f00\u53d1\u8005\u7684\u751f\u4ea7\u529b\u548c\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u3002\u672c\u6587\u5c06\u4ecb\u7ecd\u6700\u8fd1\u51e0\u4e2a\u7248\u672c\u7684 .NET \u4e2d\u65b0\u589e\u7684 LINQ \u7279\u6027\u3002<\/p>\n<h2 id=\"net-6\">\n.NET 6\n<a href=\"#net-6\" class=\"anchor\">&para;<\/a>\n<\/h2><p>.NET 5 \u4f5c\u4e3a\u9996\u6b21\u5408\u5e76\u4e86 .NET Framework \u548c .NET Core \u7684\u7248\u672c\uff0c\u6807\u5fd7\u7740 .NET \u751f\u6001\u7cfb\u7edf\u7684\u7edf\u4e00\u3002\u8fd9\u4e00\u7248\u672c\u5e76\u6ca1\u6709\u5f15\u5165\u4ec0\u4e48\u65b0\u7684 LINQ \u7279\u6027\uff0c\u4f46\u662f\u5728\u968f\u540e\u7684\u7b2c\u4e00\u4e2a LTS \u7248\u672c .NET 6 \u4e2d\uff0c\u5fae\u8f6f\u5f15\u5165\u4e86\u5f88\u591a\u65b0\u529f\u80fd\u3002<\/p>\n<h3 id=\"1-chunk-\u65b9\u6cd5\">\n1. Chunk \u65b9\u6cd5\n<a href=\"#1-chunk-%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h3><p><code>Chunk<\/code> \u65b9\u6cd5\u5141\u8bb8\u5f00\u53d1\u8005\u5c06\u4e00\u4e2a\u5e8f\u5217\u5206\u5272\u6210\u591a\u4e2a\u56fa\u5b9a\u5927\u5c0f\u7684\u5757\u3002\u8fd9\u5728\u5904\u7406\u5927\u6570\u636e\u96c6\u65f6\u975e\u5e38\u6709\u7528\uff0c\u53ef\u4ee5\u5e2e\u52a9\u51cf\u5c11\u5185\u5b58\u5360\u7528\u548c\u63d0\u9ad8\u6027\u80fd\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Enumerable<\/span><span class=\"p\">.<\/span><span class=\"n\">Range<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">10<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">chunks<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Chunk<\/span><span class=\"p\">(<\/span><span class=\"m\">3<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">chunk<\/span> <span class=\"k\">in<\/span> <span class=\"n\">chunks<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Join<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;, &#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">chunk<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8f93\u51fa:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 1, 2, 3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 4, 5, 6<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 7, 8, 9<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 10<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u6700\u540e\u4e00\u5757\u7684\u5143\u7d20\u6570\u91cf\u4e0d\u8db3\u6307\u5b9a\u5927\u5c0f\uff0c\u5b83\u5c06\u5305\u542b\u5269\u4f59\u7684\u6240\u6709\u5143\u7d20\u3002<\/p>\n<h3 id=\"2-minby--maxby\">\n2. MinBy &amp; MaxBy\n<a href=\"#2-minby--maxby\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5728\u4ee5\u524d\u6211\u4eec\u6709 <code>Min<\/code> \u548c <code>Max<\/code> \u65b9\u6cd5\uff0c\u7528\u6765\u83b7\u53d6\u5e8f\u5217\u4e2d\u7684\u6700\u5c0f\u503c\u548c\u6700\u5927\u503c\u3002\u8fd9\u5bf9\u4e8e\u6700\u4f20\u7edf\u7684\u503c\u7c7b\u578b\uff0c\u5c24\u5176\u662f\u6570\u5b57\u7c7b\u578b\u6765\u8bf4\u662f\u975e\u5e38\u6613\u7528\u4e14\u6613\u61c2\u7684\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">3<\/span><span class=\"p\">,<\/span> <span class=\"m\">4<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">min<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Min<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ 1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">max<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Max<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ 5<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u5982\u679c\u6211\u4eec\u9762\u5bf9\u7684\u662f\u4e00\u4e2a\u8f83\u4e3a\u590d\u6742\u7684\u5bf9\u8c61\uff0c\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u73b0\u5728\u6211\u4eec\u60f3\u83b7\u53d6\u5e74\u9f84\u6700\u5927\u7684\u4eba\uff0c\u4f7f\u7528\u4f20\u7edf\u7684\u65b9\u5f0f\u5c31\u4f1a\u6bd4\u8f83\u7e41\u7410\u4e14\u6027\u80fd\u4f4e\u4e0b\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">people<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Person<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Alice&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">30<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Bob&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">25<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Charlie&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">35<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u65b9\u6cd5\u4e00<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">oldestPerson<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">OrderByDescending<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age<\/span><span class=\"p\">).<\/span><span class=\"n\">First<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u65b9\u6cd5\u4e8c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">oldestAge<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">Max<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">oldestPerson<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">First<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age<\/span> <span class=\"p\">==<\/span> <span class=\"n\">oldestAge<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u800c\u5728 .NET 6 \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 <code>MaxBy<\/code> \u548c <code>MinBy<\/code> \u65b9\u6cd5\u6765\u7b80\u5316\u8fd9\u4e2a\u8fc7\u7a0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">oldestPerson<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">MaxBy<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">youngestPerson<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">MinBy<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"3-distinctby-\u7b49\">\n3. DistinctBy \u7b49\n<a href=\"#3-distinctby-%e7%ad%89\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u4e0e\u4e0a\u9762\u7684 <code>MinBy<\/code> \u548c <code>MaxBy<\/code> \u7c7b\u4f3c\uff0c<code>DistinctBy<\/code> \u7b49\u65b9\u6cd5\u4e5f\u662f\u5141\u8bb8\u6211\u4eec\u57fa\u4e8e\u67d0\u4e2a\u5c5e\u6027\u6765\u8fdb\u884c\u53bb\u91cd\u3001\u4ea4\u96c6\u548c\u5dee\u96c6\u64cd\u4f5c\uff0c\u5e76\u6700\u7ec8\u8fd4\u56de\u539f\u59cb\u5bf9\u8c61\u3002\u6bd4\u5982\u4e0b\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u6240\u6709\u540d\u5b57\u4e0d\u91cd\u590d\u7684\u4eba\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">people<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Person<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Alice&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">30<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Bob&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">25<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Charlie&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">35<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Alice&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">28<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">distinctByName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">DistinctBy<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p><code>IntersectBy<\/code> \u548c <code>ExceptBy<\/code> \u4e5f\u662f\u7c7b\u4f3c\u7684\u7528\u6cd5\u3002\u5b83\u4eec\u5141\u8bb8\u6211\u4eec\u57fa\u4e8e\u67d0\u4e2a\u5c5e\u6027\u6765\u8fdb\u884c\u4ea4\u96c6\u548c\u5dee\u96c6\u64cd\u4f5c\u3002\u5177\u4f53\u7684\u4ee3\u7801\u8fd9\u91cc\u5c31\u4e0d\u5c55\u793a\u4e86\uff0c\u5927\u5bb6\u5728\u7528\u5230\u7684\u65f6\u5019\u76f8\u4fe1\u5f88\u5feb\u5c31\u80fd\u4e0a\u624b\u3002<\/p>\n<h3 id=\"4-firstordefault-\u7b49\u65b9\u6cd5\u7684\u91cd\u8f7d\">\n4. FirstOrDefault \u7b49\u65b9\u6cd5\u7684\u91cd\u8f7d\n<a href=\"#4-firstordefault-%e7%ad%89%e6%96%b9%e6%b3%95%e7%9a%84%e9%87%8d%e8%bd%bd\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5728\u8fd9\u4e2a\u7248\u672c\u4e2d\uff0c<code>FirstOrDefault<\/code>\u3001<code>LastOrDefault<\/code>\u3001<code>SingleOrDefault<\/code> \u8fd9\u4e9b\u65b9\u6cd5\u5141\u8bb8\u4f20\u5165\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684\u9ed8\u8ba4\u503c\uff0c\u800c\u4e0d\u662f\u8fd4\u56de\u7c7b\u578b\u7684\u9ed8\u8ba4\u503c\uff08\u4f8b\u5982 <code>null<\/code> \u6216 <code>0<\/code>\uff09\u3002\u8fd9\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u53ef\u4ee5\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u63d0\u9ad8\u53ef\u8bfb\u6027\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">num<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">FirstOrDefault<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">n<\/span> <span class=\"p\">&gt;<\/span> <span class=\"m\">10<\/span><span class=\"p\">,<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u5143\u7d20\uff0c\u8fd4\u56de -1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">student<\/span> <span class=\"p\">=<\/span> <span class=\"n\">students<\/span><span class=\"p\">.<\/span><span class=\"n\">SingleOrDefault<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">s<\/span><span class=\"p\">.<\/span><span class=\"n\">Id<\/span> <span class=\"p\">==<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Student<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Unknown&#34;<\/span> <span class=\"p\">});<\/span> <span class=\"c1\">\/\/ \u5982\u679c\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u5143\u7d20\uff0c\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684 Student \u5bf9\u8c61\uff0c\u800c\u4e0d\u662f null<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u5bf9\u4e8e\u5f15\u7528\u7c7b\u578b\u6765\u8bf4\uff0c\u6216\u8bb8\u53ef\u4ee5\u501f\u52a9 <code>??<\/code> \u64cd\u4f5c\u7b26\u6765\u5b9e\u73b0\u7c7b\u4f3c\u7684\u529f\u80fd\uff1b\u4f46\u5bf9\u4e8e\u503c\u7c7b\u578b\u6765\u8bf4\uff0c\u8fd9\u4e2a\u91cd\u8f7d\u5c31\u663e\u5f97\u975e\u5e38\u597d\u7528\u4e86\u3002<\/p>\n<h3 id=\"5-take\">\n5. Take\n<a href=\"#5-take\" class=\"anchor\">&para;<\/a>\n<\/h3><p>C# 8 \u5f15\u5165\u4e86\u7d22\u5f15\u548c\u8303\u56f4\u7684\u6982\u5ff5\uff0c\u8fd9\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u66f4\u65b9\u4fbf\u5730\u4ece\u96c6\u5408\u4e2d\u83b7\u53d6\u5b50\u96c6\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Enumerable<\/span><span class=\"p\">.<\/span><span class=\"n\">Range<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">10<\/span><span class=\"p\">).<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">firstThree<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">[..<\/span><span class=\"m\">3<\/span><span class=\"p\">];<\/span> <span class=\"c1\">\/\/ \u83b7\u53d6\u524d3\u4e2a\u5143\u7d20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">lastThree<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">[^<\/span><span class=\"m\">3.<\/span><span class=\"p\">.];<\/span> <span class=\"c1\">\/\/ \u83b7\u53d6\u540e3\u4e2a\u5143\u7d20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">middleThree<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">[<\/span><span class=\"m\">3.<\/span><span class=\"p\">.<\/span><span class=\"m\">6<\/span><span class=\"p\">];<\/span> <span class=\"c1\">\/\/ \u83b7\u53d6\u7b2c4\u5230\u7b2c6\u4e2a\u5143\u7d20<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u73b0\u5728\uff0c<code>Take<\/code> \u65b9\u6cd5\u4e5f\u652f\u6301\u4f20\u5165\u4e00\u4e2a\u8303\u56f4\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u518d\u642d\u914d\u4f7f\u7528 <code>Skip<\/code> \u7b49\u65b9\u6cd5\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Enumerable<\/span><span class=\"p\">.<\/span><span class=\"n\">Range<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">10<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4ee5\u524d\u7684\u505a\u6cd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">middleThree<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Skip<\/span><span class=\"p\">(<\/span><span class=\"m\">3<\/span><span class=\"p\">).<\/span><span class=\"n\">Take<\/span><span class=\"p\">(<\/span><span class=\"m\">3<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u73b0\u5728\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u8303\u56f4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">middleThree<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Take<\/span><span class=\"p\">(<\/span><span class=\"m\">3.<\/span><span class=\"p\">.<\/span><span class=\"m\">6<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"6-zip\">\n6. Zip\n<a href=\"#6-zip\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5bf9\u4e8e <code>Zip<\/code> \u65b9\u6cd5\uff0c\u73b0\u5728\u591a\u4e86\u4e00\u4e2a\u91cd\u8f7d\uff0c\u5141\u8bb8\u6211\u4eec\u7ec4\u5408\u4e09\u4e2a\u5e8f\u5217\u3002\u6216\u8bb8\u5728\u7279\u5b9a\u60c5\u51b5\u4e0b\uff0c\u8fd9\u4e00\u529f\u80fd\u4f1a\u6d3e\u4e0a\u7528\u573a\u3002\u4f46\u5947\u602a\u7684\u662f\uff0c\u5fae\u8f6f\u5e76\u6ca1\u6709\u63d0\u4f9b\u66f4\u591a\u7684\u91cd\u8f7d\u6765\u652f\u6301\u66f4\u591a\u7684\u5e8f\u5217\u3002<\/p>\n<p>\u5982\u679c\u6211\u4eec\u6709\u7ec4\u5408\u66f4\u591a\u5e8f\u5217\u7684\u9700\u6c42\uff0c\u53ef\u4ee5\u8003\u8651\u591a\u6b21\u4f7f\u7528 <code>Zip<\/code> \u65b9\u6cd5\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers1<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">3<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers2<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"m\">4<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">,<\/span> <span class=\"m\">6<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers3<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"m\">7<\/span><span class=\"p\">,<\/span> <span class=\"m\">8<\/span><span class=\"p\">,<\/span> <span class=\"m\">9<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">zipped<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Zip<\/span><span class=\"p\">(<\/span><span class=\"n\">numbers2<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"n\">n1<\/span><span class=\"p\">,<\/span> <span class=\"n\">n2<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"n\">n1<\/span><span class=\"p\">,<\/span> <span class=\"n\">n2<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Zip<\/span><span class=\"p\">(<\/span><span class=\"n\">numbers3<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"n\">pair<\/span><span class=\"p\">,<\/span> <span class=\"n\">n3<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"n\">pair<\/span><span class=\"p\">.<\/span><span class=\"n\">n1<\/span><span class=\"p\">,<\/span> <span class=\"n\">pair<\/span><span class=\"p\">.<\/span><span class=\"n\">n2<\/span><span class=\"p\">,<\/span> <span class=\"n\">n3<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"net-7\">\n.NET 7\n<a href=\"#net-7\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u4e2a\u7248\u672c\u867d\u7136\u5728\u65b9\u6cd5\u4e0a\u4ec5\u65b0\u589e\u4e86\u4e24\u4e2a\uff0c\u4f46 LINQ \u5728\u6027\u80fd\u4e0a\u5f97\u5230\u4e86\u663e\u8457\u63d0\u5347\u3002\u5fae\u8f6f\u5bf9 LINQ \u7684\u5b9e\u73b0\u8fdb\u884c\u4e86\u4f18\u5316\uff0c\u51cf\u5c11\u4e86\u5185\u5b58\u5206\u914d\u548c\u63d0\u9ad8\u4e86\u6267\u884c\u901f\u5ea6\u3002<\/p>\n<h3 id=\"order--orderdescending\">\nOrder &amp; OrderDescending\n<a href=\"#order--orderdescending\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5728 .NET 7 \u4e2d\uff0c\u5fae\u8f6f\u5f15\u5165\u4e86 <code>Order<\/code> \u548c <code>OrderDescending<\/code> \u65b9\u6cd5\uff0c\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u5141\u8bb8\u6211\u4eec\u5bf9\u5e8f\u5217\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u4e0d\u9700\u8981\u6307\u5b9a\u6392\u5e8f\u7684\u952e\u3002\u5b83\u4eec\u4f1a\u6839\u636e\u5143\u7d20\u9ed8\u8ba4\u7684\u6bd4\u8f83\u5668\u8fdb\u884c\u6392\u5e8f\u3002<\/p>\n<p>\u6709\u4e86\u8fd9\u4e2a\u65b0\u65b9\u6cd5\uff0c\u5f53\u6211\u4eec\u4e0d\u9700\u8981\u6307\u5b9a\u6392\u5e8f\u952e\u65f6\uff0c\u4ee3\u7801\u4f1a\u66f4\u52a0\u7b80\u6d01\uff0c\u800c\u4e14\u56e0\u4e3a\u51cf\u5c11\u4e86\u59d4\u6258\u7684\u4f7f\u7528\uff0c\u4e5f\u4f1a\u7565\u5fae\u51cf\u5c0f\u4e00\u4e9b\u6027\u80fd\u5f00\u9500\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"m\">3<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">4<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">,<\/span> <span class=\"m\">9<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sortedNumbers<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">OrderBy<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sortedNumbers<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Order<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0d\u8fc7\u8fd9\u91cc\u4ecd\u7136\u6709\u5fc5\u8981\u5f3a\u8c03\u4e00\u4e0b\uff0c\u5bf9\u4e8e\u4f20\u7edf\u7684\u96c6\u5408\u7c7b\u578b\uff0c\u6bd4\u5982\u6570\u7ec4\u548c <code>List&lt;T&gt;<\/code>\uff0c\u6211\u4eec\u5982\u679c\u6709\u539f\u5730\uff08in-place\uff09\u6392\u5e8f\u7684\u9700\u6c42\uff0c\u8fd8\u662f\u5e94\u8be5\u4f7f\u7528\u5b83\u4eec\u81ea\u5e26\u7684 <code>Sort<\/code> \u65b9\u6cd5\uff0c\u56e0\u4e3a\u5b83\u4eec\u4f1a\u76f4\u63a5\u4fee\u6539\u539f\u59cb\u96c6\u5408\u3002\u8fd9\u79cd\u65f6\u5019\u5982\u679c\u4f7f\u7528 LINQ \u7684 <code>Order().ToArray()<\/code> \u7b49\u65b9\u6cd5\uff0c\u53cd\u800c\u4f1a\u5e26\u6765\u4e0d\u5fc5\u8981\u7684\u5185\u5b58\u5206\u914d\u548c\u6027\u80fd\u5f00\u9500\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">arr<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"m\">3<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">4<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">,<\/span> <span class=\"m\">9<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">list<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"m\">3<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">4<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">,<\/span> <span class=\"m\">9<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Array<\/span><span class=\"p\">.<\/span><span class=\"n\">Sort<\/span><span class=\"p\">(<\/span><span class=\"n\">arr<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u539f\u5730\u6392\u5e8f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">Sort<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u539f\u5730\u6392\u5e8f<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"net-8\">\n.NET 8\n<a href=\"#net-8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u4e2a\u7248\u672c\u5e76\u6ca1\u6709\u5f15\u5165\u65b0\u7684 LINQ \u65b9\u6cd5\uff0c\u4f46\u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c<code>Random<\/code> \u65b0\u5f15\u5165\u4e86 <code>Shuffle<\/code> \u65b9\u6cd5\uff0c\u4e5f\u5c31\u662f\u6d17\u724c\u7b97\u6cd5\u3002\u8fd9\u4e2a\u65b9\u6cd5\u53ef\u4ee5\u968f\u673a\u6253\u4e71\u4e00\u4e2a\u5e8f\u5217\u7684\u987a\u5e8f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Enumerable<\/span><span class=\"p\">.<\/span><span class=\"n\">Range<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">10<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">shuffledNumbers<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Random<\/span><span class=\"p\">.<\/span><span class=\"n\">Shared<\/span><span class=\"p\">.<\/span><span class=\"n\">Shuffle<\/span><span class=\"p\">(<\/span><span class=\"n\">numbers<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"net-9\">\n.NET 9\n<a href=\"#net-9\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"index\">\nIndex\n<a href=\"#index\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5728 .NET 9 \u4e2d\uff0c\u5fae\u8f6f\u5f15\u5165\u4e86 <code>Index<\/code> \u65b9\u6cd5\u3002\u8fd9\u4e2a\u65b9\u6cd5\u5e76\u4e0d\u662f\u7c7b\u4f3c <code>IndexOf<\/code>\uff0c\u800c\u662f\u53ef\u4ee5\u5c06\u4e00\u4e2a\u5e8f\u5217\u5305\u88c5\u4e3a\u4e00\u4e9b\u5305\u542b\u4e86 <code>Index<\/code> \u548c <code>Item<\/code> \u7684\u5143\u7ec4\uff08<code>ValueTuple<\/code>\uff09\uff0c\u65b9\u4fbf\u6211\u4eec\u5728\u904d\u5386\u65f6\u83b7\u53d6\u5143\u7d20\u7684\u7d22\u5f15\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"m\">10<\/span><span class=\"p\">,<\/span> <span class=\"m\">20<\/span><span class=\"p\">,<\/span> <span class=\"m\">30<\/span><span class=\"p\">,<\/span> <span class=\"m\">40<\/span><span class=\"p\">,<\/span> <span class=\"m\">50<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"p\">(<\/span><span class=\"n\">index<\/span><span class=\"p\">,<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span> <span class=\"k\">in<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Index<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;Index: {index}, Item: {item}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u5b9e\u5728\u4ee5\u524d\uff0c\u6211\u4eec\u501f\u52a9 <code>Select<\/code> \u65b9\u6cd5\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u7c7b\u4f3c\u7684\u529f\u80fd\u3002<code>Select<\/code> \u65b9\u6cd5\u6709\u4e00\u4e9b\u91cd\u8f7d\uff0c\u5141\u8bb8\u6211\u4eec\u5728\u9009\u62e9\u5143\u7d20\u7684\u540c\u65f6\u83b7\u53d6\u5b83\u4eec\u7684\u7d22\u5f15\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">pair<\/span> <span class=\"k\">in<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">((<\/span><span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"n\">index<\/span><span class=\"p\">,<\/span> <span class=\"n\">item<\/span><span class=\"p\">)))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;Index: {pair.index}, Item: {pair.item}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0d\u8fc7 <code>Index<\/code> \u65b9\u6cd5\u7684\u8bed\u4e49\u4f1a\u66f4\u52a0\u660e\u786e\u4e00\u4e9b\uff0c\u4e5f\u66f4\u52a0\u6613\u7528\u4e86\u3002<\/p>\n<h3 id=\"countby\">\nCountBy\n<a href=\"#countby\" class=\"anchor\">&para;<\/a>\n<\/h3><p><code>CountBy<\/code> \u65b9\u6cd5\u5141\u8bb8\u6211\u4eec\u6839\u636e\u67d0\u4e2a\u952e\u5bf9\u5e8f\u5217\u8fdb\u884c\u5206\u7ec4\uff0c\u5e76\u8ba1\u7b97\u6bcf\u4e2a\u7ec4\u7684\u5143\u7d20\u6570\u91cf\u3002\u5b83\u8fd4\u56de\u4e00\u4e2a\u5305\u542b\u952e\u548c\u503c\u7684\u5143\u7ec4\u5e8f\u5217\u3002<\/p>\n<p>\u6bd4\u5982\u6211\u4eec\u6709\u4e00\u4e2a\u4ea7\u54c1\u5217\u8868\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Product<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Category<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>CountBy<\/code> \u65b9\u6cd5\u6765\u7edf\u8ba1\u6bcf\u4e2a\u7c7b\u522b\u7684\u4ea7\u54c1\u6570\u91cf\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">products<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Product<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Product<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Apple&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Category<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Fruit&#34;<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Product<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Banana&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Category<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Fruit&#34;<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Product<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Carrot&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Category<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Vegetable&#34;<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Product<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Broccoli&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Category<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Vegetable&#34;<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">Product<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Chicken&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Category<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Meat&#34;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">categoryCounts<\/span> <span class=\"p\">=<\/span> <span class=\"n\">products<\/span><span class=\"p\">.<\/span><span class=\"n\">CountBy<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Category<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u7ed3\u679c:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ [(&#34;Fruit&#34;, 2), (&#34;Vegetable&#34;, 2), (&#34;Meat&#34;, 1)]<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u4ee5\u524d\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9 <code>GroupBy<\/code> \u65b9\u6cd5\u6765\u5b9e\u73b0\u7c7b\u4f3c\u7684\u529f\u80fd\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">categoryCounts<\/span> <span class=\"p\">=<\/span> <span class=\"n\">products<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">GroupBy<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Category<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">g<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"n\">Category<\/span><span class=\"p\">:<\/span> <span class=\"n\">g<\/span><span class=\"p\">.<\/span><span class=\"n\">Key<\/span><span class=\"p\">,<\/span> <span class=\"n\">Count<\/span><span class=\"p\">:<\/span> <span class=\"n\">g<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span><span class=\"p\">()));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"aggregateby\">\nAggregateBy\n<a href=\"#aggregateby\" class=\"anchor\">&para;<\/a>\n<\/h3><p><code>AggregateBy<\/code> \u65b9\u6cd5\u5141\u8bb8\u6211\u4eec\u6839\u636e\u67d0\u4e2a\u952e\u5bf9\u5e8f\u5217\u8fdb\u884c\u5206\u7ec4\uff0c\u5e76\u5bf9\u6bcf\u4e2a\u7ec4\u5e94\u7528\u4e00\u4e2a\u805a\u5408\u51fd\u6570\u3002\u5b83\u8fd4\u56de\u4e00\u4e2a\u5305\u542b\u952e\u548c\u503c\u7684\u5143\u7ec4\u5e8f\u5217\u3002<\/p>\n<p>\u9996\u5148\u6211\u4eec\u7b80\u5355\u56de\u987e\u4e00\u4e0b <code>Aggregate<\/code> \u65b9\u6cd5\u3002\u8fd9\u4e2a\u65b9\u6cd5\u5141\u8bb8\u6211\u4eec\u5bf9\u5e8f\u5217\u4e2d\u7684\u5143\u7d20\u8fdb\u884c\u7d2f\u79ef\u64cd\u4f5c\uff0c\u6bd4\u5982\u8ba1\u7b97\u603b\u548c\u3001\u4e58\u79ef\u7b49\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">3<\/span><span class=\"p\">,<\/span> <span class=\"m\">4<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sum<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Aggregate<\/span><span class=\"p\">((<\/span><span class=\"n\">acc<\/span><span class=\"p\">,<\/span> <span class=\"n\">n<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">acc<\/span> <span class=\"p\">+<\/span> <span class=\"n\">n<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ 15<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">product<\/span> <span class=\"p\">=<\/span> <span class=\"n\">numbers<\/span><span class=\"p\">.<\/span><span class=\"n\">Aggregate<\/span><span class=\"p\">((<\/span><span class=\"n\">acc<\/span><span class=\"p\">,<\/span> <span class=\"n\">n<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">acc<\/span> <span class=\"p\">*<\/span> <span class=\"n\">n<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ 120<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u73b0\u5728\uff0c<code>AggregateBy<\/code> \u65b9\u6cd5\u5141\u8bb8\u6211\u4eec\u5148\u6839\u636e\u67d0\u4e2a\u952e\u5bf9\u5e8f\u5217\u8fdb\u884c\u5206\u7ec4\uff0c\u7136\u540e\u5bf9\u6bcf\u4e2a\u7ec4\u5e94\u7528\u4e00\u4e2a\u805a\u5408\u51fd\u6570\u3002\u6bd4\u5982\u6211\u4eec\u6709\u4e00\u4e9b\u8ba2\u5355\uff0c\u6211\u4eec\u60f3\u8ba1\u7b97\u6bcf\u4e2a\u5ba2\u6237\u7684\u8ba2\u5355\u603b\u91d1\u989d\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Order<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Customer<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">decimal<\/span> <span class=\"n\">Amount<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">results<\/span> <span class=\"p\">=<\/span> <span class=\"n\">orders<\/span><span class=\"p\">.<\/span><span class=\"n\">AggregateBy<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">order<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">order<\/span><span class=\"p\">.<\/span><span class=\"n\">Customer<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u5206\u7ec4\u952e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">(<\/span><span class=\"n\">acc<\/span><span class=\"p\">,<\/span> <span class=\"n\">order<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">acc<\/span> <span class=\"p\">+<\/span> <span class=\"n\">order<\/span><span class=\"p\">.<\/span><span class=\"n\">Amount<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u805a\u5408\u51fd\u6570<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">0<\/span><span class=\"n\">m<\/span> <span class=\"c1\">\/\/ \u521d\u59cb\u503c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u8fd9\u4e2a\u4f8b\u5b50\u770b\u4f3c\u53ef\u4ee5\u7528 <code>GroupBy<\/code> \u548c <code>Select<\/code> \u6765\u5b9e\u73b0\uff0c\u4f46\u5b9e\u9645\u4e0a <code>AggregateBy<\/code> \u7684\u6027\u80fd\u4f1a\u66f4\u597d\u4e00\u4e9b\uff0c\u56e0\u4e3a\u5b83\u907f\u514d\u4e86\u4e2d\u95f4\u96c6\u5408\u7684\u521b\u5efa\u3002<code>GroupBy<\/code> \u4f1a\u521b\u5efa\u4e00\u4e2a\u4e2d\u95f4\u7684\u5206\u7ec4\u96c6\u5408\uff0c\u800c <code>AggregateBy<\/code> \u5219\u76f4\u63a5\u5728\u904d\u5386\u65f6\u8fdb\u884c\u805a\u5408\u64cd\u4f5c\u3002<\/div>\n<\/div>\n<h2 id=\"\u5173\u4e8e-by-\u7684\u601d\u8003\">\n\u5173\u4e8e By \u7684\u601d\u8003\n<a href=\"#%e5%85%b3%e4%ba%8e-by-%e7%9a%84%e6%80%9d%e8%80%83\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 LINQ \u4e2d\uff0c\u540d\u79f0\u5e26\u6709 <code>By<\/code> \u7684\u65b9\u6cd5\u6709\u5f88\u591a\u3002\u8fd9\u91cc\u7684 <code>By<\/code> \u867d\u7136\u90fd\u8868\u793a\u8981\u57fa\u4e8e\u67d0\u4e2a\u65b9\u5f0f\uff08\u6bd4\u5982\u5c5e\u6027\u3001\u952e\u7b49\uff09\u6765\u8fdb\u884c\u64cd\u4f5c\uff0c\u4f46\u5b83\u4eec\u4e3a\u65b9\u6cd5\u5e26\u6765\u7684\u8bed\u4e49\u5e76\u4e0d\u5b8c\u5168\u76f8\u540c\u3002\u4e00\u822c\u6765\u8bf4\u5206\u4e3a\u4e24\u79cd\u60c5\u5f62\uff1a<\/p>\n<ul>\n<li>\u57fa\u4e8e\u67d0\u4e2a\u952e\u8fdb\u884c\u64cd\u4f5c\uff0c\u5e76\u5728\u6700\u540e\u8fd4\u56de\u5bf9\u8c61\u672c\u8eab\uff08\u800c\u4e0d\u662f\u8fd9\u4e2a\u952e\uff09\n<ul>\n<li><code>MinBy<\/code>\u3001<code>MaxBy<\/code>\u3001<code>OrderBy<\/code>\u3001<code>DistinctBy<\/code>\u3001<code>IntersectBy<\/code>\u3001<code>ExceptBy<\/code><\/li>\n<\/ul>\n<\/li>\n<li>\u57fa\u4e8e\u67d0\u4e2a\u952e\u8fdb\u884c\u5206\u7ec4\uff08\u518d\u8fdb\u884c\u540e\u7eed\u64cd\u4f5c\uff09\n<ul>\n<li><code>GroupBy<\/code>\u3001<code>CountBy<\/code>\u3001<code>AggregateBy<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u56e0\u4e3a\u4e24\u79cd\u4e0d\u540c\u7684\u8bed\u4e49\uff0c\u67d0\u4e9b\u65b9\u6cd5\u5176\u5b9e\u662f\u6709\u53ef\u80fd\u5f15\u8d77\u8bef\u4f1a\u7684\u3002\u6bd4\u5982 <code>DintinctBy<\/code>\uff0c\u5230\u5e95\u5e94\u8be5\u662f\u4ee5\u67d0\u4e2a\u952e\u6765\u53bb\u91cd\uff0c\u8fd8\u662f\u5e94\u8be5\u4ee5\u67d0\u4e2a\u952e\u5206\u7ec4\u540e\u518d\u5728\u6bcf\u7ec4\u4e2d\u8fdb\u884c\u53bb\u91cd\u5462\uff1f<\/p>\n<p>\u7ec6\u5fc3\u89c2\u5bdf\u4f1a\u53d1\u73b0\uff0cLINQ \u5e76\u6ca1\u6709\u63d0\u4f9b\u8bf8\u5982 <code>SumBy<\/code>\u3001<code>AverageBy<\/code> \u7b49\u65b9\u6cd5\u3002\u56e0\u4e3a\u8fd9\u4e9b\u65b9\u6cd5\u9996\u5148\u6ca1\u6709\u4ec0\u4e48\u5fc5\u8981\uff0c\u5176\u6b21\u4e5f\u4f1a\u5f15\u8d77\u6b67\u4e49\u3002\u6bd4\u5982 <code>SumBy<\/code>\uff0c\u5b83\u662f\u5e94\u8be5\u5148\u5206\u7ec4\u518d\u6c42\u548c\uff0c\u8fd8\u662f\u76f4\u63a5\u5bf9\u67d0\u4e2a\u952e\u6c42\u548c\u5462\uff1f\u5982\u679c\u662f\u524d\u8005\uff0c\u90a3\u5b83\u7684\u8bed\u4e49\u5c31\u548c <code>AggregateBy<\/code> \u5f88\u63a5\u8fd1\u4e86\uff1b\u5982\u679c\u662f\u540e\u8005\uff0c\u90a3\u5b83\u5176\u5b9e\u548c\u4f20\u4e86\u4e00\u4e2a <code>selector<\/code> \u7684 <code>Sum<\/code> \u4e00\u6837\u3002<\/p>\n<p>\u90a3\u4e48 <code>CountBy<\/code> \u53c8\u8be5\u600e\u4e48\u53bb\u7406\u89e3\u5462\uff1f\u5982\u679c\u5c06 <code>Count<\/code> \u7406\u89e3\u4e3a\u4e00\u79cd\u805a\u5408\u64cd\u4f5c\uff0c\u90a3\u4e48\u5b83\u5176\u5b9e\u548c <code>AggregateBy<\/code> \u7684\u8bed\u4e49\u662f\u7c7b\u4f3c\u7684\u3002\u90a3\u4e48\u662f\u4e0d\u662f\u8bf4\uff0c\u5bf9\u4e8e\u4e00\u4e2a\u805a\u5408\u64cd\u4f5c\uff0c\u5b83\u7684 <code>By<\/code> \u610f\u601d\u5c31\u662f\u5206\u7ec4\u4e86\u5462\uff1f\u5176\u5b9e\u4e5f\u672a\u5fc5\uff0c\u56e0\u4e3a <code>Max<\/code> \u540c\u6837\u4e5f\u53ef\u4ee5\u770b\u4f5c\u662f\u4e00\u79cd\u805a\u5408\u64cd\u4f5c\uff0c\u6216\u8005\u6700\u8d77\u7801\u6211\u4eec\u786e\u5b9e\u53ef\u4ee5\u7528\u4e00\u4e2a <code>Aggregate<\/code> \u6765\u5b9e\u73b0\u4e0d\u662f\u5417\uff1f\u6240\u4ee5\u8fd9\u4e9b\u65b9\u6cd5\u7684\u540d\u79f0\u53ef\u80fd\u6709\u70b9\u7ed5\uff0c\u9700\u8981\u5927\u5bb6\u5728\u4f7f\u7528\u65f6\u591a\u52a0\u6ce8\u610f\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u968f\u7740 .NET \u5e73\u53f0\u7684\u4e0d\u65ad\u53d1\u5c55\uff0cLINQ \u4e5f\u5728\u4e0d\u65ad\u5730\u5f15\u5165\u65b0\u7684\u7279\u6027\u548c\u6539\u8fdb\u3002\u8fd9\u4e9b\u65b0\u7279\u6027\u4e0d\u4ec5\u63d0\u5347\u4e86\u5f00\u53d1\u8005\u7684\u751f\u4ea7\u529b\uff0c\u4e5f\u4f7f\u4ee3\u7801\u66f4\u52a0\u7b80\u6d01\u548c\u6613\u8bfb\u3002\u5e0c\u671b\u672c\u6587\u80fd\u5e2e\u52a9\u5927\u5bb6\u66f4\u597d\u5730\u7406\u89e3\u548c\u4f7f\u7528\u8fd9\u4e9b\u65b0\u7279\u6027\uff0c\u63d0\u5347\u5f00\u53d1\u6548\u7387\u3002\u540c\u65f6\u4e5f\u9f13\u52b1\u5927\u5bb6\uff0c\u5728\u6709\u6761\u4ef6\u7684\u60c5\u51b5\u4e0b\uff0c\u5c3d\u91cf\u4f7f\u7528\u6700\u65b0\u7248\u672c\u7684 .NET\uff0c\u4ee5\u4fbf\u4eab\u53d7\u5230\u8fd9\u4e9b\u6539\u8fdb\u548c\u4f18\u5316\u5e26\u6765\u7684\u597d\u5904\u3002<\/p>"},{"title":"C# \u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\u7684\u51e0\u79cd\u65b9\u5f0f\u53ca\u5b83\u4eec\u7684\u6027\u80fd\u6bd4\u8f83","link":"https:\/\/blog.coldwind.top\/posts\/how-to-get-file-size\/","pubDate":"Sat, 06 Sep 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/how-to-get-file-size\/","description":"<img src=\"https:\/\/s2.loli.net\/2025\/09\/06\/WBHdw1K6rio2hxP.jpg\" alt=\"Featured image of post C# \u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\u7684\u51e0\u79cd\u65b9\u5f0f\u53ca\u5b83\u4eec\u7684\u6027\u80fd\u6bd4\u8f83\" \/><p>\u6211\u4eec\u5728\u64cd\u4f5c\u6587\u4ef6\u65f6\uff0c\u7ecf\u5e38\u9700\u8981\u83b7\u53d6\u6587\u4ef6\u7684\u5927\u5c0f\u3002\u76f8\u4fe1\u5927\u5bb6\u90fd\u77e5\u9053 <code>FileInfo<\/code> \u7c7b\u6709\u4e00\u4e2a <code>Length<\/code> \u5c5e\u6027\u53ef\u4ee5\u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\uff0c\u4f46\u5b9e\u9645\u4e0a\u6211\u4eec\u8fd8\u6709\u4e00\u4e9b\u522b\u7684\u65b9\u5f0f\uff0c\u5e76\u4e14\u5176\u4ed6\u65b9\u5f0f\u53ef\u80fd\u6bd4 <code>FileInfo<\/code> \u6709\u66f4\u597d\u7684\u6027\u80fd\u3002\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u5c31\u6765\u76d8\u70b9\u4e00\u4e0b C# \u4e2d\u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\u7684\u51e0\u79cd\u65b9\u5f0f\uff0c\u5e76\u7b80\u5355\u6bd4\u8f83\u4e00\u4e0b\u5b83\u4eec\u7684\u6027\u80fd\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-fileinfolength\">\n\u4f7f\u7528 FileInfo.Length\n<a href=\"#%e4%bd%bf%e7%94%a8-fileinfolength\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u4e2a\u662f\u6700\u5e38\u89c1\u7684\u65b9\u5f0f\uff0c<code>FileInfo<\/code> \u7c7b\u63d0\u4f9b\u4e86\u4e00\u4e2a <code>Length<\/code> \u5c5e\u6027\uff0c\u53ef\u4ee5\u76f4\u63a5\u83b7\u53d6\u6587\u4ef6\u7684\u5927\u5c0f\uff0c\u5355\u4f4d\u662f\u5b57\u8282\uff08bytes\uff09\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.IO<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">FileInfo<\/span> <span class=\"n\">fileInfo<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileInfo<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">long<\/span> <span class=\"n\">fileSize<\/span> <span class=\"p\">=<\/span> <span class=\"n\">fileInfo<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u79cd\u65b9\u5f0f\u7684\u4f18\u70b9\u662f\u4ee3\u7801\u7b80\u6d01\u6613\u61c2\uff0c\u5e76\u4e14\u51e0\u4e4e\u9002\u7528\u4e8e\u6240\u6709\u573a\u666f\uff0c\u5305\u62ec\u8de8\u5e73\u53f0\u5f00\u53d1\u3002\u5b83\u552f\u4e00\u7f8e\u4e2d\u4e0d\u8db3\u7684\u5730\u65b9\u5728\u4e8e\uff0c<code>FileInfo<\/code> \u5728\u4f7f\u7528\u524d\u9700\u8981\u5b9e\u4f8b\u5316\uff0c\u8fd9\u4f1a\u5e26\u6765\u4e00\u70b9 GC \u5f00\u9500\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u5982\u679c\u89c9\u5f97\u8fd4\u56de\u7684 <code>long<\/code> \u7c7b\u578b\u4e0d\u591f\u76f4\u89c2\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5c06\u5176\u8f6c\u6362\u4e3a\u66f4\u5e38\u89c1\u7684\u5355\u4f4d\uff0c\u6bd4\u5982 KB\u3001MB\u3001GB \u7b49\u3002\u5bf9\u4e8e\u8fd9\u4e2a\u9700\u6c42\uff0c\u9664\u4e86\u81ea\u5df1\u5199\u8f6c\u6362\u4ee3\u7801\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528 <a class=\"link\" href=\"https:\/\/github.com\/Humanizr\/Humanizer\" target=\"_blank\" rel=\"noopener\"\n>Humanizer<\/a> \u8fd9\u4e2a\u5e93\uff0c\u5b83\u63d0\u4f9b\u4e86\u975e\u5e38\u65b9\u4fbf\u7684\u6587\u4ef6\u5927\u5c0f\u683c\u5f0f\u5316\u529f\u80fd\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Humanizer<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">FileInfo<\/span> <span class=\"n\">fileInfo<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileInfo<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">humanizedSize<\/span> <span class=\"p\">=<\/span> <span class=\"n\">fileInfo<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">.<\/span><span class=\"n\">Bytes<\/span><span class=\"p\">().<\/span><span class=\"n\">Humanize<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;0.00&#34;<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ e.g. &#34;1.23 MB&#34;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u4f7f\u7528-randomaccess\">\n\u4f7f\u7528 RandomAccess\n<a href=\"#%e4%bd%bf%e7%94%a8-randomaccess\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>RandomAccess<\/code> \u662f\u4e00\u4e2a\u5728\u3002NET 6 \u4e2d\u5f15\u5165\u7684\u9759\u6001\u7c7b\uff0c\u65e8\u5728\u63d0\u4f9b\u9ad8\u6027\u80fd\u3001\u7ebf\u7a0b\u5b89\u5168\u7684\u6587\u4ef6\u968f\u673a\u8bbf\u95ee I\/O \u64cd\u4f5c\u3002\u5b83\u63d0\u4f9b\u7684 <code>GetLength<\/code> \u65b9\u6cd5\u53ef\u4ee5\u76f4\u63a5\u83b7\u53d6\u6587\u4ef6\u7684\u5927\u5c0f\u3002\u4f46\u7a0d\u5fae\u6709\u4e9b\u53ef\u60dc\u7684\u662f\uff0c\u867d\u7136\u5b83\u7684 <code>GetLength<\/code> \u65b9\u6cd5\u662f\u9759\u6001\u4e14\u4e0d\u9700\u8981\u521b\u5efa\u5bf9\u8c61\u7684\uff0c\u4f46\u5b83\u9700\u8981\u4f20\u5165\u4e00\u4e2a\u6587\u4ef6\u53e5\u67c4\uff08file handle\uff09\uff0c\u800c\u540e\u8005\u662f\u4e00\u4e2a <code>SafeFileHandle<\/code> \u5bf9\u8c61\uff0c\u8fd9\u5c31\u4e0d\u53ef\u907f\u514d\u5730\u5f15\u5165\u4e86 <code>FileStream<\/code> \u5bf9\u8c61\u7684\u521b\u5efa\u5f00\u9500\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.IO<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">handle<\/span> <span class=\"p\">=<\/span> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">OpenHandle<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileMode<\/span><span class=\"p\">.<\/span><span class=\"n\">Open<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileAccess<\/span><span class=\"p\">.<\/span><span class=\"n\">Read<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileShare<\/span><span class=\"p\">.<\/span><span class=\"n\">Read<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileOptions<\/span><span class=\"p\">.<\/span><span class=\"n\">RandomAccess<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">long<\/span> <span class=\"n\">fileSize<\/span> <span class=\"p\">=<\/span> <span class=\"n\">RandomAccess<\/span><span class=\"p\">.<\/span><span class=\"n\">GetLength<\/span><span class=\"p\">(<\/span><span class=\"n\">handle<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u90a3\u4e48\u5b9e\u9645\u4e0a\u8fd9\u4e2a\u65b9\u5f0f\u7684\u6548\u679c\u600e\u4e48\u6837\u5462\uff1f\u5728\u540e\u9762\u7684\u8dd1\u5206\u73af\u8282\u4f1a\u63ed\u6653\u7b54\u6848\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-pinvoke-\u8c03\u7528-windows-api\">\n\u4f7f\u7528 P\/Invoke \u8c03\u7528 Windows API\n<a href=\"#%e4%bd%bf%e7%94%a8-pinvoke-%e8%b0%83%e7%94%a8-windows-api\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5f53\u7a0b\u5e8f\u8fd0\u884c\u7684\u5e73\u53f0\u662f Windows \u65f6\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u901a\u8fc7 P\/Invoke \u8c03\u7528 Windows API \u6765\u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\u3002\u8fd9\u4e2a\u65b9\u5f0f\u7684\u597d\u5904\u662f\u5b83\u4e0d\u9700\u8981\u521b\u5efa\u4efb\u4f55\u6258\u7ba1\u5bf9\u8c61\uff0c\u56e0\u6b64\u7406\u8bba\u4e0a\u5b83\u7684\u6027\u80fd\u5e94\u8be5\u662f\u6700\u597d\u7684\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.IO<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Runtime.InteropServices<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Runtime.InteropServices.ComTypes<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[DllImport(&#34;kernel32.dll&#34;, CharSet = CharSet.Auto, SetLastError = true)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"kd\">extern<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">GetFileAttributesEx<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">lpFileName<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">fInfoLevelId<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">out<\/span> <span class=\"n\">WIN32_FILE_ATTRIBUTE_DATA<\/span> <span class=\"n\">lpFileInformation<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">long<\/span> <span class=\"n\">GetFileSizeWin32<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">path<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"n\">GetFileAttributesEx<\/span><span class=\"p\">(<\/span><span class=\"n\">path<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"k\">out<\/span> <span class=\"kt\">var<\/span> <span class=\"n\">data<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"n\">ComponentModel<\/span><span class=\"p\">.<\/span><span class=\"n\">Win32Exception<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"p\">((<\/span><span class=\"kt\">long<\/span><span class=\"p\">)<\/span><span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">nFileSizeHigh<\/span> <span class=\"p\">&lt;&lt;<\/span> <span class=\"m\">32<\/span><span class=\"p\">)<\/span> <span class=\"p\">+<\/span> <span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">nFileSizeLow<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[StructLayout(LayoutKind.Sequential)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">struct<\/span> <span class=\"nc\">WIN32_FILE_ATTRIBUTE_DATA<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">uint<\/span> <span class=\"n\">dwFileAttributes<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">FILETIME<\/span> <span class=\"n\">ftCreationTime<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ftLastAccessTime<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ftLastWriteTime<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">uint<\/span> <span class=\"n\">nFileSizeHigh<\/span><span class=\"p\">,<\/span> <span class=\"n\">nFileSizeLow<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528\u4e0a\u9762\u7684 <code>GetFileSizeWin32<\/code> \u65b9\u6cd5\u6765\u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\u4e86\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5982\u679c\u662f\u5728 Linux \u6216 macOS \u4e0a\u8fd0\u884c\u7684\u7a0b\u5e8f\uff0c\u90a3\u4e48\u867d\u7136\u53ef\u4ee5\u91c7\u7528\u8bf8\u5982\u5f15\u5165 <code>Mono.Posix<\/code> \u4e4b\u7c7b\u7684\u5e93\u6765\u8c03\u7528\u7cfb\u7edf API\uff0c\u4f46\u8fd9\u6837\u505a\u7684\u590d\u6742\u5ea6\u548c\u7ef4\u62a4\u6210\u672c\u4f1a\u6bd4\u8f83\u9ad8\uff0c\u6240\u4ee5\u63a8\u8350\u76f4\u63a5\u4f7f\u7528 <code>FileInfo<\/code>\u3002<\/div>\n<\/div>\n<h2 id=\"\u4f7f\u7528-visualbasicfileio\">\n\u4f7f\u7528 VisualBasic.FileIO\n<a href=\"#%e4%bd%bf%e7%94%a8-visualbasicfileio\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\u8fd9\u79cd\u65b9\u5f0f\u53ef\u80fd\u6709\u51d1\u6570\u7684\u5acc\u7591\uff0c\u4f46\u662f\u6211\u4eec\u786e\u5b9e\u53ef\u4ee5\u501f\u52a9 <code>Microsoft.VisualBasic<\/code> \u547d\u540d\u7a7a\u95f4\u4e0b\u7684 <code>FileSystem<\/code> \u7c7b\u6765\u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Microsoft.VisualBasic.FileIO<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">long<\/span> <span class=\"n\">fileSize<\/span> <span class=\"p\">=<\/span> <span class=\"n\">FileSystem<\/span><span class=\"p\">.<\/span><span class=\"n\">FileLen<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">).<\/span><span class=\"n\">Length<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u6027\u80fd\u6bd4\u8f83\">\n\u6027\u80fd\u6bd4\u8f83\n<a href=\"#%e6%80%a7%e8%83%bd%e6%af%94%e8%be%83\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4ee5\u4e0a\u5c31\u662f\u56db\u79cd\u53ef\u884c\u7684\u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\u7684\u65b9\u5f0f\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u6bd4\u8f83\u4e00\u4e0b\u5b83\u4eec\u7684\u6027\u80fd\u3002\u7ed3\u679c\u5982\u4e0b\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>Method<\/th>\n<th style=\"text-align: right\">Mean<\/th>\n<th style=\"text-align: right\">Error<\/th>\n<th style=\"text-align: right\">StdDev<\/th>\n<th style=\"text-align: right\">Allocated<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>UseFileInfo<\/td>\n<td style=\"text-align: right\">7.888 \u03bcs<\/td>\n<td style=\"text-align: right\">0.0522 \u03bcs<\/td>\n<td style=\"text-align: right\">0.0462 \u03bcs<\/td>\n<td style=\"text-align: right\">96 B<\/td>\n<\/tr>\n<tr>\n<td>UseWin32Api<\/td>\n<td style=\"text-align: right\">7.732 \u03bcs<\/td>\n<td style=\"text-align: right\">0.0740 \u03bcs<\/td>\n<td style=\"text-align: right\">0.0692 \u03bcs<\/td>\n<td style=\"text-align: right\">-<\/td>\n<\/tr>\n<tr>\n<td>UseFileSystem<\/td>\n<td style=\"text-align: right\">15.779 \u03bcs<\/td>\n<td style=\"text-align: right\">0.2104 \u03bcs<\/td>\n<td style=\"text-align: right\">0.1968 \u03bcs<\/td>\n<td style=\"text-align: right\">96 B<\/td>\n<\/tr>\n<tr>\n<td>UseRandomAccess<\/td>\n<td style=\"text-align: right\">10.627 \u03bcs<\/td>\n<td style=\"text-align: right\">0.1137 \u03bcs<\/td>\n<td style=\"text-align: right\">0.1063 \u03bcs<\/td>\n<td style=\"text-align: right\">72 B<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ece\u7ed3\u679c\u4e2d\u6211\u4eec\u4e0d\u96be\u5f97\u51fa\u4ee5\u4e0b\u51e0\u4e2a\u7ed3\u8bba\uff1a<\/p>\n<ol>\n<li>\u4f7f\u7528 Windows API \u7684\u65b9\u5f0f\u6027\u80fd\u6700\u597d\uff0c\u5e76\u4e14\u6ca1\u6709\u4efb\u4f55\u6258\u7ba1\u5185\u5b58\u5206\u914d\u3002\u4f46\u5b83\u53ea\u80fd\u5728 Windows \u5e73\u53f0\u4f7f\u7528\u3002<\/li>\n<li>\u4f7f\u7528 <code>FileInfo<\/code> \u7684\u65b9\u5f0f\u6027\u80fd\u4e5f\u4e0d\u9519\uff0c\u9002\u7528\u4e8e\u7edd\u5927\u591a\u6570\u573a\u666f\u3002<\/li>\n<li>\u4f7f\u7528 <code>RandomAccess<\/code> \u7684\u65b9\u5f0f\u6027\u80fd\u4e00\u822c\uff0c\u867d\u7136\u5b83\u4e0d\u9700\u8981\u521b\u5efa <code>FileInfo<\/code> \u5bf9\u8c61\uff0c\u4f46\u5b83\u9700\u8981\u521b\u5efa <code>FileStream<\/code> \u5bf9\u8c61\u6765\u83b7\u53d6\u6587\u4ef6\u53e5\u67c4\uff0c\u8fd9\u5e26\u6765\u4e86\u65e0\u6cd5\u907f\u514d\u7684\u5f00\u9500\uff08\u867d\u7136\u6bd4 <code>FileInfo<\/code> \u5c11\u4e86\u4e00\u70b9\uff09\u3002<\/li>\n<li>\u4f7f\u7528 <code>VisualBasic.FileIO<\/code> \u7684\u65b9\u5f0f\u6027\u80fd\u6700\u5dee\uff0c\u5e76\u4e14\u8fd8\u4f1a\u6709\u5185\u5b58\u5206\u914d\uff0c\u57fa\u672c\u4e0a\u6ca1\u6709\u4efb\u4f55\u4f18\u52bf\u3002<\/li>\n<\/ol>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u7efc\u4e0a\u6240\u8ff0\uff0c\u51e0\u4e4e\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u4f18\u5148\u8003\u8651\u4f7f\u7528 <code>FileInfo.Length<\/code> \u6765\u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\u3002\u53ea\u6709\u5728\u5bf9\u4e8e\u6027\u80fd\u6709\u6781\u81f4\u8981\u6c42\uff0c\u5e76\u4e14\u7a0b\u5e8f\u8fd0\u884c\u7684\u5e73\u53f0\u786e\u5b9a\u662f Windows \u7684\u60c5\u51b5\u4e0b\uff0c\u624d\u8003\u8651\u4f7f\u7528 P\/Invoke \u8c03\u7528 Windows API \u7684\u65b9\u5f0f\u3002<\/p>"},{"title":"\u539f\u751f WPF \u6846\u67b6\u4e2d\u4f53\u73b0\u51fa\u7684\u8bbe\u8ba1\u6a21\u5f0f","link":"https:\/\/blog.coldwind.top\/posts\/built-in-design-patterns-in-wpf\/","pubDate":"Mon, 11 Aug 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/built-in-design-patterns-in-wpf\/","description":"<p>\u6211\u4eec\u5728\u505a\u8f6f\u4ef6\u5f00\u53d1\u65f6\uff0c\u7ecf\u5e38\u4f1a\u4f7f\u7528\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u6bd4\u5982\u5355\u4f8b\u6a21\u5f0f\u3001\u5de5\u5382\u6a21\u5f0f\u3001\u89c2\u5bdf\u8005\u6a21\u5f0f\u7b49\u3002\u8fd9\u4e9b\u8bbe\u8ba1\u6a21\u5f0f\u5e2e\u52a9\u6211\u4eec\u66f4\u597d\u5730\u7ec4\u7ec7\u4ee3\u7801\uff0c\u63d0\u9ad8\u4ee3\u7801\u7684\u53ef\u7ef4\u62a4\u6027\u548c\u53ef\u6269\u5c55\u6027\u3002<\/p>\n<p>\u4f46\u662f\u8fd9\u6b21\u6211\u4eec\u6362\u4e00\u4e2a\u89d2\u5ea6\uff0c\u6765\u770b\u4e00\u770b\u6846\u67b6\u672c\u8eab\u6709\u6ca1\u6709\u4f53\u73b0\u51fa\u8fd9\u4e9b\u8bbe\u8ba1\u6a21\u5f0f\u3002\u5e0c\u671b\u8fd9\u7bc7\u6587\u7ae0\u53ef\u4ee5\u7ed9\u5927\u5bb6\u4e00\u4e2a\u4e0d\u4e00\u6837\u7684\u89c6\u89d2\u3002<\/p>\n<h2 id=\"\u89c2\u5bdf\u8005\u6a21\u5f0f\">\n\u89c2\u5bdf\u8005\u6a21\u5f0f\n<a href=\"#%e8%a7%82%e5%af%9f%e8%80%85%e6%a8%a1%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5bf9\u4e8e\u89c2\u5bdf\u8005\u6a21\u5f0f\uff0c\u76f8\u4fe1\u5927\u591a\u6570\u4eba\u53ef\u80fd\u9996\u5148\u4f1a\u60f3\u5230\u7684\u662f\u5728 MVVM \u6a21\u5f0f\u4e0b\uff0cViewModel \u4f5c\u4e3a\u6570\u636e\u7684\u63d0\u4f9b\u8005\uff0c\u800c View \u4f5c\u4e3a\u6570\u636e\u7684\u6d88\u8d39\u8005\u3002\u5f53 ViewModel \u4e2d\u7684\u6570\u636e\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u5b83\u4f1a\u901a\u77e5\u6240\u6709\u7ed1\u5b9a\u7684 View \u8fdb\u884c\u66f4\u65b0\uff08\u5177\u4f53\u505a\u6cd5\u4e3a\u5b9e\u73b0 <code>INotifyPropertyChanged<\/code> \u63a5\u53e3\uff0c\u5e76\u89e6\u53d1\u76f8\u5e94\u7684\u4e8b\u4ef6\uff09\u3002\u8fd9\u79cd\u6a21\u5f0f\u4f7f\u5f97 View \u548c ViewModel \u4e4b\u95f4\u7684\u4ea4\u4e92\u53d8\u5f97\u7b80\u5355\u800c\u9ad8\u6548\u3002<\/p>\n<p>\u4f46\u5b9e\u9645\u4e0a\uff0c\u539f\u751f WPF \u5c31\u5df2\u7ecf\u5145\u5206\u4f53\u73b0\u51fa\u4e86\u89c2\u5bdf\u8005\u6a21\u5f0f\u3002\u5bf9\u4e8e\u5927\u591a\u6570\u63a7\u4ef6\uff0c\u672c\u8eab\u5b83\u5c31\u63d0\u4f9b\u4e86\u4e24\u79cd\u5b9e\u73b0\u4e86\u89c2\u5bdf\u8005\u6a21\u5f0f\uff0c\u6216\u8005\u8bf4\u53ef\u4ee5\u88ab\u89c2\u5bdf\u7684\u7279\u6027\uff1a<\/p>\n<ol>\n<li>\u4e8b\u4ef6\uff1a\u63a7\u4ef6\u7684\u4e8b\u4ef6\u673a\u5236\u5141\u8bb8\u5f00\u53d1\u8005\u6ce8\u518c\u4e8b\u4ef6\u5904\u7406\u7a0b\u5e8f\uff0c\u4ece\u800c\u5728\u7279\u5b9a\u4e8b\u4ef6\u53d1\u751f\u65f6\u63a5\u6536\u901a\u77e5\u3002\u4f8b\u5982\uff0c\u5f53\u7528\u6237\u70b9\u51fb\u6309\u94ae\u65f6\uff0c\u6309\u94ae\u4f1a\u89e6\u53d1 Click \u4e8b\u4ef6\uff1b\u5f53\u7528\u6237\u4fee\u6539\u6587\u672c\u6846\u7684\u5185\u5bb9\u65f6\uff0c\u6587\u672c\u6846\u4f1a\u89e6\u53d1 TextChanged \u4e8b\u4ef6\u3002<\/li>\n<li>\u4f9d\u8d56\u5c5e\u6027\uff1a\u63a7\u4ef6\u7684\u4f9d\u8d56\u5c5e\u6027\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u5982\u679c\u6709\u7ed1\u5b9a\u7684\u76ee\u6807\uff0c\u5b83\u4f1a\u81ea\u52a8\u901a\u77e5\u8fd9\u4e9b\u76ee\u6807\u8fdb\u884c\u66f4\u65b0\u3002\u8fd9\u79cd\u673a\u5236\u4f7f\u5f97\u63a7\u4ef6\u7684\u72b6\u6001\u53d8\u5316\u80fd\u591f\u88ab\u53ca\u65f6\u201c\u89c2\u5bdf\u201d\u5230\uff0c\u4ece\u800c\u5b9e\u73b0\u4e86\u89c2\u5bdf\u8005\u6a21\u5f0f\u7684\u6548\u679c\u3002<\/li>\n<\/ol>\n<p>\u6240\u4ee5\uff0c\u5728 WPF \u5f00\u53d1\u4e2d\uff0c\u89c2\u5bdf\u8005\u6a21\u5f0f\u5e76\u4e0d\u4ec5\u4ec5\u4f53\u73b0\u5728 MVVM \u6a21\u5f0f\u4e0a\uff0c\u5b83\u5728\u63a7\u4ef6\u7684\u4e8b\u4ef6\u548c\u4f9d\u8d56\u5c5e\u6027\u4e2d\u4e5f\u5f97\u5230\u4e86\u5145\u5206\u7684\u4f53\u73b0\u3002<\/p>\n<h2 id=\"\u6865\u63a5\u6a21\u5f0f\">\n\u6865\u63a5\u6a21\u5f0f\n<a href=\"#%e6%a1%a5%e6%8e%a5%e6%a8%a1%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6211\u4eec\u7b80\u5355\u56de\u987e\u4e00\u4e0b\u6865\u63a5\u6a21\u5f0f\u5927\u6982\u662f\u600e\u4e48\u4e00\u56de\u4e8b\uff1a<\/p>\n<p>\u5982\u679c\u6211\u4eec\u7684\u67d0\u4e00\u4e2a\u7c7b\u5b58\u5728\u591a\u4e2a\u7ef4\u5ea6\u7684\u53d8\u5316\uff08\u6bd4\u5982\u4e0d\u540c\u7684\u5916\u89c2\u548c\u4e0d\u540c\u7684\u884c\u4e3a\uff09\uff0c\u6bd4\u5982\u56fe\u5f62\u7c7b\u53ef\u80fd\u6709\u4e0d\u540c\u7684\u5f62\u72b6\uff08Shape\uff09\u4ee5\u53ca\u989c\u8272\uff08Color\uff09\uff0c\u90a3\u4e48\u5047\u5982\u6211\u4eec\u91c7\u7528\u4f20\u7edf\u7684 OOP \u7684\u601d\u60f3\uff0c\u5c31\u4e0d\u53ef\u907f\u514d\u5730\u4f1a\u5f15\u5165\u5927\u91cf\u7684\u5b50\u7c7b\uff0c\u6bd4\u5982 <code>RedRectangle<\/code>\u3001<code>BlueCircle<\/code> \u7b49\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u7406\u60f3\u7684\u3002<\/p>\n<p>\u6b64\u65f6\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528\u6865\u63a5\u6a21\u5f0f\u5c06\u8fd9\u4e24\u4e2a\u7ef4\u5ea6\u5206\u79bb\u5f00\u6765\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u72ec\u7acb\u5730\u5bf9\u8fd9\u4e24\u4e2a\u7ef4\u5ea6\u8fdb\u884c\u6269\u5c55\uff0c\u800c\u4e0d\u5fc5\u76f8\u4e92\u5f71\u54cd\u3002<\/p>\n<p>\u8fd9\u65f6\u5019\u6211\u4eec\u56de\u6765\u770b WPF\uff0c\u6bd4\u5982 <code>Control<\/code> \u7c7b\u5c31\u5305\u542b\u4e86\u591a\u79cd\u4e0d\u540c\u7684\u5b9e\u73b0\uff0c\u5305\u62ec <code>Button<\/code>\u3001<code>Label<\/code>\u3001<code>TextBox<\/code> \u7b49\uff1b\u540c\u65f6\uff0c\u5b83\u4eec\u53c8\u90fd\u5305\u542b <code>Background<\/code>\u3001<code>Foreground<\/code> \u7b49\u5c5e\u6027\uff0c\u7528\u4e8e\u63a7\u5236\u5b83\u4eec\u5b9e\u9645\u7684\u5916\u89c2\u3002\u8fd9\u662f\u5426\u5c31\u548c\u6211\u4eec\u4e0a\u9762\u7684\u4f8b\u5b50\u4e0d\u8c0b\u800c\u5408\u4e86\uff1f<\/p>\n<p>\u6240\u4ee5\uff0cWPF \u7684 <code>Control<\/code> \u7c7b\u5c31\u662f\u4e00\u4e2a\u5178\u578b\u7684\u6865\u63a5\u6a21\u5f0f\u7684\u5b9e\u73b0\u3002\u5b83\u5c06\u63a7\u4ef6\u7684\u5916\u89c2\uff08\u5982\u6837\u5f0f\u3001\u6a21\u677f\uff09\u548c\u884c\u4e3a\uff08\u5982\u4e8b\u4ef6\u3001\u547d\u4ee4\uff09\u5206\u79bb\u5f00\u6765\uff0c\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u72ec\u7acb\u5730\u5bf9\u8fd9\u4e24\u4e2a\u7ef4\u5ea6\u8fdb\u884c\u6269\u5c55\u3002\u5f53\u7136\uff0c\u4f53\u73b0\u6865\u63a5\u6a21\u5f0f\u7684\u4e0d\u4ec5\u4ec5\u662f <code>Control<\/code> \u7c7b\uff0c\u5176\u4ed6\u5f88\u591a\u63a7\u4ef6\u4e5f\u90fd\u9075\u5faa\u4e86\u8fd9\u4e00\u6a21\u5f0f\u3002<\/p>\n<h2 id=\"\u88c5\u9970\u5668\u6a21\u5f0f\">\n\u88c5\u9970\u5668\u6a21\u5f0f\n<a href=\"#%e8%a3%85%e9%a5%b0%e5%99%a8%e6%a8%a1%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u88c5\u9970\u5668\u6a21\u5f0f\uff08Decorator Pattern\uff09\u662f\u4e00\u79cd\u7ed3\u6784\u6027\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u5b83\u5141\u8bb8\u5728\u4e0d\u6539\u53d8\u5bf9\u8c61\u81ea\u8eab\u7684\u60c5\u51b5\u4e0b\uff0c\u52a8\u6001\u5730\u7ed9\u5bf9\u8c61\u6dfb\u52a0\u4e00\u4e9b\u989d\u5916\u7684\u804c\u8d23\u3002\u88c5\u9970\u5668\u6a21\u5f0f\u901a\u5e38\u7528\u4e8e\u9075\u5faa\u5f00\u95ed\u539f\u5219\uff08\u5bf9\u6269\u5c55\u5f00\u653e\uff0c\u5bf9\u4fee\u6539\u5173\u95ed\uff09\u3002<\/p>\n<p>\u5728 WPF \u4e2d\uff0c\u88c5\u9970\u5668\u6a21\u5f0f\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u5c31\u662f\u9644\u52a0\u5c5e\u6027\u548c\u884c\u4e3a\u4e86\u3002\u901a\u8fc7\u9644\u52a0\u5c5e\u6027\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4e0d\u4fee\u6539\u539f\u6709\u63a7\u4ef6\u7684\u60c5\u51b5\u4e0b\uff0c\u4e3a\u5176\u6dfb\u52a0\u65b0\u7684\u529f\u80fd\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u4e3a\u4e00\u4e2a <code>TextBox<\/code> \u63a7\u4ef6\u6dfb\u52a0\u4e00\u4e2a\u9644\u52a0\u5c5e\u6027\uff0c\u7528\u4e8e\u63a7\u5236\u5176\u662f\u5426\u663e\u793a\u5360\u4f4d\u7b26\u6587\u672c\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBox<\/span> <span class=\"na\">local:TextBoxHelper.Placeholder=<\/span><span class=\"s\">&#34;\u8bf7\u8f93\u5165\u5185\u5bb9&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c<code>TextBoxHelper<\/code> \u5c31\u662f\u4e00\u4e2a\u63d0\u4f9b\u4e86\u9644\u52a0\u5c5e\u6027\u7684\u7c7b\uff0c\u5b83\u53ef\u4ee5\u4e3a\u4efb\u610f <code>TextBox<\/code> \u63a7\u4ef6\u6dfb\u52a0\u5360\u4f4d\u7b26\u6587\u672c\uff08<code>Placeholder<\/code>\uff09\u5c5e\u6027\u3002\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 <code>TextBox<\/code> \u7684 <code>Style<\/code> \u6216 <code>Template<\/code> \u4e2d\u54cd\u5e94\u8fd9\u4e2a\u9644\u52a0\u5c5e\u6027\uff0c\u4ece\u800c\u771f\u7684\u4e3a\u6587\u672c\u6846\u6dfb\u52a0\u5360\u4f4d\u7b26\u3002<\/p>\n<p>\u884c\u4e3a\u4e5f\u7c7b\u4f3c\uff0c\u800c\u4e14\u884c\u4e3a\u672c\u8d28\u4e0a\u4e5f\u662f\u9644\u52a0\u5c5e\u6027\uff0c\u6216\u8005\u8bf4\u5c31\u662f\u4f9d\u9760\u9644\u52a0\u5c5e\u6027\u6765\u5b9e\u73b0\u7684\u3002\u6240\u4ee5\u8fd9\u91cc\u4e0d\u518d\u8d58\u8ff0\u3002<\/p>\n<p>\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u8bf4\uff0c\u9644\u52a0\u5c5e\u6027\u5229\u7528\u4e86\u88c5\u9970\u5668\u6a21\u5f0f\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c\u5176\u5b9e\u5b83\u8fd8\u4f53\u73b0\u51fa\u4e86\u5176\u4ed6\u4e00\u4e9b\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u6bd4\u5982\u6211\u4eec\u5f00\u5934\u63d0\u5230\u7684\u89c2\u5bdf\u8005\u6a21\u5f0f\uff0c\u6b64\u5916\u8fd8\u6709\u4eab\u5143\u6a21\u5f0f\uff08\u9644\u52a0\u5c5e\u6027\u4e0e\u4f9d\u8d56\u5c5e\u6027\u4e3a\u540c\u4e00\u7c7b\u578b\u7684\u63a7\u4ef6\u63d0\u4f9b\u4e86\u76f8\u540c\u7684\u5c5e\u6027\u5143\u6570\u636e\uff09\u3001\u4e2d\u4ecb\u8005\u6a21\u5f0f\uff08\u6bd4\u5982\u4e00\u4e9b\u4e0e\u5e03\u5c40\u76f8\u5173\u7684\u9644\u52a0\u5c5e\u6027\uff0c\u5982 <code>DockPanel.Dock<\/code>\u3001<code>Grid.Row<\/code> \u7b49\uff09\u7b49\u7b49\u3002<\/p>\n<h2 id=\"\u9002\u914d\u5668\u6a21\u5f0f\">\n\u9002\u914d\u5668\u6a21\u5f0f\n<a href=\"#%e9%80%82%e9%85%8d%e5%99%a8%e6%a8%a1%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 WPF \u7684\u7ed1\u5b9a\u4e2d\uff0c\u6211\u4eec\u5e38\u5e38\u4f1a\u5229\u7528\u5230\u503c\u8f6c\u6362\u5668\uff08<code>ValueConverter<\/code>\uff09\uff0c\u5b83\u5c31\u662f\u9002\u914d\u5668\u6a21\u5f0f\u7684\u5178\u578b\u4f53\u73b0\u3002<\/p>\n<p>\u8fd9\u91cc\u6211\u4eec\u770b\u4e00\u4e2a\u6700\u5178\u578b\u7684\u4f8b\u5b50\uff1a\u6211\u4eec\u8981\u5c06\u4e00\u4e2a\u5e03\u5c14\u5c5e\u6027\u7ed1\u5b9a\u5230\u63a7\u4ef6\u7684 <code>Visibility<\/code> \u5c5e\u6027\u4e0a\u3002\u4e3a\u4e86\u80fd\u591f\u5b9e\u73b0\u6e90\u7c7b\u578b\uff08<code>bool<\/code>\uff09\u5230\u76ee\u6807\u7c7b\u578b\uff08<code>Visibility<\/code>\uff09\u7684\u8f6c\u6362\uff0c\u6700\u5e38\u89c1\u7684\u65b9\u5f0f\u5c31\u662f\u501f\u52a9 <code>BooleanToVisibilityConverter<\/code> \u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;BooleanToVisibilityConverter<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;BooleanToVisibilityConverter&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span> <span class=\"na\">Visibility=<\/span><span class=\"s\">&#34;{Binding IsTextVisible, Converter={StaticResource BooleanToVisibilityConverter}}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53e6\u5916\uff0c\u503c\u8f6c\u6362\u5668\u4e0d\u4ec5\u4f53\u73b0\u51fa\u4e86\u9002\u914d\u5668\u6a21\u5f0f\uff0c\u8fd8\u4f53\u73b0\u51fa\u4e86\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7b56\u7565\u6a21\u5f0f\u3002\u5b83\u4eec\u628a\u201c\u5982\u4f55\u5c06\u4e00\u4e2a\u503c\u8f6c\u6362\u6210\u53e6\u4e00\u4e2a\u503c\u201d\u7684\u7b97\u6cd5\u62bd\u8c61\u6210\u4e00\u4e2a\u63a5\u53e3\uff08<code>IValueConverter<\/code>\uff09\uff0c\u5e76\u901a\u8fc7\u4e0d\u540c\u7684\u5b9e\u73b0\u7c7b\u6765\u63d0\u4f9b\u5177\u4f53\u7684\u8f6c\u6362\u903b\u8f91\uff0c\u8fd9\u6b63\u662f\u7b56\u7565\u6a21\u5f0f\u7684\u6838\u5fc3\u601d\u60f3\u2014\u2014\u628a\u4e00\u7cfb\u5217\u53ef\u4e92\u6362\u7684\u7b97\u6cd5\u5c01\u88c5\u4e3a\u72ec\u7acb\u7684\u7b56\u7565\u5bf9\u8c61\uff0c\u5e76\u5728\u8fd0\u884c\u65f6\u6839\u636e\u9700\u8981\u9009\u62e9\u4f7f\u7528\u54ea\u4e00\u4e2a\u7b56\u7565\u3002<\/p>\n<h2 id=\"\u8d23\u4efb\u94fe\u6a21\u5f0f\">\n\u8d23\u4efb\u94fe\u6a21\u5f0f\n<a href=\"#%e8%b4%a3%e4%bb%bb%e9%93%be%e6%a8%a1%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u524d\u9762\u6211\u4eec\u63d0\u5230\uff0c\u63a7\u4ef6\u7684\u4e8b\u4ef6\u4f53\u73b0\u51fa\u4e86\u89c2\u5bdf\u8005\u6a21\u5f0f\u3002\u5176\u5b9e\u4e0d\u4ec5\u5982\u6b64\uff0cWPF \u5728\u4f20\u7edf C# \u4e8b\u4ef6\u7684\u57fa\u7840\u4e0a\uff0c\u8fd8\u5f15\u5165\u4e86\u8def\u7531\u4e8b\u4ef6\uff08<code>RoutedEvent<\/code>\uff09\u8fd9\u4e00\u6982\u5ff5\u3002<\/p>\n<p>\u8def\u7531\u4e8b\u4ef6\u5141\u8bb8\u4e8b\u4ef6\u5728\u63a7\u4ef6\u7684\u89c6\u89c9\u6811\u4e2d\u6cbf\u7740\u7279\u5b9a\u7684\u8def\u5f84\u8fdb\u884c\u4f20\u64ad\uff0c\u8fd9\u79cd\u4f20\u64ad\u673a\u5236\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u5728\u7236\u7ea7\u63a7\u4ef6\u4e2d\u5904\u7406\u5b50\u7ea7\u63a7\u4ef6\u7684\u4e8b\u4ef6\uff0c\u6216\u8005\u53cd\u8fc7\u6765\u3002\u5177\u4f53\u8981\u770b\u8def\u7531\u7684\u65b9\u5f0f\u662f\u5192\u6ce1\uff08Bubble\uff09\u8fd8\u662f\u96a7\u9053\uff08Tunnel\uff09\u3002<\/p>\n<p>\u4f46\u4e0d\u7ba1\u54ea\u4e00\u79cd\u65b9\u5f0f\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u5728\u4e8b\u4ef6\u7684\u5904\u7406\u8fc7\u7a0b\u4e2d\u5f62\u6210\u4e00\u4e2a\u8d23\u4efb\u94fe\u3002\u5bf9\u4e8e\u8fd9\u4e00\u70b9\uff0c\u6700\u660e\u663e\u7684\u4f53\u73b0\u65b9\u5f0f\u5c31\u662f\u5bf9\u4e8e <code>e.Handled<\/code> \u7684\u4f7f\u7528\u3002\u6bd4\u5982\u6211\u4eec\u89e6\u53d1\u4e86\u4e00\u4e2a\u9f20\u6807\u4e8b\u4ef6\uff0c\u5e76\u4e14\u5e0c\u671b\u5728\u67d0\u4e2a\u7236\u7ea7\u63a7\u4ef6\u4e2d\u5904\u7406\u8fd9\u4e2a\u4e8b\u4ef6\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u5728\u5230\u8fbe\u8be5\u63a7\u4ef6\u65f6\u5c06 <code>e.Handled<\/code> \u8bbe\u7f6e\u4e3a <code>true<\/code>\uff0c\u4ece\u800c\u963b\u6b62\u4e8b\u4ef6\u7ee7\u7eed\u5411\u4e0a\u4f20\u64ad\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">OnMouseDown<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">MouseButtonEventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">sender<\/span> <span class=\"k\">is<\/span> <span class=\"n\">Border<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5904\u7406\u8fb9\u6846\u7684\u9f20\u6807\u6309\u4e0b\u4e8b\u4ef6<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Handled<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u963b\u6b62\u4e8b\u4ef6\u7ee7\u7eed\u5411\u4e0a\u4f20\u64ad<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e00\u64cd\u4f5c\u5c31\u548c\u8d23\u4efb\u94fe\u6a21\u5f0f\u4e0d\u8c0b\u800c\u5408\uff1a\u6211\u4eec\u53ef\u4ee5\u5c06\u4e8b\u4ef6\u7684\u5904\u7406\u8fc7\u7a0b\u770b\u4f5c\u662f\u4e00\u4e2a\u94fe\u6761\uff0c\u6bcf\u4e2a\u5904\u7406\u8282\u70b9\u90fd\u53ef\u4ee5\u9009\u62e9\u662f\u5426\u5c06\u4e8b\u4ef6\u7ee7\u7eed\u4f20\u9012\u4e0b\u53bb\uff0c\u4ece\u800c\u5f62\u6210\u4e00\u4e2a\u7075\u6d3b\u7684\u4e8b\u4ef6\u5904\u7406\u673a\u5236\u3002<\/p>\n<h2 id=\"\u5176\u4ed6\u8bbe\u8ba1\u6a21\u5f0f\">\n\u5176\u4ed6\u8bbe\u8ba1\u6a21\u5f0f\n<a href=\"#%e5%85%b6%e4%bb%96%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9664\u4e86\u4e0a\u9762\u8fd9\u4e9b\u5178\u578b\u7684\u4f8b\u5b50\u5916\uff0cWPF \u8fd8\u4f53\u73b0\u51fa\u4e86\u5f88\u591a\u5176\u4ed6\u7684\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li><strong>\u72b6\u6001\u6a21\u5f0f<\/strong>\uff1a\u63a7\u4ef6\u7684\u89c6\u89c9\u72b6\u6001\uff08\u5982\u9f20\u6807\u60ac\u505c\u3001\u6309\u4e0b\u7b49\uff09\u53ef\u4ee5\u901a\u8fc7 VisualStateManager \u8fdb\u884c\u7ba1\u7406\uff0c\u8fd9\u5b9e\u9645\u4e0a\u5c31\u662f\u4e00\u79cd\u72b6\u6001\u6a21\u5f0f\u7684\u5e94\u7528\u3002<\/li>\n<li><strong>\u7ec4\u5408\u6a21\u5f0f<\/strong>\uff1aWPF \u7684\u63a7\u4ef6\u6811\u7ed3\u6784\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u5c06\u591a\u4e2a\u63a7\u4ef6\u7ec4\u5408\u6210\u4e00\u4e2a\u590d\u5408\u63a7\u4ef6\uff0c\u8fd9\u6b63\u662f\u7ec4\u5408\u6a21\u5f0f\u7684\u4f53\u73b0\u3002<\/li>\n<li><strong>\u5355\u4f8b\u6a21\u5f0f<\/strong>\uff1a<code>Application.Current<\/code> \u5c31\u662f\u4e00\u4e2a\u5355\u4f8b\u6a21\u5f0f\u7684\u5b9e\u73b0\u3002<\/li>\n<li><strong>\u539f\u578b\u6a21\u5f0f<\/strong>\uff1aWPF \u4e2d\u8d44\u6e90\u7684 <code>Freezable<\/code> \u4ee5\u53ca <code>Style<\/code> \u88ab\u591a\u4e2a\u63a7\u4ef6\u4f7f\u7528\uff0c\u90fd\u4f53\u73b0\u51fa\u4e86\u5bf9\u4e8e\u539f\u578b\u5b9e\u4f8b\u7684\u201c\u514b\u9686\u201d\u3002<\/li>\n<\/ul>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u8f6f\u4ef6\u5f00\u53d1\u4e2d\uff0c\u8bbe\u8ba1\u6a21\u5f0f\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u9ad8\u6548\u3001\u7075\u6d3b\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u5e2e\u52a9\u63d0\u5347\u4ee3\u7801\u7684\u53ef\u7ef4\u62a4\u6027\u548c\u53ef\u6269\u5c55\u6027\u3002\u672c\u6587\u901a\u8fc7\u5206\u6790 WPF \u4e2d\u7684\u51e0\u4e2a\u7ecf\u5178\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u5982\u89c2\u5bdf\u8005\u6a21\u5f0f\u3001\u6865\u63a5\u6a21\u5f0f\u3001\u88c5\u9970\u5668\u6a21\u5f0f\u3001\u9002\u914d\u5668\u6a21\u5f0f\u548c\u8d23\u4efb\u94fe\u6a21\u5f0f\uff0c\u5c55\u793a\u4e86\u8fd9\u4e9b\u6a21\u5f0f\u5982\u4f55\u5728 WPF \u6846\u67b6\u4e2d\u5f97\u4ee5\u4f53\u73b0\u3002<\/p>\n<p>\u901a\u8fc7\u63a7\u4ef6\u7684\u4e8b\u4ef6\u673a\u5236\u3001\u4f9d\u8d56\u5c5e\u6027\u3001\u9644\u52a0\u5c5e\u6027\u7b49\u673a\u5236\uff0cWPF \u4e3a\u5f00\u53d1\u8005\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u8bbe\u8ba1\u6a21\u5f0f\u652f\u6301\uff0c\u5e2e\u52a9\u5f00\u53d1\u8005\u66f4\u597d\u5730\u7ec4\u7ec7\u548c\u6269\u5c55\u5e94\u7528\u7a0b\u5e8f\u3002\u9664\u6b64\u4e4b\u5916\uff0cWPF \u8fd8\u4f53\u73b0\u4e86\u72b6\u6001\u6a21\u5f0f\u3001\u7ec4\u5408\u6a21\u5f0f\u3001\u5355\u4f8b\u6a21\u5f0f\u7b49\u5176\u4ed6\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u4e3a\u5f00\u53d1\u8005\u63d0\u4f9b\u4e86\u591a\u79cd\u4f18\u79c0\u7684\u67b6\u6784\u601d\u60f3\u3002<\/p>"},{"title":"\u501f\u52a9 ObservableCollections \u83b7\u5f97\u66f4\u591a\u5177\u6709\u901a\u77e5\u529f\u80fd\u7684\u96c6\u5408\u7c7b\u578b","link":"https:\/\/blog.coldwind.top\/posts\/more-observable-collections\/","pubDate":"Fri, 11 Jul 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/more-observable-collections\/","description":"<p>\u5982\u679c\u5927\u5bb6\u5728\u505a\u57fa\u4e8e C# \u7684 WPF\u3001Avalonia\u3001Win UI \u7b49\u5f00\u53d1\uff0c\u5c24\u5176\u662f\u9075\u5faa MVVM \u6a21\u5f0f\u65f6\uff0c\u9047\u5230\u8fc7\u4e0b\u9762\u7684\u8fd9\u4e9b\u70e6\u607c\uff1a<\/p>\n<ol>\n<li><code>ObservableCollection<\/code> \u6ca1\u6709\u6279\u91cf\u64cd\u4f5c\u7684\u529f\u80fd\uff08\u4f8b\u5982 <code>AddRange<\/code>\uff09<\/li>\n<li>\u7f3a\u5c11 <code>ObservableDictionary<\/code>\u3001<code>ObservableSet<\/code>\u3001<code>ObservableQueue<\/code> \u7b49\u96c6\u5408\u7c7b\u578b<\/li>\n<li>\u96be\u4ee5\u5b9e\u73b0\u8bf8\u5982\u8fc7\u6ee4\u3001\u6620\u5c04\u7b49\u529f\u80fd<\/li>\n<\/ol>\n<p>\u90a3\u4e48\uff0c<code>ObservableCollections<\/code> \u8fd9\u4e2a NuGet \u5305\u4e00\u5b9a\u53ef\u4ee5\u5e2e\u5230\u4f60\u3002\u6ca1\u9519\uff0c\u5b83\u5c31\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u5b9e\u7528\u7684\u5177\u6709\u901a\u77e5\u529f\u80fd\u7684\u96c6\u5408\u7c7b\u578b\uff0c\u4f7f\u6211\u4eec\u5728 WPF\u3001Avalonia\u3001\u751a\u81f3 Unity \u5f00\u53d1\u4e2d\u90fd\u80fd\u591f\u7528\u5f97\u4e0a\u3002<\/p>\n<h2 id=\"\u5b89\u88c5\">\n\u5b89\u88c5\n<a href=\"#%e5%ae%89%e8%a3%85\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5b83\u7684\u6e90\u4ee3\u7801\u94fe\u63a5\u5728 <a class=\"link\" href=\"https:\/\/github.com\/Cysharp\/ObservableCollections\" target=\"_blank\" rel=\"noopener\"\n>GitHub<\/a> \u4e0a\u3002<\/p>\n<p>\u5982\u679c\u60f3\u8981\u5b89\u88c5\u5b83\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5728 NuGet \u5305\u7ba1\u7406\u5668\u4e2d\u641c\u7d22 <code>ObservableCollections<\/code>\uff0c\u6216\u8005\u76f4\u63a5\u5728\u9879\u76ee\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bash\" data-lang=\"bash\"><span class=\"line\"><span class=\"cl\">dotnet add package ObservableCollections\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5b89\u88c5\u4e4b\u540e\u5373\u53ef\u4f7f\u7528\u3002\u6ce8\u610f\u5b83\u8fd8\u6709\u4e00\u4e2a\u7ed3\u5c3e\u5305\u542b <code>R3<\/code> \u7684\u7248\u672c\uff0c\u662f\u4e3a\u5b83\u5f00\u53d1\u7684 R3 \u5e93\u800c\u51c6\u5907\u7684\uff0c\u901a\u5e38\u6211\u4eec\u4e0d\u9700\u8981\u4f7f\u7528\u3002\u8fd9\u4e2a R3 \u5e93\u7b80\u5355\u6765\u8bf4\uff0c\u5c31\u662f\u4e00\u4e2a\u66f4\u52a0\u9ad8\u6027\u80fd\u7684 Rx.NET\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u8bf4\u8d77\u5b83\u7684\u5f00\u53d1\u8005 <a class=\"link\" href=\"https:\/\/github.com\/Cysharp\" target=\"_blank\" rel=\"noopener\"\n>Cysharp<\/a>\uff0c\u90a3\u53ef\u771f\u7684\u53ef\u4ee5\u8bf4\u662f\u5982\u96f7\u8d2f\u8033\u3002\u6bd4\u5982\u4ed6\u4eec\u5f00\u53d1\u7684 <code>Unitask<\/code>\uff0c\u5c31\u662f\u4e00\u4e2a\u975e\u5e38\u6d41\u884c\u7684\u9002\u7528\u4e8e Unity \u7684\u5f02\u6b65\u7f16\u7a0b\u5e93\uff1b\u800c\u4ed6\u4eec\u5f00\u53d1\u7684 <code>ZLinq<\/code>\uff0c\u6700\u8fd1\u4e5f\u662f\u975e\u5e38\u6709\u540d\u3002\u6cb9\u7ba1\u4e0a\u7684 Nick Chapsas \u4e5f <a class=\"link\" href=\"https:\/\/www.youtube.com\/watch?v=pUBc9uutSZM\" target=\"_blank\" rel=\"noopener\"\n>\u66fe\u7ecf\u4ecb\u7ecd\u8fc7\u8fd9\u4e2a\u5e93<\/a>\u3002<\/div>\n<\/div>\n<h2 id=\"\u652f\u6301\u6279\u91cf\u64cd\u4f5c\u7684\u53ef\u89c2\u6d4b\u96c6\u5408\">\n\u652f\u6301\u6279\u91cf\u64cd\u4f5c\u7684\u53ef\u89c2\u6d4b\u96c6\u5408\n<a href=\"#%e6%94%af%e6%8c%81%e6%89%b9%e9%87%8f%e6%93%8d%e4%bd%9c%e7%9a%84%e5%8f%af%e8%a7%82%e6%b5%8b%e9%9b%86%e5%90%88\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6211\u4eec\u5148\u6765\u770b\u4e00\u770b\u5b83\u6700\u7b80\u5355\u7684 <code>ObservableList<\/code>\u3002\u5b83\u662f\u4e00\u4e2a\u5177\u6709\u901a\u77e5\u529f\u80fd\u7684\u5217\u8868\uff0c\u5e76\u4e14\u652f\u6301\u6279\u91cf\u64cd\u4f5c\u3002\u6211\u4eec\u53ea\u9700\u8981\u5b9e\u4f8b\u5316\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ObservableList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6dfb\u52a0\u5355\u4e2a\u5143\u7d20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Item 1&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6279\u91cf\u6dfb\u52a0\u5143\u7d20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">AddRange<\/span><span class=\"p\">(<\/span><span class=\"n\">GetItems<\/span><span class=\"p\">());<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">GetItems<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5047\u5b9a\u8fd9\u4e2a\u65b9\u6cd5\u53ef\u4ee5\u4ece\u67d0\u4e2a\u6570\u636e\u6e90\u83b7\u53d6\u4e00\u4e9b\u6570\u636e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u901a\u8fc7\u89c2\u5bdf\u53ef\u4ee5\u53d1\u73b0\uff0c\u8fd9\u4e2a\u96c6\u5408\u7c7b\u578b\u63d0\u4f9b\u4e86 <code>CollectionChanged<\/code> \u4e8b\u4ef6\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u8ba2\u9605\u5b83\u6765\u76d1\u542c\u96c6\u5408\u7684\u53d8\u5316\u3002\u4f46\u662f\u5148\u4e0d\u8981\u60f3\u5f53\u7136\u5730\u8ba4\u4e3a\u5b83\u548c <code>ObservableCollection<\/code> \u4e00\u6837\u3002\u5b9e\u9645\u4e0a\uff0c\u5b83\u7684 <code>CollectionChanged<\/code> \u4e8b\u4ef6\u5e76\u4e0d\u662f\u6765\u81ea\u6211\u4eec\u719f\u6089\u7684\u90a3\u4e2a <code>INotifyCollectionChanged<\/code> \u63a5\u53e3\uff0c\u800c\u662f\u8fd9\u4e2a\u5e93\u81ea\u5e26\u7684\u4e00\u4e2a\u63a5\u53e3\u3002\u6240\u4ee5\u6211\u4eec\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u5e76\u6ca1\u6709\u76f4\u63a5\u5c06\u8fd9\u4e2a\u96c6\u5408\u58f0\u660e\u4e3a <code>public<\/code> \u7684\u5c5e\u6027\uff0c\u4ece\u800c\u5728 XAML \u4e2d\u7ed1\u5b9a\u3002<\/p>\n<p>\u90a3\u4e48\u5b83\u4e3a\u4ec0\u4e48\u8981\u8fd9\u6837\u505a\uff0c\u8ba9\u6211\u4eec\u4e0d\u80fd\u65b9\u4fbf\u5730\u4f7f\u7528\u5462\uff1f\u5176\u5b9e\u539f\u56e0\u5f88\u7b80\u5355\uff1a\u8fd9\u4e2a\u5e93\u4e0d\u5355\u5355\u9002\u7528\u4e8e WPF\uff0c\u5b83\u8fd8\u53ef\u4ee5\u7528\u4e8e Avalonia\u3001Unity \u7b49\u6846\u67b6\u3002\u4e3a\u4e86\u517c\u5bb9\u66f4\u591a\u7684\u6846\u67b6\uff0c\u5b83\u5c31\u6ca1\u6709\u4f7f\u7528 <code>INotifyCollectionChanged<\/code> \u63a5\u53e3\uff0c\u800c\u662f\u63d0\u4f9b\u4e86\u4e00\u4e2a\u66f4\u901a\u7528\u7684\u63a5\u53e3\u3002<\/p>\n<p>\u4f46\u4e0d\u5fc5\u62c5\u5fc3\uff0c\u5b83\u5e76\u6ca1\u6709\u6b62\u6b65\u4e8e\u6b64\uff0c\u800c\u662f\u4e13\u95e8\u63d0\u4f9b\u4e86\u65b9\u4fbf\u6211\u4eec\u5728 WPF\u3001Avalonia \u7b49\u6846\u67b6\u4e2d\u4f7f\u7528\u7684\u989d\u5916\u7c7b\u578b\u3002\u7b80\u5355\u6765\u8bf4\uff0c\u6211\u4eec\u53ea\u9700\u8981\u8c03\u7528\u5b83\u7684\u4e0b\u9762\u8fd9\u4e2a\u65b9\u6cd5\uff0c\u5373\u53ef\u5c06\u5b83\u8f6c\u4e3a\u53ef\u4ee5\u7528\u4e8e XAML \u7ed1\u5b9a\u7684\u96c6\u5408\u5bf9\u8c61\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ObservableList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">INotifyCollectionChangedSynchronizedViewList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Items<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Items<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">ToNotifyCollectionChanged<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u7684 <code>INotifyCollectionChangedSynchronizedViewList<\/code> \u5c31\u7ee7\u627f\u4e86 <code>INotifyCollectionChanged<\/code> \u63a5\u53e3\uff0c\u56e0\u6b64\u5b9e\u73b0\u4e86\u8be5\u63a5\u53e3\u7684\u5bf9\u8c61\u5c31\u53ef\u4ee5\u76f4\u63a5\u5728 XAML \u4e2d\u7ed1\u5b9a\u4f7f\u7528\uff0c\u4f8b\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ListBox<\/span> <span class=\"na\">ItemsSource=<\/span><span class=\"s\">&#34;{Binding Items}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5728\u540e\u53f0\u64cd\u4f5c <code>_items<\/code> \u96c6\u5408\uff0c\u5b83\u7684\u53d8\u5316\u5373\u53ef\u540c\u6b65\u5230 <code>Items<\/code> \u96c6\u5408\u4e2d\uff0c\u4ece\u800c\u5728 UI \u4e0a\u81ea\u52a8\u66f4\u65b0\u3002<\/p>\n<h2 id=\"\u521b\u5efa\u96c6\u5408\u89c6\u56fe\">\n\u521b\u5efa\u96c6\u5408\u89c6\u56fe\n<a href=\"#%e5%88%9b%e5%bb%ba%e9%9b%86%e5%90%88%e8%a7%86%e5%9b%be\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5b9e\u9645\u4e0a\uff0c\u5bf9\u4e8e <code>ObservableList<\/code>\uff0c\u6211\u4eec\u9664\u4e86\u53ef\u4ee5\u4f7f\u7528 <code>ToNotifyCollectionChanged<\/code> \u65b9\u6cd5\u5c06\u5176\u8f6c\u6362\u4e3a\u53ef\u4ee5\u7528\u4e8e XAML \u7ed1\u5b9a\u7684\u96c6\u5408\u7c7b\u578b\u5916\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528 <code>ToNotifyCollectionChangedSlim<\/code> \u65b9\u6cd5\uff0c\u5c06\u5b83\u8f6c\u4e3a\u4e00\u4e2a\u66f4\u52a0\u8f7b\u91cf\u7ea7\u7684\u96c6\u5408\u7c7b\u578b\u3002\u8fd9\u4e2a\u7c7b\u578b\u540c\u6837\u5b9e\u73b0\u4e86 <code>INotifyCollectionChanged<\/code> \u63a5\u53e3\uff0c\u4f46\u5b83\u7684\u6027\u80fd\u66f4\u9ad8\uff0c\u9002\u7528\u4e8e\u9700\u8981\u9891\u7e41\u66f4\u65b0\u7684\u573a\u666f\u3002\u4ee3\u4ef7\u662f\uff0c\u5b83\u5c06\u4e0d\u63d0\u4f9b <code>AddRange<\/code> \u7b49\u6279\u91cf\u64cd\u4f5c\u65b9\u6cd5\u3002<\/p>\n<p>\u8fd9\u65f6\u5019\u53ef\u80fd\u6709\u540c\u5b66\u5c31\u4f1a\u95ee\u4e86\uff1a\u6211\u7528 <code>ObservableList<\/code> \u800c\u4e0d\u662f\u539f\u751f\u7684 <code>ObservableCollection<\/code>\uff0c\u4e0d\u5c31\u662f\u4e3a\u4e86\u5b83\u63d0\u4f9b\u7684\u6279\u91cf\u64cd\u4f5c\u65b9\u6cd5\u5417\uff1f\u5982\u679c\u6211\u4e0d\u9700\u8981\u6279\u91cf\u64cd\u4f5c\uff0c\u76f4\u63a5\u7528 <code>ObservableCollection<\/code> \u4e0d\u5c31\u884c\u4e86\u5417\uff1f<\/p>\n<p>\u8fd9\u5c31\u5f15\u51fa\u4e86\u6211\u4eec\u5373\u5c06\u4ecb\u7ecd\u7684\u4e0b\u4e00\u4e2a\u529f\u80fd\uff0c\u540c\u65f6\u4e5f\u662f\u8fd9\u4e2a\u5e93\u76f8\u5f53\u91cd\u8981\u7684\u529f\u80fd\uff1a<code>View<\/code>\u3002\u8fd9\u4e2a <code>View<\/code> \u4e0d\u662f\u6211\u4eec\u5e38\u8bf4\u7684 MVVM \u4e2d\u7684\u89c6\u56fe\uff0c\u800c\u662f\u6307\u5bf9\u96c6\u5408\u7684\u89c6\u56fe\u3002\u5b83\u53ef\u4ee5\u8ba9\u6211\u4eec\u5728\u4e0d\u6539\u53d8\u539f\u59cb\u96c6\u5408\u7684\u60c5\u51b5\u4e0b\uff0c\u5bf9\u96c6\u5408\u8fdb\u884c\u8fc7\u6ee4\u3001\u6620\u5c04\u7b49\u64cd\u4f5c\u3002\u6211\u4eec\u4e0d\u9700\u8981\u5173\u6ce8\u89c6\u56fe\u7684\u5b9e\u73b0\u7ec6\u8282\uff0c\u53ea\u9700\u8981\u64cd\u4f5c\u540e\u53f0\u7684\u96c6\u5408\uff0c\u5373\u53ef\u5c06\u66f4\u6539\u540c\u6b65\u5230\u754c\u9762\u4e2d\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ObservableList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ISynchronizedView<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_syncView<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">INotifyCollectionChangedSynchronizedViewList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Items<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_syncView<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateView<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">s<\/span><span class=\"p\">.<\/span><span class=\"n\">ToUpper<\/span><span class=\"p\">());<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Items<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_syncView<\/span><span class=\"p\">.<\/span><span class=\"n\">ToNotifyCollectionChanged<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">ToggleFilter<\/span><span class=\"p\">(<\/span><span class=\"kt\">bool<\/span> <span class=\"n\">useFilter<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">useFilter<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_syncView<\/span><span class=\"p\">.<\/span><span class=\"n\">AttachFilter<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">s<\/span><span class=\"p\">.<\/span><span class=\"n\">StartsWith<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;A&#34;<\/span><span class=\"p\">));<\/span> <span class=\"c1\">\/\/ \u8fc7\u6ee4\u4ee5 &#34;A&#34; \u5f00\u5934\u7684\u5143\u7d20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">else<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_syncView<\/span><span class=\"p\">.<\/span><span class=\"n\">ResetFilter<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u6e05\u9664\u8fc7\u6ee4\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u5982\u679c\u6211\u4eec\u53ea\u662f\u60f3\u4f7f\u7528\u6620\u5c04\u529f\u80fd\uff0c\u90a3\u4e48\u4f7f\u7528 <code>ToNotifyCollectionChanged<\/code> \u65b9\u6cd5\u5373\u53ef\u3002\u5b83\u6709\u4e00\u4e2a\u91cd\u8f7d\uff0c\u53ef\u4ee5\u4f20\u5165\u4e00\u4e2a\u8868\u793a\u6620\u5c04\u65b9\u5f0f\u7684 <code>Func<\/code>\u3002\u53e6\u5916\uff0c\u5b83\u8fd8\u652f\u6301\u4f20\u5165\u4e00\u4e2a\u7c7b\u4f3c <code>Dispatcher<\/code> \u7684\u53c2\u6570\uff0c\u7528\u4e8e\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\u6620\u5c04\u64cd\u4f5c\u3002\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u4e0d\u662f WPF \u4e2d\u7684 <code>Dispatcher<\/code>\uff0c\u800c\u662f\u4e00\u4e2a\u5b83\u81ea\u5df1\u58f0\u660e\u7684\u7c7b\u578b\uff0c\u8fd9\u4e5f\u662f\u4e3a\u4e86\u517c\u5bb9\u66f4\u591a\u7684\u6846\u67b6\u3002<\/div>\n<\/div>\n<p>\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u89c6\u56fe <code>_syncView<\/code>\u3002\u5728\u521b\u5efa\u65f6\uff0c\u6211\u4eec\u5c31\u6307\u5b9a\u4e86\u4e00\u4e2a\u6620\u5c04\u51fd\u6570\uff0c\u5c06\u96c6\u5408\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u8f6c\u6362\u4e3a\u5927\u5199\u5f62\u5f0f\u3002\u7136\u540e\u5728 <code>ToggleFilter<\/code> \u65b9\u6cd5\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 <code>AttachFilter<\/code> \u53ca <code>ResetFilter<\/code> \u65b9\u6cd5\u6765\u6dfb\u52a0\u6216\u79fb\u9664\u8fc7\u6ee4\u5668\u3002\u5c31\u8fd9\u6837\uff0c\u6211\u4eec\u8f7b\u677e\u5730\u5b9e\u73b0\u4e86\u5bf9\u96c6\u5408\u7684\u8fc7\u6ee4\u548c\u6620\u5c04\u529f\u80fd\u3002<\/p>\n<p>\u7b80\u5355\u60f3\u8c61\u4e00\u4e0b\uff0c\u8fd9\u4e9b\u529f\u80fd\u5728 WPF\u3001Avalonia \u7b49\u6846\u67b6\u4e2d\u539f\u672c\u5b9e\u73b0\u8d77\u6765\u4f1a\u591a\u4e48\u9ebb\u70e6\u3002\u5bf9\u4e8e\u6620\u5c04\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9 <code>DataTemplate<\/code> \u4ee5\u53ca <code>ValueConverter<\/code> \u6765\u5b9e\u73b0\uff1b\u800c\u5bf9\u4e8e\u8fc7\u6ee4\uff0c\u6211\u4eec\u53ef\u80fd\u9700\u8981\u4f7f\u7528 <code>CollectionView<\/code> \u6216\u8005 <code>ICollectionView<\/code> \u7b49\u3002\u8fd9\u4e9b\u90fd\u9700\u8981\u6211\u4eec\u7f16\u5199\u5927\u91cf\u7684\u6837\u677f\u4ee3\u7801\u3002<\/p>\n<h2 id=\"\u53ef\u89c2\u6d4b\u7684\u5b57\u5178\">\n\u53ef\u89c2\u6d4b\u7684\u5b57\u5178\n<a href=\"#%e5%8f%af%e8%a7%82%e6%b5%8b%e7%9a%84%e5%ad%97%e5%85%b8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>WPF \u4e2d\u5176\u5b9e\u6709\u4e00\u4e2a <a class=\"link\" href=\"https:\/\/source.dot.net\/#PresentationFramework\/MS\/Internal\/Annotations\/ObservableDictionary.cs\" target=\"_blank\" rel=\"noopener\"\n><code>ObservableDictionary<\/code><\/a>\uff0c\u4f46\u5b83\u5e76\u4e0d\u662f <code>public<\/code> \u7684\uff0c\u53ea\u662f\u6807\u51c6\u5e93\u5185\u90e8\u4f7f\u7528\u3002\u6216\u8bb8\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a <code>ObservableCollection&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;<\/code> \u6765\u6a21\u62df\u4e00\u4e2a\u5b57\u5178\uff0c\u4f46\u8fd9\u6548\u7387\u5e76\u4e0d\u9ad8\uff0c\u56e0\u4e3a\u5b57\u5178\u7684\u6dfb\u52a0\u3001\u5220\u9664\u3001\u67e5\u627e\u7b49\u64cd\u4f5c\u90fd\u662f $O(1)$ \u7684\uff0c\u800c <code>ObservableCollection<\/code> \u7684\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u662f $O(n)$ \u7684\u3002<\/p>\n<p>\u81f3\u4e8e Avalonia\uff0c\u6211\u4eec\u5c31\u6bd4\u8f83\u5e78\u8fd0\u4e86\uff0c\u5b83\u76f4\u63a5\u63d0\u4f9b\u4e86 <code>AvaloniaList<\/code> \u548c <code>AvaloniaDictionary<\/code>\uff0c\u8fd9\u4e24\u4e2a\u96c6\u5408\u7c7b\u578b\uff0c\u524d\u8005\u652f\u6301\u6279\u91cf\u64cd\u4f5c\uff0c\u540e\u8005\u5219\u662f\u4e00\u4e2a\u53ef\u89c2\u6d4b\u7684\u5b57\u5178\u3002<\/p>\n<p>\u4e0b\u9762\u6211\u4eec\u7528\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u6765\u6f14\u793a\u5982\u4f55\u4f7f\u7528\u8fd9\u4e2a <code>ObservableDictionary<\/code>\u3002\u5b83\u7684\u4f7f\u7528\u65b9\u5f0f\u548c <code>ObservableList<\/code> \u7c7b\u4f3c\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5b9e\u4f8b\u5316\u5b83\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u4f7f\u7528\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ObservableDictionary<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">INotifyCollectionChangedSynchronizedViewList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Items<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Items<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">ToNotifyCollectionChanged<\/span><span class=\"p\">(<\/span><span class=\"n\">pair<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">pair<\/span><span class=\"p\">.<\/span><span class=\"n\">Value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Key1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Value1&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u53ef\u89c2\u6d4b\u7684\u961f\u5217\">\n\u53ef\u89c2\u6d4b\u7684\u961f\u5217\n<a href=\"#%e5%8f%af%e8%a7%82%e6%b5%8b%e7%9a%84%e9%98%9f%e5%88%97\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u961f\u5217\u6709\u65f6\u5019\u4e5f\u662f\u4e00\u4e2a\u6211\u4eec\u7528\u5f97\u4e0a\u7684\u96c6\u5408\u7c7b\u578b\u3002\u5b83\u7684\u7279\u70b9\u662f\u5148\u8fdb\u5148\u51fa\uff08FIFO\uff09\uff0c\u9002\u7528\u4e8e\u9700\u8981\u6309\u7167\u987a\u5e8f\u5904\u7406\u5143\u7d20\u7684\u573a\u666f\u3002\u6bd4\u5982\u6211\u4eec\u5e0c\u671b\u5b58\u50a8\u4e00\u4e9b\u5b9e\u65f6\u7684\u6d88\u606f\uff0c\u5e76\u4e14\u5e0c\u671b\u4ec5\u5c55\u793a\u6700\u65b0\u7684\u51e0\u5341\u6761\uff0c\u800c\u5f53\u8d85\u8fc7\u8fd9\u4e2a\u6570\u91cf\u65f6\uff0c\u81ea\u52a8\u5220\u9664\u6700\u65e7\u7684\u6d88\u606f\u3002\u8fd9\u5c31\u8981\u6c42\u6211\u4eec\u9700\u8981\u80fd\u591f\u9ad8\u6548\u5730\u5220\u9664\u961f\u5217\u5934\u90e8\u7684\u5143\u7d20\u3002\u8fd9\u5bf9\u4e8e\u4f20\u7edf\u7684\u5217\u8868\u6765\u8bf4\u662f\u6bd4\u8f83\u9ebb\u70e6\u7684\uff0c\u56e0\u4e3a\u8fd9\u4f1a\u5f15\u5165 $O(n)$ \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002<\/p>\n<p><code>ObservableCollections<\/code> \u5e93\u63d0\u4f9b\u4e86\u4e00\u4e2a <code>ObservableQueue&lt;T&gt;<\/code>\uff0c\u4e0d\u8fc7\u6211\u4e0d\u6253\u7b97\u8be6\u7ec6\u4ecb\u7ecd\u5b83\uff0c\u56e0\u4e3a\u6211\u4eec\u4e0a\u9762\u63d0\u5230\u7684\u9700\u6c42\u6709\u4e00\u4e2a\u66f4\u52a0\u5408\u9002\u7684\u96c6\u5408\u7c7b\u578b\uff0c\u7b49\u4e0b\u5c31\u4f1a\u4ecb\u7ecd\u5230\u3002\u4f46\u8fd9\u91cc\u6211\u4eec\u8fd8\u662f\u7528\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u6765\u6f14\u793a\u5b83\u7684\u7528\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ObservableQueue<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">LogMessage<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_logQueue<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">INotifyCollectionChangedSynchronizedViewList<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">LogMessage<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">LogMessages<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">LogMessages<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_logQueue<\/span><span class=\"p\">.<\/span><span class=\"n\">ToNotifyCollectionChanged<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6dfb\u52a0\u65e5\u5fd7\u6d88\u606f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">AddLogMessage<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Application started&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">AddLogMessage<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">content<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">logMessage<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LogMessage<\/span><span class=\"p\">(<\/span><span class=\"n\">DateTime<\/span><span class=\"p\">.<\/span><span class=\"n\">Now<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;o&#34;<\/span><span class=\"p\">),<\/span> <span class=\"n\">content<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5982\u679c\u961f\u5217\u8d85\u8fc7 100 \u6761\uff0c\u5219\u5220\u9664\u6700\u65e7\u7684\u6d88\u606f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_logQueue<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">&gt;=<\/span> <span class=\"m\">100<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_logQueue<\/span><span class=\"p\">.<\/span><span class=\"n\">Dequeue<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_logQueue<\/span><span class=\"p\">.<\/span><span class=\"n\">Enqueue<\/span><span class=\"p\">(<\/span><span class=\"n\">logMessage<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">record<\/span> <span class=\"nc\">LogMessage<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">Timestamp<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Content<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u4e8b\u5b9e\u4e0a\uff0c\u5982\u679c\u6211\u4eec\u7684\u9700\u6c42\u53ea\u662f\u6bd4\u5982\u8bf4\u4fdd\u7559\u6700\u8fd1\u7684\u51e0\u5341\u5230\u4e00\u767e\u6761\u6d88\u606f\uff0c\u90a3\u4e48\u76f4\u63a5\u4f7f\u7528\u4f20\u7edf\u7684 <code>ObservableCollection<\/code> \u4e5f\u662f\u5b8c\u5168\u53ef\u4ee5\u63a5\u53d7\u7684\u3002\u867d\u7136\u6709\u70b9\u6027\u80fd\u635f\u5931\uff0c\u4f46\u5bf9\u4e8e\u73b0\u5728\u7684 CPU \u6765\u8bf4\uff0c\u8fd9\u70b9\u590d\u6742\u5ea6\u5b8c\u5168\u662f\u5fae\u4e0d\u8db3\u9053\u7684\u3002\u901a\u8fc7\u7b80\u5355\u7684 Benchmark\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c<code>List<\/code> \u53ef\u80fd\u53ea\u6bd4 <code>Queue<\/code> \u6162 50% \u5de6\u53f3\uff1b\u751a\u81f3\u5f53\u6570\u636e\u91cf\u6bd4\u8f83\u5c0f\uff08\u4f8b\u5982\u5341\u51e0\u6761\uff09\u65f6\uff0c<code>List<\/code> \u66f4\u662f\u80fd\u5728\u6027\u80fd\u4e0a\u8d85\u8fc7 <code>Queue<\/code>\u3002\u53e6\u5916\uff0c<code>List<\/code> \u7684\u4f7f\u7528\u663e\u7136\u6bd4 <code>Queue<\/code> \u7b80\u5355\u4e86\u4e0d\u5c11\u3002<\/div>\n<\/div>\n<h2 id=\"\u53ef\u89c2\u6d4b\u7684\u73af\u5f62\u7f13\u51b2\u533a\">\n\u53ef\u89c2\u6d4b\u7684\u73af\u5f62\u7f13\u51b2\u533a\n<a href=\"#%e5%8f%af%e8%a7%82%e6%b5%8b%e7%9a%84%e7%8e%af%e5%bd%a2%e7%bc%93%e5%86%b2%e5%8c%ba\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e0b\u9762\u6211\u4eec\u8981\u4ecb\u7ecd\u7684\u8fd9\u4e2a\u96c6\u5408\u7c7b\u578b\uff0c\u6b63\u662f\u8fd9\u4e2a\u5305\u6700\u63a8\u8350\u6211\u4eec\u7528\u6765\u5b9e\u73b0\u8fd9\u4e2a\u4fdd\u7559\u6700\u8fd1\u7684\u4e00\u4e9b\u6d88\u606f\u7684\u96c6\u5408\u7c7b\u578b\uff1a<code>RingBuffer<\/code>\u3002\u5b83\u662f\u4e00\u4e2a\u73af\u5f62\u7f13\u51b2\u533a\uff0c\u5177\u6709\u56fa\u5b9a\u7684\u5927\u5c0f\u3002\u5f53\u6dfb\u52a0\u65b0\u5143\u7d20\u65f6\uff0c\u5982\u679c\u7f13\u51b2\u533a\u5df2\u6ee1\uff0c\u5219\u4f1a\u8986\u76d6\u6700\u65e7\u7684\u5143\u7d20\u3002\u8fd9\u4f7f\u5f97\u5b83\u975e\u5e38\u9002\u5408\u7528\u4e8e\u5b58\u50a8\u6700\u8fd1\u7684\u6d88\u606f\u6216\u6570\u636e\u3002<\/p>\n<p>\u8fd9\u4e2a\u5305\u63d0\u4f9b\u4e86\u4e24\u79cd\u73af\u5f62\u7f13\u51b2\u533a\uff1a<code>ObservableRingBuffer<\/code> \u548c <code>ObservableFixedSizeRingBuffer<\/code>\u3002\u524d\u8005\u652f\u6301\u52a8\u6001\u8c03\u6574\u5927\u5c0f\uff0c\u800c\u540e\u8005\u5219\u662f\u4e00\u4e2a\u56fa\u5b9a\u5927\u5c0f\u7684\u73af\u5f62\u7f13\u51b2\u533a\u3002\u501f\u52a9\u540e\u8005\uff0c\u6211\u4eec\u524d\u9762\u7684\u4f8b\u5b50\u53ef\u4ee5\u7b80\u5316\u4e3a\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ObservableFixedSizeRingBuffer<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">LogMessage<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_logBuffer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"m\">100<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">INotifyCollectionChangedSynchronizedViewList<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">LogMessage<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">LogMessages<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">LogMessages<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_logBuffer<\/span><span class=\"p\">.<\/span><span class=\"n\">ToNotifyCollectionChanged<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6dfb\u52a0\u65e5\u5fd7\u6d88\u606f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">AddLogMessage<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Application started&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">AddLogMessage<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">content<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">logMessage<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LogMessage<\/span><span class=\"p\">(<\/span><span class=\"n\">DateTime<\/span><span class=\"p\">.<\/span><span class=\"n\">Now<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;o&#34;<\/span><span class=\"p\">),<\/span> <span class=\"n\">content<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_logBuffer<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">logMessage<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u6dfb\u52a0\u65b0\u6d88\u606f\uff0c\u81ea\u52a8\u8986\u76d6\u6700\u65e7\u7684\u6d88\u606f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5c31\u8fd9\u6837\uff0c\u6211\u4eec\u8f7b\u677e\u5730\u5b9e\u73b0\u4e86\u4e00\u4e2a\u4fdd\u7559\u6700\u8fd1 100 \u6761\u65e5\u5fd7\u6d88\u606f\u7684\u96c6\u5408\u3002<\/p>\n<h2 id=\"\u7ebf\u7a0b\u5b89\u5168\">\n\u7ebf\u7a0b\u5b89\u5168\n<a href=\"#%e7%ba%bf%e7%a8%8b%e5%ae%89%e5%85%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u63a5\u4e0b\u6765\u8fd9\u4e2a\u90e8\u5206\u76f8\u5f53\u91cd\u8981\uff0c\u4e5f\u662f\u5927\u5bb6\u5728\u4f7f\u7528\u8fd9\u4e2a\u5305\u65f6\u9700\u8981\u5c24\u5176\u6ce8\u610f\u7684\uff0c\u5c31\u662f\u5173\u4e8e\u7ebf\u7a0b\u5b89\u5168\u7684\u95ee\u9898\u3002\u9996\u5148\uff0c\u8fd9\u4e2a\u5305\u63d0\u4f9b\u7684\u6bcf\u4e2a\u96c6\u5408\u90fd\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u3002\u5b83\u4eec\u5185\u90e8\u4f1a\u7528\u4e00\u4e2a\u7ebf\u7a0b\u9501\uff0c\u4fdd\u8bc1\u5b83\u7684\u6dfb\u52a0\u3001\u5220\u9664\u7b49\u64cd\u4f5c\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u3002\u4f46\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u6211\u4eec\u5c31\u53ef\u4ee5\u9ad8\u6795\u65e0\u5fe7\u4e86\uff0c\u56e0\u4e3a\u867d\u7136\u8fd9\u4e9b\u96c6\u5408\u7ebf\u7a0b\u5b89\u5168\uff0c\u4f46\u662f\u4ece\u5b83\u4eec\u521b\u5efa\u51fa\u7684\u89c6\u56fe\u5728\u540c\u6b65\u5b83\u4eec\u7684\u4fee\u6539\u65f6\uff0c\u53ef\u80fd\u51fa\u73b0\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u3002\u90a3\u4e48\uff0c\u6211\u4eec\u8be5\u600e\u4e48\u529e\u5462\uff1f<\/p>\n<p>\u9996\u5148\uff0c\u5728\u4f7f\u7528 <code>ToNotifyCollectionChanged<\/code> \u65b9\u6cd5\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u4f20\u5165\u4e00\u4e2a <code>Dispatcher<\/code> \u53c2\u6570\u3002\u524d\u9762\u63d0\u5230\uff0c\u8fd9\u4e2a\u53c2\u6570\u662f\u8be5\u7c7b\u5e93\u81ea\u5df1\u58f0\u660e\u7684\u7c7b\u578b\u3002\u4f46\u662f\u5b83\u63d0\u4f9b\u4e86\u4e00\u4e2a\u65b9\u4fbf\u6211\u4eec\u4f7f\u7528\u7684\u5355\u4f8b\uff1a<code>SynchronizationContextCollectionEventDispatcher.Current<\/code>\u3002\u501f\u52a9\u5b83\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u786e\u4fdd\u8be5\u65b9\u6cd5\u521b\u5efa\u51fa\u7684\u89c6\u56fe\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\u4fee\u6539\u64cd\u4f5c\uff0c\u4ece\u800c\u907f\u514d\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u3002<\/p>\n<p>\u4f46\u662f\u8fd9\u8fd8\u4e0d\u591f\u3002\u5b9e\u6d4b\u53d1\u73b0\uff0c\u867d\u7136\u80cc\u540e\u7684\u96c6\u5408\u672c\u8eab\u7ebf\u7a0b\u5b89\u5168\uff0c\u4f46\u662f\u5b83\u521b\u5efa\u51fa\u6765\u7684\u89c6\u56fe\u5728\u64cd\u4f5c\u65f6\u4ecd\u9762\u4e34\u7740\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u3002\u5c24\u5176\u662f\u6570\u636e\u4e0d\u4e00\u81f4\u3002\u6bd4\u5982\u6211\u4eec\u5728\u5220\u9664\u5143\u7d20\u4e4b\u540e\u7acb\u523b\u6dfb\u52a0\u4e86\u5143\u7d20\uff0c\u90a3\u4e48\u8fd9\u4e24\u6b21\u52a8\u4f5c\u5728\u540c\u6b65\u5230\u89c6\u56fe\u7684\u8fc7\u7a0b\u4e2d\u5c31\u53ef\u80fd\u4f1a\u51fa\u73b0\u95ee\u9898\u3002\u5bf9\u4e8e\u8fd9\u4e2a\u95ee\u9898\uff0c\u5982\u679c\u6211\u4eec\u786e\u5b9e\u6709\u5728\u591a\u7ebf\u7a0b\u4e0a\u64cd\u4f5c\u80cc\u540e\u96c6\u5408\u7684\u9700\u6c42\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u8ba9\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u53d1\u751f\u5728\u4e3b\u7ebf\u7a0b\u4e0a\u3002\u4ee5 WPF \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ObservableList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">INotifyCollectionChangedSynchronizedViewList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Items<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainViewModel<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Items<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">ToNotifyCollectionChanged<\/span><span class=\"p\">(<\/span><span class=\"n\">SynchronizationContextCollectionEventDispatcher<\/span><span class=\"p\">.<\/span><span class=\"n\">Current<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">AddItem<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u786e\u4fdd\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\u6dfb\u52a0\u64cd\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Application<\/span><span class=\"p\">.<\/span><span class=\"n\">Current<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispatcher<\/span><span class=\"p\">.<\/span><span class=\"n\">InvokeAsync<\/span><span class=\"p\">(()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">RemoveItem<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u786e\u4fdd\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\u5220\u9664\u64cd\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Application<\/span><span class=\"p\">.<\/span><span class=\"n\">Current<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispatcher<\/span><span class=\"p\">.<\/span><span class=\"n\">InvokeAsync<\/span><span class=\"p\">(()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">Remove<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5f53\u7136\uff0c\u5728 <code>ViewModel<\/code> \u4e2d\u8bbf\u95ee <code>Application.Current<\/code> \u53ef\u80fd\u5e76\u4e0d\u662f\u4e00\u4e2a\u5341\u5206\u9075\u5b88 MVVM \u6a21\u5f0f\u7684\u597d\u4e60\u60ef\u3002\u56e0\u6b64\u5728\u66f4\u52a0\u4e25\u8c28\u7684\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u5c06 <code>Dispatcher<\/code> \u4f5c\u4e3a\u53c2\u6570\u4f20\u5165 <code>ViewModel<\/code>\uff0c\u6216\u8005\u4f7f\u7528\u4f9d\u8d56\u6ce8\u5165\u7684\u65b9\u5f0f\u6765\u83b7\u53d6\u5b83\u3002\u8fd9\u6837\u53ef\u4ee5\u66f4\u597d\u5730\u9075\u5faa MVVM \u6a21\u5f0f\uff0c\u540c\u65f6\u4e5f\u80fd\u786e\u4fdd\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\u64cd\u4f5c\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>ObservableCollections<\/code> \u662f\u4e00\u4e2a\u975e\u5e38\u5b9e\u7528\u7684 NuGet \u5305\uff0c\u5b83\u63d0\u4f9b\u4e86\u591a\u79cd\u5177\u6709\u901a\u77e5\u529f\u80fd\u7684\u96c6\u5408\u7c7b\u578b\uff0c\u9002\u7528\u4e8e WPF\u3001Avalonia\u3001Win UI \u7b49\u6846\u67b6\u3002\u5b83\u4e0d\u4ec5\u652f\u6301\u6279\u91cf\u64cd\u4f5c\uff0c\u8fd8\u63d0\u4f9b\u4e86\u8fc7\u6ee4\u3001\u6620\u5c04\u7b49\u529f\u80fd\uff0c\u4f7f\u5f97\u6211\u4eec\u5728\u5f00\u53d1\u4e2d\u53ef\u4ee5\u66f4\u52a0\u9ad8\u6548\u5730\u5904\u7406\u96c6\u5408\u6570\u636e\u3002<\/p>\n<p>\u5728\u4f7f\u7528\u65f6\uff0c\u6211\u4eec\u9700\u8981\u6ce8\u610f\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\uff0c\u5c24\u5176\u662f\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e0b\u64cd\u4f5c\u96c6\u5408\u65f6\u3002\u901a\u8fc7\u5408\u7406\u5730\u4f7f\u7528 <code>Dispatcher<\/code>\uff0c\u6211\u4eec\u53ef\u4ee5\u786e\u4fdd\u96c6\u5408\u7684\u64cd\u4f5c\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\uff0c\u4ece\u800c\u907f\u514d\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002<\/p>"},{"title":".NET \u539f\u751f\u6709\u54ea\u4e9b Timer \u4ee5\u53ca\u5b83\u4eec\u5206\u522b\u662f\u600e\u4e48\u7528\u7684\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/how-many-timers-are-there\/","pubDate":"Mon, 07 Jul 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/how-many-timers-are-there\/","description":"<p>\u76f8\u4fe1\u5f88\u591a .NET \u65b0\u624b\uff08\u751a\u81f3\u6709\u51e0\u5e74\u7ecf\u9a8c\u7684\u8001\u624b\uff09\u90fd\u4f1a\u641e\u4e0d\u6e05\u695a\u8fd9\u4e2a\u95ee\u9898\uff1a.NET \u539f\u751f\u6709\u54ea\u4e9b\u8ba1\u65f6\u5668\uff08Timer\uff09\uff1f\u5b83\u4eec\u5206\u522b\u662f\u505a\u4ec0\u4e48\u7528\u7684\uff1f\u8be5\u5982\u4f55\u9009\u62e9\u4ee5\u53ca\u5982\u4f55\u6b63\u786e\u5730\u4f7f\u7528\uff1f<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u5c31\u6765\u76d8\u70b9\u4e00\u4e0b\u5427\u3002<\/p>\n<h2 id=\"\u4e00\u5171\u6709\u591a\u5c11\u79cd-timer\">\n\u4e00\u5171\u6709\u591a\u5c11\u79cd Timer\uff1f\n<a href=\"#%e4%b8%80%e5%85%b1%e6%9c%89%e5%a4%9a%e5%b0%91%e7%a7%8d-timer\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6211\u4eec\u6765\u56de\u7b54\u4e00\u4e0b\u8fd9\u4e2a\u95ee\u9898\u3002\u5728 <a class=\"link\" href=\"https:\/\/source.dot.net\" target=\"_blank\" rel=\"noopener\"\n>.NET \u6e90\u4ee3\u7801<\/a> \u4e2d\u641c\u7d22 <code>Timer<\/code>\uff0c\u6211\u4eec\u53ef\u4ee5\u627e\u5230\u7b54\u6848\u3002\u6392\u9664\u6389\u4e00\u4e9b <code>internal<\/code> \u6216 <code>abstract<\/code> \u7684\u7c7b\u578b\uff08\u4f8b\u5982 <code>System.Net.Timer<\/code>\u3001<code>Microsoft.ML.Trainers.FastTree.Timer<\/code> \u7b49\uff09\uff0c\u6211\u4eec\u53ef\u4ee5\u627e\u5230\u4ee5\u4e0b\u51e0\u79cd\u8ba1\u65f6\u5668\uff1a<\/p>\n<ul>\n<li><code>System.Threading.Timer<\/code><\/li>\n<li><code>System.Timers.Timer<\/code><\/li>\n<li><code>System.Threading.PeriodicTimer<\/code><\/li>\n<li><code>System.Windows.Threading.DispatcherTimer<\/code><\/li>\n<li><code>System.Windows.Forms.Timer<\/code><\/li>\n<li><code>System.Web.UI.Timer<\/code><\/li>\n<li><code>Windows.UI.Xaml.DispatcherTimer<\/code><\/li>\n<\/ul>\n<p>\u8fd9\u91cc\uff0c\u540e\u9762\u56db\u4e2a\u53ef\u4ee5\u4ece\u547d\u540d\u7a7a\u95f4\u770b\u51fa\uff0c\u5b83\u4eec\u9002\u7528\u4e8e\u7279\u5b9a\u7684 UI \u6846\u67b6\uff08\u5373 WPF\u3001WinForms\u3001ASP.NET Forms\u3001Win UI \u7b49\uff09\uff0c\u800c\u524d\u9762\u4e09\u4e2a\u5219\u662f\u66f4\u901a\u7528\u7684\u8ba1\u65f6\u5668\uff0c\u9002\u7528\u4e8e\u5927\u591a\u6570\u573a\u666f\u3002\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u4e3b\u8981\u4ecb\u7ecd\u524d\u4e09\u4e2a\uff0c\u5e76\u4e14\u5728\u540e\u56db\u4e2a\u4e2d\u9009\u62e9\u9002\u7528\u4e8e WPF \u7684 <code>DispatcherTimer<\/code> \u8fdb\u884c\u4ecb\u7ecd\u3002<\/p>\n<h2 id=\"systemthreadingtimer\">\nSystem.Threading.Timer\n<a href=\"#systemthreadingtimer\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6e90\u4ee3\u7801\uff1a<a class=\"link\" href=\"https:\/\/source.dot.net\/#System.Private.CoreLib\/src\/libraries\/System.Private.CoreLib\/src\/System\/Threading\/Timer.cs\" target=\"_blank\" rel=\"noopener\"\n>System.Threading.Timer.cs<\/a><\/p>\n<p><code>System.Threading.Timer<\/code> \u662f .NET \u4e2d\u6700\u5e38\u7528\u4e5f\u662f\u6700\u8f7b\u91cf\u7684\u8ba1\u65f6\u5668\u4e4b\u4e00\u3002\u5b83\u662f\u57fa\u4e8e\u7ebf\u7a0b\u6c60\u7684\uff0c\u6240\u4ee5\u4e0d\u4e0e\u67d0\u4e2a\u7279\u5b9a\u7ebf\u7a0b\uff08\u5982 UI \u7ebf\u7a0b\uff09\u5173\u8054\uff0c\u5e76\u4e14\u4e5f\u4e0d\u4f1a\u963b\u585e\u8c03\u7528\u7ebf\u7a0b\u3002<\/p>\n<p>\u5b83\u6ca1\u6709\u63d0\u4f9b\u8bf8\u5982 <code>Start<\/code> \u548c <code>Stop<\/code> \u65b9\u6cd5\uff0c\u800c\u662f\u901a\u8fc7\u8bbe\u7f6e\u56de\u8c03\u51fd\u6570\u548c\u5468\u671f\u6765\u542f\u52a8\uff08\u8fd8\u53ef\u4ee5\u901a\u8fc7 <code>Change<\/code> \u65b9\u6cd5\u6765\u8c03\u6574\u5468\u671f\uff09\u3002\u5f53\u4e0d\u9700\u8981\u4f7f\u7528\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u8c03\u7528 <code>Dispose<\/code> \u65b9\u6cd5\u6765\u7ed3\u675f\u5b83\u5e76\u91ca\u653e\u8d44\u6e90\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Threading<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u7b2c\u4e09\u4e2a\u53c2\u6570\u662f\u521d\u59cb\u5ef6\u8fdf\u65f6\u95f4\uff0c\u7b2c\u56db\u4e2a\u53c2\u6570\u662f\u5468\u671f\u65f6\u95f4\uff08\u5355\u4f4d\u90fd\u662f\u6beb\u79d2\uff09<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8fd9\u91cc\u7684\u4f20\u53c2\u610f\u5473\u7740\uff0c\u8ba1\u65f6\u5668\u5c06\u4f1a\u6ca1\u6709\u521d\u59cb\u5ef6\u8fdf\uff0c\u4e14\u6bcf\u9694 1 \u79d2\u6267\u884c\u4e00\u6b21\u56de\u8c03\u51fd\u6570<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">timer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Timer<\/span><span class=\"p\">(<\/span><span class=\"n\">TimerCallback<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">1000<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Timer started. Press Enter to exit...&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadLine<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Timer stopped and disposed.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">void<\/span> <span class=\"n\">TimerCallback<\/span><span class=\"p\">(<\/span><span class=\"kt\">object?<\/span> <span class=\"n\">state<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;Timer callback executed at {DateTime.Now}, thread id: {Environment.CurrentManagedThreadId}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8f93\u51fa\u7ed3\u679c\u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-plaintext\" data-lang=\"plaintext\"><span class=\"line\"><span class=\"cl\">Timer started. Press Enter to exit...\n<\/span><\/span><span class=\"line\"><span class=\"cl\">Timer callback executed at 2025\/7\/6 19:27:27, thread id: 11\n<\/span><\/span><span class=\"line\"><span class=\"cl\">Timer callback executed at 2025\/7\/6 19:27:28, thread id: 9\n<\/span><\/span><span class=\"line\"><span class=\"cl\">Timer callback executed at 2025\/7\/6 19:27:29, thread id: 9\n<\/span><\/span><span class=\"line\"><span class=\"cl\">Timer callback executed at 2025\/7\/6 19:27:30, thread id: 9\n<\/span><\/span><span class=\"line\"><span class=\"cl\">Timer stopped and disposed.\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u4e0d\u96be\u53d1\u73b0\u51e0\u4e2a\u73b0\u8c61\uff1a<\/p>\n<ol>\n<li>\u8ba1\u65f6\u5668\u5728\u521b\u5efa\u540e\u7acb\u523b\u5c31\u5f00\u59cb\u6267\u884c\u4e86\uff0c\u4e0d\u9700\u8981\u8c03\u7528\u7c7b\u4f3c <code>Start<\/code> \u7684\u65b9\u6cd5\uff1b<\/li>\n<li>\u8ba1\u65f6\u5668\u6ca1\u6709\u963b\u585e\u521b\u5efa\u5b83\u7684\u7ebf\u7a0b\uff0c\u5b83\u7c7b\u4f3c\u4e8e\u542f\u52a8\u4e86\u4e00\u4e2a\u540e\u53f0\u670d\u52a1\uff1b<\/li>\n<li>\u8ba1\u65f6\u5668\u7684\u56de\u8c03\u51fd\u6570\u662f\u5728\u4e0d\u540c\u7684\u7ebf\u7a0b\u4e0a\u6267\u884c\u7684\uff0c\u800c\u4e14\u6bcf\u6b21\u6267\u884c\u7684\u7ebf\u7a0b ID \u53ef\u80fd\u4e0d\u540c\uff0c\u8fd9\u53d6\u51b3\u4e8e\u7ebf\u7a0b\u6c60\u7684\u8c03\u5ea6\uff1b<\/li>\n<li>\u8ba1\u65f6\u5668\u53ef\u4ee5\u901a\u8fc7 <code>Dispose<\/code> \u65b9\u6cd5\u6765\u505c\u6b62\u53ca\u91ca\u653e\u8d44\u6e90\u3002<\/li>\n<\/ol>\n<p>\u56e0\u4e3a\u5b83\u7684\u4e00\u4e9b\u5c40\u9650\u6027\uff0c\u8fd9\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\u53ef\u80fd\u4f1a\u8ba9\u6211\u4eec\u9047\u5230\u4e00\u4e9b\u56f0\u96be\uff0c\u6bd4\u5982\u6211\u4eec\u65e0\u6cd5\u7075\u6d3b\u5730\u63a7\u5236\u5b83\u7684\u5f00\u59cb\u4e0e\u7ed3\u675f\uff0c\u4ee5\u53ca\u6682\u505c\u548c\u91cd\u542f\u7b49\u3002\u53e6\u5916\uff0c\u56e0\u4e3a\u5b83\u6bcf\u6b21\u7684\u56de\u8c03\u53ef\u80fd\u90fd\u53d1\u751f\u5728\u4e0d\u540c\u7684\u7ebf\u7a0b\u4e0a\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u7279\u522b\u6ce8\u610f\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\uff0c\u5c24\u5176\u662f\u5728\u8bbf\u95ee\u5171\u4eab\u8d44\u6e90\uff0c\u6216\u8005\u9700\u8981\u67d0\u4e9b\u64cd\u4f5c\u53d1\u751f\u5728\u7279\u5b9a\u7ebf\u7a0b\uff08\u5982 UI \u7ebf\u7a0b\uff09\u65f6\u3002<\/p>\n<p>\u5173\u4e8e\u8fd9\u4e9b\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5728\u540e\u7eed\u4ecb\u7ecd\u7684\u5176\u4ed6\u8ba1\u65f6\u5668\u4e2d\u770b\u5230\u66f4\u597d\u7684\u89e3\u51b3\u65b9\u6848\u3002<\/p>\n<h2 id=\"systemtimerstimer\">\nSystem.Timers.Timer\n<a href=\"#systemtimerstimer\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6e90\u4ee3\u7801\uff1a<a class=\"link\" href=\"https:\/\/source.dot.net\/#System.ComponentModel.TypeConverter\/System\/Timers\/Timer.cs\" target=\"_blank\" rel=\"noopener\"\n>System.Timers.Timer.cs<\/a><\/p>\n<p><code>System.Timers.Timer<\/code> \u662f\u4e00\u4e2a\u66f4\u9ad8\u7ea7\u7684\u8ba1\u65f6\u5668\uff0c\u5b83\u57fa\u4e8e\uff08\u6216\u8005\u53ef\u4ee5\u7406\u89e3\u4e3a\u5c01\u88c5\u4e86\uff09 <code>System.Threading.Timer<\/code>\uff0c\u5e76\u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u529f\u80fd\u548c\u66f4\u6613\u7528\u7684 API\u3002\u6bd4\u5982\u5b83\u63d0\u4f9b\u4e86\u5f00\u59cb\u3001\u505c\u6b62\u3001\u5173\u95ed\u7b49\u529f\u80fd\uff0c\u8fd8\u63d0\u4f9b\u4e86\u4e00\u4e9b\u5c5e\u6027\u6765\u63a7\u5236\u8ba1\u65f6\u5668\u7684\u884c\u4e3a\uff0c\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li>Interval\uff1a\u8bbe\u7f6e\u8ba1\u65f6\u5668\u7684\u95f4\u9694\u65f6\u95f4\uff08\u6beb\u79d2\uff09\uff0c\u4e0d\u518d\u9700\u8981\u4f7f\u7528 <code>Change<\/code> \u65b9\u6cd5\u4e86\uff1b<\/li>\n<li>Enabled\uff1a\u8bbe\u7f6e\u8ba1\u65f6\u5668\u662f\u5426\u542f\u7528\uff08<code>Start<\/code> \u548c <code>Stop<\/code> \u65b9\u6cd5\u5176\u5b9e\u5c31\u662f\u5728\u63a7\u5236\u5b83\uff09\uff1b<\/li>\n<li>AutoReset\uff1a\u8bbe\u7f6e\u8ba1\u65f6\u5668\u662f\u5426\u81ea\u52a8\u91cd\u7f6e\uff08\u5373\u662f\u5426\u5728\u56de\u8c03\u51fd\u6570\u6267\u884c\u5b8c\u6bd5\u540e\u7acb\u5373\u91cd\u65b0\u5f00\u59cb\u8ba1\u65f6\uff0c\u9ed8\u8ba4\u4e3a <code>true<\/code>\uff09\u3002\u6216\u8005\u6362\u4e00\u79cd\u7406\u89e3\u65b9\u5f0f\uff0c\u6709\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u8ba1\u65f6\u5668\u4f1a\u6bcf\u5468\u671f\u90fd\u89e6\u53d1\u4e00\u6b21\uff0c\u800c\u662f\u771f\u7684\u50cf\u4e00\u4e2a\u7b80\u5355\u7684\u5b9a\u65f6\u5668\u90a3\u6837\uff0c\u5728\u5f00\u59cb\u540e\u5230\u8fbe\u8bbe\u5b9a\u7684\u5468\u671f\u5c31\u89e6\u53d1\uff0c\u7136\u540e\u505c\u5728\u90a3\u91cc\uff0c\u7b49\u5f85\u4e0b\u4e00\u6b21\u542f\u52a8\u3002<\/li>\n<\/ul>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Timers<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">timer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Timer<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u521b\u5efa\u4e00\u4e2a\u8ba1\u65f6\u5668\uff08\u9ed8\u8ba4\u7684\u5468\u671f\u4e3a 100 \u6beb\u79d2\uff09<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Elapsed<\/span> <span class=\"p\">+=<\/span> <span class=\"n\">TimerElapsedHandler<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u8ba2\u9605 Elapsed \u4e8b\u4ef6<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Interval<\/span> <span class=\"p\">=<\/span> <span class=\"m\">1000<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u8bbe\u7f6e\u95f4\u9694\u4e3a 1 \u79d2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Timer started. Press Enter to exit...&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadLine<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Stop<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Timer stopped and disposed.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">void<\/span> <span class=\"n\">TimerElapsedHandler<\/span><span class=\"p\">(<\/span><span class=\"kt\">object?<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">ElapsedEventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;Timer elapsed at {e.SignalTime}, thread id: {Environment.CurrentManagedThreadId}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u7a0d\u5fae\u63a2\u8ba8\u4e00\u4e0b\u8fd9\u4e2a\u8ba1\u65f6\u5668\u7684\u53e6\u5916\u4e00\u4e2a\u7279\u6027\u4e86\uff1a\u5982\u679c\u5b83\u7684\u56de\u8c03\u51fd\u6570\u6bd4\u8f83\u8017\u65f6\uff0c\u751a\u81f3\u8d85\u8fc7\u4e86\u5b83\u7684\u5468\u671f\uff0c\u4f1a\u600e\u4e48\u6837\uff1f<\/p>\n<p>\u7b54\u6848\u975e\u5e38\u7b80\u5355\uff1a\u8ba1\u65f6\u5668\u4f9d\u65e7\u4f1a\u6309\u7167\u8bbe\u5b9a\u7684\u5468\u671f\u7ee7\u7eed\u89e6\u53d1\u56de\u8c03\u51fd\u6570\uff0c\u867d\u7136\u770b\u8d77\u6765\uff08\u6bd4\u5982\u4ece\u63a7\u5236\u53f0\u7684\u8f93\u51fa\uff09\u53ef\u80fd\u4f1a\u8868\u73b0\u51fa\u5ef6\u8fdf\uff0c\u751a\u81f3\u53ef\u80fd\u56e0\u4e3a\u6bcf\u6b21\u56de\u8c03\u7684\u5ef6\u8fdf\u4e0d\u540c\u800c\u4f7f\u5f97\u8f93\u51fa\u987a\u5e8f\u53d8\u5f97\u6df7\u4e71\u3002\u8fd9\u4e5f\u5c31\u662f\u5b83\u4f7f\u7528\u7ebf\u7a0b\u6c60\u7684\u539f\u56e0\u4e4b\u4e00\uff1a\u5373\u4fbf\u4e0a\u4e00\u6b21\u56de\u8c03\u8fd8\u6ca1\u6709\u5b8c\u6210\uff0c\u5bfc\u81f4\u5b83\u6240\u5728\u7684\u7ebf\u7a0b\u4ecd\u5904\u4e8e\u963b\u585e\u72b6\u6001\uff0c\u4e0b\u4e00\u6b21\u56de\u8c03\u4f9d\u65e7\u53ef\u4ee5\u5728\u5176\u4ed6\u7ebf\u7a0b\u4e0a\u7ee7\u7eed\u6267\u884c\u3002<\/p>\n<div class=\"notice note\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-sticky-note\" aria-hidden=\"true\"><\/i>Note\n<\/div>\n<div class=\"notice-content\">\u8fd8\u6709\u4e00\u4e2a\u503c\u5f97\u6ce8\u610f\u7684\u70b9\uff1a\u5f53\u8ba1\u65f6\u5668\u505c\u6b62\uff08\u751a\u81f3\u91ca\u653e\uff09\u540e\uff0c\u4e4b\u524d\u6bcf\u6b21 <code>Elapsed<\/code> \u89e6\u53d1\u7684\u56de\u8c03\u5982\u679c\u8fd8\u6ca1\u6709\u6267\u884c\u5b8c\u6bd5\uff0c\u90a3\u4e48\u5c06\u4ecd\u4f1a\u5904\u4e8e\u6267\u884c\u72b6\u6001\uff0c\u5c24\u5176\u662f\u5b83\u4eec\u5185\u90e8\u6709\u8017\u65f6\u7684\u64cd\u4f5c\u65f6\u3002\u8fd9\u662f\u56e0\u4e3a\u8ba1\u65f6\u5668\u6bcf\u6b21\u89e6\u53d1\u65f6\uff0c\u90fd\u4f1a\u5c06\u56de\u8c03\u51fd\u6570\u653e\u5165\u7ebf\u7a0b\u6c60\u4e2d\u6267\u884c\uff0c\u800c\u7ebf\u7a0b\u6c60\u4e2d\u7684\u7ebf\u7a0b\u4f1a\u7ee7\u7eed\u6267\u884c\u8fd9\u4e9b\u4efb\u52a1\uff0c\u76f4\u5230\u5b83\u4eec\u5b8c\u6210\u3002<\/div>\n<\/div>\n<h2 id=\"systemthreadingperiodictimer\">\nSystem.Threading.PeriodicTimer\n<a href=\"#systemthreadingperiodictimer\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6e90\u4ee3\u7801\uff1a<a class=\"link\" href=\"https:\/\/source.dot.net\/#System.Private.CoreLib\/src\/libraries\/System.Private.CoreLib\/src\/System\/Threading\/PeriodicTimer.cs\" target=\"_blank\" rel=\"noopener\"\n>System.Threading.PeriodicTimer.cs<\/a><\/p>\n<p>\u8fd9\u662f\u4e00\u4e2a\u6bd4\u8f83\u65b0\u7684\u8ba1\u65f6\u5668\uff08.NET 6+\uff09\uff0c\u5b83\u4e0d\u4ec5\u73b0\u4ee3\uff0c\u800c\u4e14\u7cbe\u786e\uff0c\u8fd8\u652f\u6301\u5f02\u6b65\u64cd\u4f5c\u3002\u6b63\u5982\u5b83\u7684\u540d\u79f0\u6240\u63d0\u793a\u7684\uff0c\u5b83\u65e8\u5728\u63d0\u4f9b\u4e00\u4e2a\u5468\u671f\u6027\u7684\u8ba1\u65f6\u5668\uff0c\u5141\u8bb8\u6211\u4eec\u5728\u6bcf\u4e2a\u5468\u671f\u7ed3\u675f\u65f6\u6267\u884c\u4e00\u4e2a\u5f02\u6b65\u64cd\u4f5c\u3002\u5b83\u4e0e\u4f20\u7edf\u7684 <code>Timer<\/code> \u7c7b\u4e0d\u540c\uff0c\u4e0d\u4f7f\u7528\u4e8b\u4ef6\u6216\u56de\u8c03\uff0c\u800c\u662f\u901a\u8fc7 <code>await<\/code> \u4e00\u4e2a\u5f02\u6b65\u65b9\u6cd5\u6765\u63a7\u5236\u6bcf\u6b21\u64cd\u4f5c\u7684\u53d1\u751f\u3002<\/p>\n<p>\u5b83\u7684\u4f7f\u7528\u65b9\u5f0f\u4e5f\u975e\u5e38\u7b80\u5355\uff0c\u4e0b\u9762\u662f\u4e00\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Threading<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">timer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">PeriodicTimer<\/span><span class=\"p\">(<\/span><span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">));<\/span> <span class=\"c1\">\/\/ \u521b\u5efa\u4e00\u4e2a\u5468\u671f\u4e3a 1 \u79d2\u7684\u8ba1\u65f6\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">cts<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">CancellationTokenSource<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">token<\/span> <span class=\"p\">=<\/span> <span class=\"n\">cts<\/span><span class=\"p\">.<\/span><span class=\"n\">Token<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">try<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"k\">await<\/span> <span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">WaitForNextTickAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">token<\/span><span class=\"p\">.<\/span><span class=\"n\">ThrowIfCancellationRequested<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;Periodic timer tick at {DateTime.Now}, thread id: {Environment.CurrentManagedThreadId}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">OperationCanceledException<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Periodic timer canceled.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">finally<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">cts<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u8ba1\u65f6\u5668\u8fd8\u6709\u4e00\u4e2a\u5e38\u89c1\u7684\u4f7f\u7528\u60c5\u5f62\uff0c\u5c31\u662f\u5728 ASP.NET Core \u4e2d\u501f\u52a9\u5b83\u6765\u521b\u5efa\u4e00\u4e2a\u540e\u53f0\u7684\u5b9a\u65f6\u4efb\u52a1\u3002\u56e0\u4e3a\u5b83\u4e0d\u4ec5\u51c6\u65f6\uff0c\u800c\u4e14\u652f\u6301\u5f02\u6b65\u64cd\u4f5c\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span> <span class=\"p\">:<\/span> <span class=\"n\">BackgroundService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ILogger<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">MyService<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">logger<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">PeriodicTimer<\/span> <span class=\"n\">timer<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MyService<\/span><span class=\"p\">(<\/span><span class=\"n\">ILogger<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">MyService<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">logger<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">logger<\/span> <span class=\"p\">=<\/span> <span class=\"n\">logger<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">timer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromMilliseconds<\/span><span class=\"p\">(<\/span><span class=\"m\">1000<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">protected<\/span> <span class=\"kd\">override<\/span> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">ExecuteAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">CancellationToken<\/span> <span class=\"n\">stoppingToken<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"k\">await<\/span> <span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">WaitForNextTickAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">stoppingToken<\/span><span class=\"p\">)<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"p\">!<\/span><span class=\"n\">stoppingToken<\/span><span class=\"p\">.<\/span><span class=\"n\">IsCancellationRequested<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">LogInformation<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Hello, world!&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u5165\u53e3\u5904\u6ce8\u518c\u8fd9\u4e2a\u670d\u52a1\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddHostedService<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">MyService<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u5373\u4fbf\u6bcf\u6b21\u5faa\u73af\u4f53\u4e2d\u7684\u64cd\u4f5c\u6bd4\u8f83\u8017\u65f6\uff0c\u5b83\u4ecd\u7136\u53ef\u4ee5\u4fdd\u8bc1\u6bcf\u6b21\u89e6\u53d1\u7684\u65f6\u95f4\u662f\u51c6\u786e\u7684\u3002\u5b83\u7edd\u5bf9\u6bd4\u5728\u5faa\u73af\u4e2d\u4f7f\u7528 <code>await Task.Delay()<\/code> \u8981\u51c6\u786e\u5f97\u591a\u3002<\/p>\n<h2 id=\"systemwindowsthreadingdispatchertimer\">\nSystem.Windows.Threading.DispatcherTimer\n<a href=\"#systemwindowsthreadingdispatchertimer\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6e90\u4ee3\u7801\uff1a<a class=\"link\" href=\"https:\/\/github.com\/dotnet\/wpf\/blob\/main\/src\/Microsoft.DotNet.Wpf\/src\/WindowsBase\/System\/Windows\/Threading\/DispatcherTimer.cs\" target=\"_blank\" rel=\"noopener\"\n>DispatcherTimer.cs<\/a><\/p>\n<p>\u6700\u540e\u6211\u4eec\u518d\u6765\u7b80\u5355\u5730\u770b\u4e00\u4e0b\u9002\u7528\u4e8e WPF \u7684 <code>DispatcherTimer<\/code>\u3002\u770b\u5230 <code>Dispatcher<\/code> \u8fd9\u4e2a\u8bcd\uff0c\u6211\u4eec\u5f88\u5bb9\u6613\u8054\u60f3\u5230\u8bf8\u5982 <code>Application.Current.Dispatcher<\/code>\uff0c\u6240\u4ee5\u5b83\u4e3b\u8981\u7528\u4e8e\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\u64cd\u4f5c\u3002\u5b83\u7684\u4f7f\u7528\u65b9\u5f0f\u4e0e <code>System.Timers.Timer<\/code> \u7c7b\u4f3c\uff0c\u4e5f\u63d0\u4f9b\u4e86 <code>Start<\/code>\u3001<code>Stop<\/code> \u7b49\u65b9\u6cd5\uff0c\u4ee5\u53ca <code>Interval<\/code> \u5c5e\u6027\u548c <code>Tick<\/code> \u4e8b\u4ef6\u7b49\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Windows.Threading<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainWindow<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Window<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">DispatcherTimer<\/span> <span class=\"n\">timer<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainWindow<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">InitializeComponent<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">timer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">DispatcherTimer<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Interval<\/span> <span class=\"p\">=<\/span> <span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Tick<\/span> <span class=\"p\">+=<\/span> <span class=\"n\">Timer_Tick<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Timer_Tick<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">EventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">listBox<\/span><span class=\"p\">.<\/span><span class=\"n\">Items<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;Dispatcher timer tick at {DateTime.Now}, thread id: {Environment.CurrentManagedThreadId}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p><code>DispatcherTimer<\/code> \u6709\u51e0\u4e2a\u6784\u9020\u51fd\u6570\uff0c\u53ef\u4ee5\u6307\u5b9a\u5b83\u7684\u4f18\u5148\u7ea7\u4ee5\u53ca\u6240\u4f7f\u7528\u7684 <code>Dispatcher<\/code>\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u5b83\u4f1a\u4f7f\u7528 <code>DispatcherPriority.Background<\/code> \u4ee5\u53ca <code>Dispatcher.Current<\/code>\u3002\u53ea\u8981\u4f60\u5728 UI \u7ebf\u7a0b\u4e0a\u521b\u5efa\u5b83\uff0c\u5b83\u5c31\u4f1a\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\u56de\u8c03\u51fd\u6570\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86 .NET \u4e2d\u5e38\u7528\u7684\u51e0\u79cd\u8ba1\u65f6\u5668\uff0c\u5305\u62ec\u5b83\u4eec\u5404\u81ea\u7684\u529f\u80fd\u548c\u7279\u70b9\uff0c\u4ee5\u53ca\u6240\u9002\u5408\u7684\u573a\u666f\u3002\u7b80\u5355\u6765\u8bf4\uff1a<\/p>\n<ul>\n<li><code>System.Threading.Timer<\/code> \u662f\u6700\u8f7b\u91cf\u7684\u8ba1\u65f6\u5668\uff0c\u9002\u7528\u4e8e\u5927\u591a\u6570\u975e UI \u7ebf\u7a0b\u7684\u573a\u666f\uff0c\u4f46\u56e0\u4e3a\u7f3a\u5c11\u7075\u6d3b\u7684\u63a7\u5236\u65b9\u6cd5\u548c\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\uff0c\u53ef\u80fd\u9700\u8981\u4e00\u4e9b\u989d\u5916\u7684\u5904\u7406\uff1b<\/li>\n<li><code>System.Timers.Timer<\/code> \u63d0\u4f9b\u4e86\u66f4\u6613\u7528\u7684 API \u548c\u66f4\u591a\u7684\u529f\u80fd\uff0c\u9002\u7528\u4e8e\u5927\u591a\u6570\u9700\u8981\u5b9a\u65f6\u64cd\u4f5c\u7684\u573a\u666f\uff1b<\/li>\n<li><code>System.Threading.PeriodicTimer<\/code> \u662f\u4e00\u4e2a\u73b0\u4ee3\u7684\u8ba1\u65f6\u5668\uff0c\u652f\u6301\u5f02\u6b65\u64cd\u4f5c\uff0c\u9002\u7528\u4e8e\u9700\u8981\u7cbe\u786e\u63a7\u5236\u5468\u671f\u6027\u64cd\u4f5c\u7684\u573a\u666f\uff0c\u4ee5\u53ca\u5f02\u6b65\u7f16\u7a0b\uff1b<\/li>\n<li><code>DispatcherTimer<\/code> \u9002\u7528\u4e8e WPF\uff0c\u80fd\u591f\u5728 UI \u7ebf\u7a0b\u4e0a\u6267\u884c\u64cd\u4f5c\uff0c\u9002\u5408\u9700\u8981\u4e0e UI \u4ea4\u4e92\u7684\u573a\u666f\u3002<\/li>\n<\/ul>\n<p>\u5e0c\u671b\u8fd9\u7bc7\u6587\u7ae0\u80fd\u5e2e\u52a9\u4f60\u66f4\u597d\u5730\u7406\u89e3 .NET \u4e2d\u7684\u8ba1\u65f6\u5668\uff0c\u5e76\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\u9009\u62e9\u5408\u9002\u7684\u8ba1\u65f6\u5668\u6765\u6ee1\u8db3\u4f60\u7684\u9700\u6c42\u3002\u5982\u679c\u4f60\u6709\u4efb\u4f55\u95ee\u9898\u6216\u5efa\u8bae\uff0c\u6b22\u8fce\u5728\u8bc4\u8bba\u533a\u7559\u8a00\u8ba8\u8bba\uff01<\/p>"},{"title":"\u5e38\u89c1\u4e0e\u4e0d\u5e38\u89c1\u54c8\u5e0c\u51fd\u6570","link":"https:\/\/blog.coldwind.top\/posts\/some-other-hash-functions\/","pubDate":"Mon, 30 Jun 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/some-other-hash-functions\/","description":"<p>\u5728 <a class=\"link\" href=\"..\/why-password-hash-with-salt\" >\u524d\u9762\u7684\u6587\u7ae0<\/a> \u4e2d\uff0c\u6211\u4eec\u5df2\u7ecf\u63a2\u8ba8\u4e86\u6709\u5173\u5bc6\u7801\u52a0\u76d0\u54c8\u5e0c\u7684\u8bdd\u9898\u3002\u8fd9\u6b21\u6211\u4eec\u56f4\u7ed5\u7740\u54c8\u5e0c\u51fd\u6570\u518d\u505a\u4e00\u4e9b\u8865\u5145\u3002<\/p>\n<p>\u54c8\u5e0c\u51fd\u6570\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u548c\u5bc6\u7801\u5b66\u4e2d\u975e\u5e38\u91cd\u8981\u7684\u5de5\u5177\u3002\u5b83\u4eec\u7528\u4e8e\u6570\u636e\u5b8c\u6574\u6027\u9a8c\u8bc1\u3001\u6570\u5b57\u7b7e\u540d\u3001\u5bc6\u7801\u5b58\u50a8\u7b49\u591a\u4e2a\u9886\u57df\u3002\u54c8\u5e0c\u51fd\u6570\u7684\u79cd\u7c7b\u6709\u5f88\u591a\uff0c\u5b83\u4eec\u6709\u7684\u662f\u5e38\u89c1\u7684\uff0c\u6709\u7684\u5219\u76f8\u5bf9\u4e0d\u90a3\u4e48\u5e38\u7528\u3002\u672c\u6587\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u5e38\u89c1\u548c\u4e0d\u5e38\u89c1\u7684\u54c8\u5e0c\u51fd\u6570\uff0c\u4ee5\u53ca\u5b83\u4eec\u7684\u7279\u70b9\u548c\u5e94\u7528\u573a\u666f\u3002<\/p>\n<h2 id=\"\u65e9\u671f\u54c8\u5e0c\u51fd\u6570\">\n\u65e9\u671f\u54c8\u5e0c\u51fd\u6570\n<a href=\"#%e6%97%a9%e6%9c%9f%e5%93%88%e5%b8%8c%e5%87%bd%e6%95%b0\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8bf4\u8d77\u65e9\u671f\u7684\u54c8\u5e0c\u51fd\u6570\uff0cMD5 \u548c SHA-1 \u662f\u6700\u5e7f\u4e3a\u4eba\u77e5\u7684\u3002\u5f53\u7136\uff0c\u5728\u5b83\u4eec\u4e4b\u524d\u8fd8\u6709\u66f4\u65e9\u7684\uff0c\u6bd4\u5982 MD4 \u548c SHA-0\uff0c\u4f46\u5b83\u4eec\u65e9\u5df2\u4e0d\u518d\u88ab\u5e7f\u6cdb\u4f7f\u7528\u3002MD5 \u548c SHA-1 \u5728 1990 \u5e74\u4ee3\u548c\u672c\u4e16\u7eaa\u521d\u671f\u975e\u5e38\u6d41\u884c\uff0c\u5e7f\u6cdb\u5e94\u7528\u4e8e\u6587\u4ef6\u5b8c\u6574\u6027\u6821\u9a8c\u3001\u6570\u5b57\u7b7e\u540d\u7b49\u573a\u666f\u3002<\/p>\n<p>\u5b83\u4eec\u867d\u7136\u66fe\u88ab\u5e7f\u6cdb\u4f7f\u7528\uff0c\u4f46\u7531\u4e8e\u5b89\u5168\u6027\u95ee\u9898\uff0c\u73b0\u5728\u5df2\u4e0d\u518d\u63a8\u8350\u7528\u4e8e\u5b89\u5168\u654f\u611f\u7684\u5e94\u7528\u3002\u5c3d\u7ba1\u5982\u6b64\uff0c\u5b83\u4eec\u4ecd\u7136\u975e\u5e38\u6d41\u884c\uff0c\u6bd4\u5982\u8bb8\u591a\u8f6f\u4ef6\u4e0b\u8f7d\u7b49\u573a\u666f\u90fd\u4f1a\u63d0\u4f9b\u6587\u4ef6\u7684 MD5 \u6216 SHA-1 \u6821\u9a8c\u548c\uff0c\u4ee5\u65b9\u4fbf\u7528\u6237\u9a8c\u8bc1\u4e0b\u8f7d\u7684\u6587\u4ef6\u662f\u5426\u5b8c\u6574\u3002\u6240\u4ee5\uff0c\u5373\u4fbf\u4e00\u4e2a\u6280\u672f\u6709\u7f3a\u70b9\uff08\u751a\u81f3\u6709\u4e25\u91cd\u6f0f\u6d1e\uff09\uff0c\u53ea\u8981\u5b83\u8db3\u591f\u6d41\u884c\uff0c\u4ecd\u7136\u4f1a\u88ab\u5e7f\u6cdb\u4f7f\u7528\u3002\u5c31\u50cf JPG \u56fe\u7247\u683c\u5f0f\u4e00\u6837\uff0c\u867d\u7136\u5b83\u6709\u5f88\u591a\u7f3a\u70b9\uff08\u6bd4\u5982\u4e0d\u652f\u6301\u900f\u660e\u5ea6\u3001\u4e0d\u652f\u6301\u65e0\u635f\u538b\u7f29\u3001\u5bb9\u6613\u51fa\u73b0\u4f2a\u5f71\u7b49\uff09\uff0c\u4f46\u5b83\u4ecd\u7136\u662f\u6700\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u4e4b\u4e00\u3002<\/p>\n<p>\u90a3\u4e48\u5b83\u4eec\u5230\u5e95\u6709\u4ec0\u4e48\u5b89\u5168\u6027\u95ee\u9898\u5462\uff1f\u7b80\u5355\u6765\u8bf4\uff0cMD5 \u548c SHA-1 \u90fd\u5b58\u5728\u78b0\u649e\u653b\u51fb\u7684\u98ce\u9669\u3002\u78b0\u649e\u653b\u51fb\u662f\u6307\u4e24\u4e2a\u4e0d\u540c\u7684\u8f93\u5165\u6570\u636e\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u5904\u7406\u540e\uff0c\u5f97\u5230\u76f8\u540c\u7684\u54c8\u5e0c\u503c\u3002\u8fd9\u610f\u5473\u7740\u653b\u51fb\u8005\u6709\u53ef\u80fd\u6784\u9020\u4e00\u4e2a\u6076\u610f\u6587\u4ef6\uff0c\u4f7f\u5176\u54c8\u5e0c\u503c\u4e0e\u5408\u6cd5\u6587\u4ef6\u76f8\u540c\uff0c\u4ece\u800c\u7ed5\u8fc7\u5b8c\u6574\u6027\u9a8c\u8bc1\u3002<\/p>\n<p>\u5c31\u62ff\u4e0a\u9762\u63d0\u5230\u7684\u9a8c\u8bc1\u4e0b\u8f7d\u6587\u4ef6\u7684\u5b8c\u6574\u6027\u6765\u8bf4\u3002\u6bd4\u5982\u7f51\u7ad9\u544a\u8bc9\u4f60\uff0c\u8be5\u6587\u4ef6\u7684\u54c8\u5e0c\u503c\u662f <code>d41d<\/code>\uff08\u8fd9\u91cc\u4e3a\u65b9\u4fbf\u8d77\u89c1\uff0c\u4ec5\u4f7f\u7528\u524d 4 \u4f4d\uff09\u3002\u7136\u540e\u4f60\u4e0b\u8f7d\u4e86\u4e00\u4e2a\u6587\u4ef6\uff0c\u8ba1\u7b97\u51fa\u6765\u7684\u54c8\u5e0c\u503c\u4e5f\u662f\u8fd9\u4e2a\u3002\u4e00\u822c\u6765\u8bf4\uff0c\u4f60\u53ef\u4ee5\u786e\u5b9a\u8fd9\u4e2a\u6587\u4ef6\u6ca1\u6709\u88ab\u7be1\u6539\uff0c\u4ece\u800c\u53ef\u4ee5\u653e\u5fc3\u4f7f\u7528\u3002\u4f46\u662f\u9ed1\u5ba2\u53ef\u4ee5\u6784\u9020\u4e00\u4e2a\u54c8\u5e0c\u503c\u540c\u6837\u662f <code>d41d<\/code> \u7684\u6076\u610f\u6587\u4ef6\uff0c\u5e76\u501f\u52a9\u4e00\u4e9b\u624b\u6bb5\u5411\u4f60\u63d0\u4f9b\u8fd9\u4e2a\u6587\u4ef6\u3002\u4f60\u4e0b\u8f7d\u540e\uff0c\u5c31\u4f1a\u8bef\u4ee5\u4e3a\u8fd9\u4e2a\u6587\u4ef6\u662f\u5b89\u5168\u7684\uff0c\u6700\u7ec8\u8fd0\u884c\u4e86\u75c5\u6bd2\u7a0b\u5e8f\u3002\u9664\u4e86\u75c5\u6bd2\u7a0b\u5e8f\uff0c\u8fd8\u53ef\u80fd\u662f\u4f2a\u9020\u7684\u8bc1\u4e66\u6587\u4ef6\u7b49\u3002\u8fd9\u4e9b\u90fd\u53ef\u80fd\u5e26\u6765\u4e25\u91cd\u7684\u540e\u679c\u3002<\/p>\n<p>\u5373\u4fbf\u5982\u6b64\uff0c\u78b0\u649e\u653b\u51fb\u4f9d\u65e7\u662f\u6210\u672c\u5de8\u5927\u7684\u3002\u518d\u52a0\u4e0a MD5 \u7684\u5e7f\u6cdb\u9002\u914d\u6027\u4ee5\u53ca\u9ad8\u6548\u7684\u8ba1\u7b97\u901f\u5ea6\uff0c\u4f7f\u5f97\u5b83\u5728\u5f88\u591a\u573a\u666f\u4e0b\u4ecd\u7136\u88ab\u4f7f\u7528\u3002\u6bd4\u5982\u5728\u4e00\u4e9b\u975e\u5b89\u5168\u654f\u611f\u7684\u5e94\u7528\u4e2d\uff0cMD5 \u4ecd\u7136\u88ab\u7528\u6765\u5feb\u901f\u8ba1\u7b97\u6587\u4ef6\u7684\u54c8\u5e0c\u503c\uff0c\u4ee5\u4fbf\u8fdb\u884c\u5b8c\u6574\u6027\u6821\u9a8c\u3002<\/p>\n<p>\u8bf4\u8d77\u54c8\u5e0c\u78b0\u649e\uff0c\u8fd9\u91cc\u8fd8\u6709\u4e00\u4e2a\u6709\u8da3\u7684\u4f8b\u5b50\u3002\u5728 2017 \u5e74\uff0c\u8c37\u6b4c\u7684\u7814\u7a76\u4eba\u5458\u5236\u4f5c\u4e86\u4e0b\u9762\u8fd9\u5f20 GIF \u52a8\u56fe\u3002\u8fd9\u5f20\u52a8\u56fe\u795e\u5947\u7684\u5730\u65b9\u5728\u4e8e\uff0c\u5b83\u53ef\u4ee5\u5c55\u793a\u81ea\u5df1\u7684 MD5 \u503c\uff01<\/p>\n<p><img src=\"https:\/\/www.bleepstatic.com\/images\/news\/u\/1164866\/2022\/sep-2022\/md5-image\/md5.gif\"\nloading=\"lazy\"\nalt=\"Hashquines: files containing their own checksums\"\n><\/p>\n<p>\u66f4\u591a\u6709\u610f\u601d\u7684\u4f8b\u5b50\u53ef\u4ee5\u770b\u770b <a class=\"link\" href=\"https:\/\/www.bleepingcomputer.com\/news\/security\/this-image-shows-its-own-md5-checksum-and-its-kind-of-a-big-deal\/\" target=\"_blank\" rel=\"noopener\"\n>\u8fd9\u7bc7\u6587\u7ae0<\/a>\u3002<\/p>\n<h2 id=\"sha-2-\u7cfb\u5217\">\nSHA-2 \u7cfb\u5217\n<a href=\"#sha-2-%e7%b3%bb%e5%88%97\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u56e0\u4e3a MD5 \u548c SHA-1 \u7684\u5b89\u5168\u6027\u95ee\u9898\uff0cSHA-2 \u7cfb\u5217\uff08\u5305\u62ec SHA-256\u3001SHA-384\u3001SHA-512 \u7b49\uff09\u6210\u4e3a\u4e86\u65b0\u7684\u6807\u51c6\u3002SHA-2 \u7cfb\u5217\u7684\u54c8\u5e0c\u51fd\u6570\u5728\u8bbe\u8ba1\u4e0a\u66f4\u4e3a\u590d\u6742\uff0c\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u5b89\u5168\u6027\u3002\u5b83\u4eec\u88ab\u5e7f\u6cdb\u5e94\u7528\u4e8e\u6570\u5b57\u7b7e\u540d\u3001\u8bc1\u4e66\u9881\u53d1\u673a\u6784\uff08CA\uff09\u7b49\u9886\u57df\u3002<\/p>\n<p>\u4e00\u822c\u6765\u8bf4\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\u5c06\u5b83\u7528\u4e8e\u6570\u636e\u5e93\u4e2d\u5b58\u50a8\u7528\u6237\u7684\u5bc6\u7801\uff0c\u90a3\u4e48\u901a\u5e38\u8fd8\u4f1a\u7ed9\u5b83\u52a0\u4e0a\u4e00\u4e2a\u968f\u673a\u7684\u76d0\u503c\uff08salt\uff09\uff0c\u8fd9\u6837\u53ef\u4ee5\u9632\u6b62\u5f69\u8679\u8868\u653b\u51fb\u3002\u5f69\u8679\u8868\u653b\u51fb\u662f\u6307\u653b\u51fb\u8005\u9884\u5148\u8ba1\u7b97\u51fa\u5927\u91cf\u5e38\u89c1\u5bc6\u7801\u7684\u54c8\u5e0c\u503c\uff0c\u5e76\u5b58\u50a8\u5728\u4e00\u4e2a\u8868\u4e2d\u3002\u5f53\u653b\u51fb\u8005\u83b7\u53d6\u5230\u54c8\u5e0c\u503c\u540e\uff0c\u53ef\u4ee5\u901a\u8fc7\u67e5\u627e\u8fd9\u4e2a\u8868\u6765\u5feb\u901f\u7834\u89e3\u5bc6\u7801\u3002\u901a\u8fc7\u6dfb\u52a0\u76d0\u503c\uff0c\u5373\u4f7f\u4e24\u4e2a\u7528\u6237\u7684\u5bc6\u7801\u76f8\u540c\uff0c\u5b83\u4eec\u7684\u54c8\u5e0c\u503c\u4e5f\u4f1a\u4e0d\u540c\uff0c\u4ece\u800c\u589e\u52a0\u4e86\u7834\u89e3\u7684\u96be\u5ea6\u3002<\/p>\n<p>\u4ee5 C# \u4e3a\u4f8b\uff0c\u4f7f\u7528 SHA-256 \u54c8\u5e0c\u51fd\u6570\u548c\u76d0\u503c\u6765\u5b58\u50a8\u5bc6\u7801\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Text<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Security.Cryptography<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">GenerateSalt<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">rng<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">RNGCryptoServiceProvider<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">salt<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[<\/span><span class=\"m\">16<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">rng<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"n\">salt<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">salt<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u4e0a\u9762\u7684\u65b9\u6cd5\u4f1a\u63d0\u793a\u5df2\u8fc7\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u7684\u65b9\u5f0f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ return RandomNumberGenerator.GetBytes(16);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">HashPassword<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">salt<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">sha256<\/span> <span class=\"p\">=<\/span> <span class=\"n\">SHA256<\/span><span class=\"p\">.<\/span><span class=\"n\">Create<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">passwordBytes<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Encoding<\/span><span class=\"p\">.<\/span><span class=\"n\">UTF8<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">saltedPassword<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[<\/span><span class=\"n\">passwordBytes<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span> <span class=\"p\">+<\/span> <span class=\"n\">salt<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Buffer<\/span><span class=\"p\">.<\/span><span class=\"n\">BlockCopy<\/span><span class=\"p\">(<\/span><span class=\"n\">passwordBytes<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">saltedPassword<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">passwordBytes<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Buffer<\/span><span class=\"p\">.<\/span><span class=\"n\">BlockCopy<\/span><span class=\"p\">(<\/span><span class=\"n\">salt<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">saltedPassword<\/span><span class=\"p\">,<\/span> <span class=\"n\">passwordBytes<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">,<\/span> <span class=\"n\">salt<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">sha256<\/span><span class=\"p\">.<\/span><span class=\"n\">ComputeHash<\/span><span class=\"p\">(<\/span><span class=\"n\">saltedPassword<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u65b0\u7248\u672c\u8fd8\u63d0\u4f9b\u4e86\u66f4\u7b80\u4fbf\u7684\u9759\u6001\u65b9\u6cd5\uff0c\u6bd4\u5982 SHA256.HashData<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u5c06\u52a0\u76d0\u54c8\u5e0c\u540e\u7684\u5bc6\u7801\u4e0e\u76d0\u503c\u4e00\u8d77\u5b58\u50a8\u5230\u6570\u636e\u5e93\u4e2d\u5c31\u53ef\u4ee5\u4e86\u3002\u9700\u8981\u9a8c\u8bc1\u5bc6\u7801\u65f6\uff0c\u5148\u4ece\u6570\u636e\u5e93\u4e2d\u83b7\u53d6\u76d0\u503c\uff0c\u7136\u540e\u4f7f\u7528\u76f8\u540c\u7684\u54c8\u5e0c\u51fd\u6570\u548c\u76d0\u503c\u5bf9\u8f93\u5165\u7684\u5bc6\u7801\u8fdb\u884c\u54c8\u5e0c\uff0c\u518d\u4e0e\u5b58\u50a8\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u5373\u53ef\u3002<\/p>\n<p>\u4e0d\u5fc5\u62c5\u5fc3\u76d0\u503c\u6cc4\u9732\u7684\u95ee\u9898\uff0c\u56e0\u4e3a\u5373\u4f7f\u653b\u51fb\u8005\u83b7\u53d6\u4e86\u76d0\u503c\uff0c\u4e5f\u65e0\u6cd5\u76f4\u63a5\u7834\u89e3\u5bc6\u7801\u3002\u76d0\u503c\u7684\u4f5c\u7528\u662f\u589e\u52a0\u54c8\u5e0c\u503c\u7684\u552f\u4e00\u6027\u548c\u590d\u6742\u6027\uff0c\u4f7f\u5f97\u653b\u51fb\u8005\u65e0\u6cd5\u4f7f\u7528\u9884\u5148\u8ba1\u7b97\u7684\u5f69\u8679\u8868\u6765\u7834\u89e3\u5bc6\u7801\u3002<\/p>\n<h2 id=\"sha-3-\u7cfb\u5217\">\nSHA-3 \u7cfb\u5217\n<a href=\"#sha-3-%e7%b3%bb%e5%88%97\" class=\"anchor\">&para;<\/a>\n<\/h2><p>SHA-2 \u7cfb\u5217\u867d\u7136\u89e3\u51b3\u4e86 MD5 \u548c SHA-1 \u7684\u5b89\u5168\u6027\u95ee\u9898\uff0c\u4f46\u5b83\u4ecd\u7136\u662f\u57fa\u4e8e\u4e0e\u524d\u4ee3\u76f8\u540c\u7684\u67b6\u6784\uff08Merkle-Damg\u00e5rd\uff09\u3002\u79d1\u5b66\u5bb6\u62c5\u5fc3\u4e4b\u524d\u7684\u78b0\u649e\u65b9\u5f0f\u7ee7\u7eed\u53d1\u5c55\u548c\u7814\u7a76\u4e0b\u53bb\u6709\u53ef\u80fd\u7834\u89e3 SHA-2 \u7cfb\u5217\uff0c\u5e76\u4e14\u968f\u7740\u91cf\u5b50\u8ba1\u7b97\u7684\u53d1\u5c55\uff0cSHA-2 \u7cfb\u5217\u7684\u5b89\u5168\u6027\u4e5f\u53ef\u80fd\u53d7\u5230\u5a01\u80c1\u3002\u56e0\u6b64\uff0cNIST\uff08\u7f8e\u56fd\u56fd\u5bb6\u6807\u51c6\u4e0e\u6280\u672f\u7814\u7a76\u9662\uff09\u5728 2015 \u5e74\u53d1\u5e03\u4e86 SHA-3 \u7cfb\u5217\u3002<\/p>\n<p>SHA-3 \u7cfb\u5217\u91c7\u7528\u4e86\u5168\u65b0\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u57fa\u4e8e Keccak \u7b97\u6cd5\u3002\u5b83\u4e0d\u4ec5\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u5b89\u5168\u6027\uff0c\u8fd8\u53ef\u4ee5\u6839\u636e\u9700\u8981\u9009\u62e9\u4e0d\u540c\u7684\u8f93\u51fa\u957f\u5ea6\uff08\u5982 SHA3-224\u3001SHA3-256\u3001SHA3-384\u3001SHA3-512 \u7b49\uff09\u3002<\/p>\n<p>\u4e0d\u8fc7 SHA-3 \u7cfb\u5217\u76ee\u524d\u7684\u5e94\u7528\u5e76\u4e0d\u7b97\u5e7f\u6cdb\uff0c\u5b83\u66f4\u591a\u7684\u662f\u4f5c\u4e3a SHA-2 \u7684\u4e00\u4e2a\u5907\u9009\uff0c\u4ee5\u4fbf\u672a\u6765\u5728 SHA-2 \u7cfb\u5217\u88ab\u7834\u89e3\u65f6\u53ef\u4ee5\u8fc5\u901f\u5207\u6362\u5230\u66f4\u5b89\u5168\u7684\u54c8\u5e0c\u51fd\u6570\u3002\u6b64\u5916\uff0c\u867d\u7136\u5b83\u63d0\u4f9b\u4e86\u66f4\u597d\u7684\u5b89\u5168\u6027\u548c\u7075\u6d3b\u6027\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u7684\u573a\u666f\u4e0b\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u5176\u4ed6\u7684\u4e00\u4e9b\u66f4\u64c5\u957f\u67d0\u4e00\u65b9\u9762\u7684\u65b9\u6cd5\u3002<\/p>\n<h2 id=\"pbkdf2\">\nPBKDF2\n<a href=\"#pbkdf2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 SHA-2 \u7684\u57fa\u7840\u4e0a\uff0c\u4e3a\u4e86\u8fdb\u4e00\u6b65\u63d0\u9ad8\u7834\u89e3\u7684\u96be\u5ea6\uff0c\u9664\u4e86\u5f15\u5165\u76d0\u503c\u5916\uff0c\u901a\u5e38\u8fd8\u4f1a\u5f15\u5165\u8fed\u4ee3\u6b21\u6570\u3002PBKDF2\uff08Password-Based Key Derivation Function 2\uff09\u5c31\u662f\u4e00\u4e2a\u5e38\u7528\u7684\u5bc6\u7801\u54c8\u5e0c\u51fd\u6570\uff0c\u5b83\u901a\u8fc7\u591a\u6b21\u8fed\u4ee3\u54c8\u5e0c\u8ba1\u7b97\u6765\u589e\u52a0\u7834\u89e3\u7684\u96be\u5ea6\u3002<\/p>\n<p>PBKDF2 \u7684\u5de5\u4f5c\u539f\u7406\u662f\u5c06\u5bc6\u7801\u548c\u76d0\u503c\u4f5c\u4e3a\u8f93\u5165\uff0c\u7ecf\u8fc7\u591a\u6b21\u8fed\u4ee3\u7684\u54c8\u5e0c\u8ba1\u7b97\uff0c\u751f\u6210\u4e00\u4e2a\u56fa\u5b9a\u957f\u5ea6\u7684\u8f93\u51fa\u3002\u8fed\u4ee3\u6b21\u6570\u8d8a\u591a\uff0c\u7834\u89e3\u7684\u96be\u5ea6\u5c31\u8d8a\u5927\u3002PBKDF2 \u901a\u5e38\u7528\u4e8e\u5bc6\u7801\u5b58\u50a8\u548c\u5bc6\u94a5\u6d3e\u751f\u3002<\/p>\n<p>\u5728 C# \u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>Rfc2898DeriveBytes<\/code> \u7c7b\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Security.Cryptography<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Text<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">HashPasswordWithPBKDF2<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">salt<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">iterations<\/span> <span class=\"p\">=<\/span> <span class=\"m\">10000<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">pbkdf2<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Rfc2898DeriveBytes<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"n\">salt<\/span><span class=\"p\">,<\/span> <span class=\"n\">iterations<\/span><span class=\"p\">,<\/span> <span class=\"n\">HashAlgorithmName<\/span><span class=\"p\">.<\/span><span class=\"n\">SHA256<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">pbkdf2<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"m\">32<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u751f\u6210 32 \u5b57\u8282\u7684\u54c8\u5e0c\u503c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"bcrypt-\u4e0e-argon2\">\nbcrypt \u4e0e Argon2\n<a href=\"#bcrypt-%e4%b8%8e-argon2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u53ef\u60dc\u7684\u662f\uff0cPBKDF2 \u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u53ef\u80fd\u4e0d\u591f\u5b89\u5168\uff0c\u5c24\u5176\u662f\u9762\u5bf9\u73b0\u4ee3\u786c\u4ef6\u7684\u653b\u51fb\uff08\u6bd4\u5982 GPU \u8d85\u5f3a\u7684\u5e76\u884c\u8ba1\u7b97\u80fd\u529b\uff09\u3002\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u51fa\u73b0\u4e86 bcrypt \u548c Argon2 \u7b49\u66f4\u5b89\u5168\u7684\u5bc6\u7801\u54c8\u5e0c\u51fd\u6570\u3002<\/p>\n<p>bcrypt \u662f\u57fa\u4e8e Blowfish \u52a0\u5bc6\u7b97\u6cd5\u7684\u5bc6\u7801\u54c8\u5e0c\u51fd\u6570\uff0c\u5b83\u901a\u8fc7\u589e\u52a0\u8ba1\u7b97\u590d\u6742\u5ea6\u6765\u63d0\u9ad8\u7834\u89e3\u96be\u5ea6\u3002bcrypt \u7684\u4e00\u4e2a\u91cd\u8981\u7279\u6027\u662f\u5b83\u53ef\u4ee5\u8c03\u6574\u5de5\u4f5c\u56e0\u5b50\uff08cost factor\uff09\uff0c\u4ece\u800c\u63a7\u5236\u54c8\u5e0c\u8ba1\u7b97\u7684\u65f6\u95f4\u548c\u8d44\u6e90\u6d88\u8017\u3002\u5de5\u4f5c\u56e0\u5b50\u8d8a\u9ad8\uff0c\u7834\u89e3\u7684\u96be\u5ea6\u5c31\u8d8a\u5927\u3002\u4e0e\u8fed\u4ee3\u6b21\u6570\u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u4e2a\u5de5\u4f5c\u56e0\u5b50\u662f\u6307\u6570\u7ea7\u589e\u957f\u7684\uff0c\u8fd9\u610f\u5473\u7740\u6bcf\u589e\u52a0\u4e00\u4e2a\u5355\u4f4d\u7684\u5de5\u4f5c\u56e0\u5b50\uff0c\u8ba1\u7b97\u65f6\u95f4\u5c31\u4f1a\u7ffb\u500d\u3002\u5728 C# \u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>BCrypt.Net-Next<\/code> \u7b49\u5e93\u6765\u5b9e\u73b0 bcrypt\u3002<\/p>\n<p>Argon2 \u662f 2015 \u5e74\u5bc6\u7801\u5b66\u7ade\u8d5b\u7684\u83b7\u80dc\u8005\uff0c\u5b83\u88ab\u8ba4\u4e3a\u662f\u76ee\u524d\u6700\u5b89\u5168\u7684\u5bc6\u7801\u54c8\u5e0c\u51fd\u6570\u4e4b\u4e00\u3002Argon2 \u5177\u6709\u9ad8\u5ea6\u7684\u53ef\u914d\u7f6e\u6027\uff0c\u53ef\u4ee5\u8c03\u6574\u5185\u5b58\u4f7f\u7528\u91cf\u3001\u8fed\u4ee3\u6b21\u6570\u548c\u5e76\u884c\u5ea6\u7b49\u53c2\u6570\uff0c\u4ece\u800c\u63d0\u4f9b\u66f4\u5f3a\u7684\u5b89\u5168\u6027\u3002Argon2 \u5206\u4e3a\u4e09\u4e2a\u53d8\u79cd\uff1aArgon2d\u3001Argon2i \u548c Argon2id\uff0c\u5206\u522b\u9488\u5bf9\u4e0d\u540c\u7684\u653b\u51fb\u573a\u666f\u3002\u5728 C# \u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>Konscious.Security.Cryptography.Argon2<\/code> \u7b49\u5e93\u6765\u4f7f\u7528 Argon2\u3002<\/p>\n<h2 id=\"blake2\">\nBLAKE2\n<a href=\"#blake2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>BLAKE2 \u662f\u4e00\u4e2a\u76f8\u5bf9\u8f83\u65b0\u7684\u54c8\u5e0c\u51fd\u6570\uff082013 \u5e74\u53d1\u5e03\uff09\uff0c\u5b83\u5728\u901f\u5ea6\u548c\u5b89\u5168\u6027\u4e4b\u95f4\u53d6\u5f97\u4e86\u5f88\u597d\u7684\u5e73\u8861\u3002BLAKE2 \u7684\u8bbe\u8ba1\u76ee\u6807\u662f\u63d0\u4f9b\u6bd4 MD5 \u548c SHA-1 \u66f4\u5feb\u7684\u901f\u5ea6\uff0c\u540c\u65f6\u6bd4 SHA-2 \u66f4\u9ad8\u7684\u5b89\u5168\u6027\u3002\u5b83\u975e\u5e38\u9002\u5408\u7528\u4e8e\u6587\u4ef6\u5b8c\u6574\u6027\u6821\u9a8c\u3001\u5bc6\u7801\u54c8\u5e0c\u7b49\u573a\u666f\u3002<\/p>\n<p>\u5b83\u7684\u9ad8\u6027\u80fd\u5f97\u76ca\u4e8e\u5b83\u5145\u5206\u5229\u7528\u4e86\u73b0\u4ee3 CPU \u7684 SIMD \u6307\u4ee4\u96c6\uff08\u5982 SSE2\/AVX \u7b49\uff09\uff0c\u5728\u591a\u6838\u5904\u7406\u5668\u4e0a\u8868\u73b0\u5c24\u4e3a\u51fa\u8272\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c\u5b83\u8fd8\u63d0\u4f9b\u4e86\u4e24\u4e2a\u4e3b\u8981\u7248\u672c\uff1aBLAKE2b \u548c BLAKE2s\u3002BLAKE2b \u9002\u7528\u4e8e 64 \u4f4d\u5e73\u53f0\uff0c\u8f93\u51fa\u957f\u5ea6\u53ef\u53d8\uff0c\u6700\u5927\u4e3a 64 \u5b57\u8282\uff1b\u800c BLAKE2s \u9002\u7528\u4e8e 8 \u5230 32 \u4f4d\u5e73\u53f0\uff0c\u8f93\u51fa\u957f\u5ea6\u53ef\u53d8\uff0c\u6700\u5927\u4e3a 32 \u5b57\u8282\u3002<\/p>\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u5b83\u8fd8\u63d0\u4f9b\u4e86\u5f88\u591a\u7279\u6027\uff0c\u6bd4\u5982\u5185\u7f6e\u5bc6\u94a5\u673a\u5236\u3001\u53ef\u9009\u76d0\u503c\u548c\u4e2a\u6027\u5316\u5b57\u7b26\u4e32\u7b49\u3002\u8fd9\u4e9b\u7279\u6027\u4f7f\u5f97 BLAKE2 \u5728\u5f88\u591a\u5e94\u7528\u573a\u666f\u4e2d\u90fd\u975e\u5e38\u6709\u7528\u3002<\/p>\n<p>\u5728 C# \u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>BouncyCastle<\/code> \u7b49\u5e93\u6765\u5b9e\u73b0 BLAKE2\u3002\u4ee5\u4e0b\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u793a\u4f8b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Org.BouncyCastle.Crypto<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Org.BouncyCastle.Crypto.Digests<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">digest<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Blake2bDigest<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u9ed8\u8ba4 512\uff0c\u53ef\u4ee5\u6539\u4e3a 8~512 \u7684\u4efb\u610f 8 \u7684\u500d\u6570<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">digest<\/span><span class=\"p\">.<\/span><span class=\"n\">BlockUpdate<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">hash<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[<\/span><span class=\"n\">digest<\/span><span class=\"p\">.<\/span><span class=\"n\">GetDigestSize<\/span><span class=\"p\">()];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">digest<\/span><span class=\"p\">.<\/span><span class=\"n\">DoFinal<\/span><span class=\"p\">(<\/span><span class=\"n\">hash<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"sm3\">\nSM3\n<a href=\"#sm3\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\u6211\u4eec\u518d\u6765\u4ecb\u7ecd\u4e00\u4e2a\u56fd\u4ea7\u7684\u54c8\u5e0c\u51fd\u6570\uff1aSM3\u3002SM3 \u662f\u4e2d\u56fd\u56fd\u5bb6\u5bc6\u7801\u7ba1\u7406\u5c40\u5728 2010 \u5e74\u53d1\u5e03\u7684\u54c8\u5e0c\u51fd\u6570\u6807\u51c6\u3002\u5b83\u662f\u4e2d\u56fd\u72ec\u7acb\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u54c8\u5e0c\u7b97\u6cd5\uff0c\u4e0d\u4f9d\u8d56\u4e8e\u56fd\u5916\u7684\u6807\u51c6\u3002\u8fd9\u5bf9\u4e8e\u56fd\u5bb6\u5b89\u5168\u548c\u4fe1\u606f\u5b89\u5168\u5177\u6709\u91cd\u8981\u610f\u4e49\u3002<\/p>\n<p>SM3 \u7b97\u6cd5\u751f\u6210 256 \u4f4d\u7684\u54c8\u5e0c\u503c\uff0c\u5e76\u4e14\u5b89\u5168\u6027\u53ca\u6548\u7387\u4e0e SHA-256 \u76f8\u5f53\u3002\u5b83\u5728\u8bbe\u8ba1\u4e0a\u5177\u6709\u826f\u597d\u7684\u6297\u78b0\u649e\u6027\u548c\u5355\u5411\u6027\uff0c\u65e8\u5728\u62b5\u6297\u5404\u79cd\u5bc6\u7801\u5206\u6790\u653b\u51fb\u3002<\/p>\n<p>\u4f5c\u4e3a\u4e2d\u56fd\u7684\u56fd\u5bb6\u6807\u51c6\uff0cSM3 \u5728\u56fd\u5185\u7684\u5e94\u7528\u8d8a\u6765\u8d8a\u5e7f\u6cdb\uff0c\u5c24\u5176\u662f\u5728\u91d1\u878d\u3001\u653f\u5e9c\u548c\u519b\u5de5\u7b49\u9886\u57df\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u54c8\u5e0c\u51fd\u6570\u53ef\u8c13\u662f\u79cd\u7c7b\u7e41\u591a\u3001\u5404\u6709\u6240\u957f\u3002\u4ece\u65e9\u671f\u7684 MD5 \u548c SHA-1\uff0c\u5230\u73b0\u5728\u7684 SHA-2\u3001SHA-3\u3001PBKDF2\u3001bcrypt\u3001Argon2\u3001BLAKE2 \u548c SM3\uff0c\u6bcf\u79cd\u54c8\u5e0c\u51fd\u6570\u90fd\u6709\u5176\u72ec\u7279\u7684\u8bbe\u8ba1\u7406\u5ff5\u548c\u5e94\u7528\u573a\u666f\u3002<\/p>\n<p>\u7b80\u5355\u6765\u8bf4\uff0c\u4e00\u4e9b\u5e38\u89c1\u9700\u6c42\u53ca\u53ef\u4ee5\u9009\u62e9\u7684\u54c8\u5e0c\u51fd\u6570\u5982\u4e0b\uff1a<\/p>\n<ul>\n<li><strong>\u6570\u636e\u5b8c\u6574\u6027\u6821\u9a8c<\/strong>\uff1aMD5\u3001SHA-1\u3001SHA-2\u3001BLAKE2<\/li>\n<li><strong>\u5bc6\u7801\u5b58\u50a8<\/strong>\uff1aPBKDF2\u3001bcrypt\u3001Argon2<\/li>\n<li><strong>\u6570\u5b57\u7b7e\u540d<\/strong>\uff1aSHA-2\u3001SHA-3<\/li>\n<li><strong>\u56fd\u4ea7\u5b89\u5168<\/strong>\uff1aSM3<\/li>\n<\/ul>"},{"title":"\u9006\u5411\u601d\u8003 .NET \u4e00\u4e9b\u7248\u672c\u7684\u65b0\u7279\u6027","link":"https:\/\/blog.coldwind.top\/posts\/reverse-thinking-of-dotnet-new-features\/","pubDate":"Tue, 03 Jun 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/reverse-thinking-of-dotnet-new-features\/","description":"<p>.NET \u4f5c\u4e3a\u4e00\u4e2a\u8fd1\u5e74\u6765\u66f4\u65b0\u9891\u7387\u7a33\u5b9a\u7684\u5e73\u53f0\uff0c\u6bcf\u4e2a\u7248\u672c\u90fd\u4f1a\u5f15\u5165\u4e00\u4e9b\u65b0\u7684\u7279\u6027\u548c\u6539\u8fdb\u3002\u8fd9\u4e9b\u65b0\u7279\u6027\u5f80\u5f80\u662f\u4e3a\u4e86\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\u3001\u589e\u5f3a\u6027\u80fd\u6216\u6539\u5584\u7528\u6237\u4f53\u9a8c\u3002\u7136\u800c\uff0c\u5f88\u591a\u65f6\u5019\u6211\u4eec\u53ef\u80fd\u4f1a\u5bf9\u67d0\u4e9b\u65b0\u7279\u6027\u7684\u5f15\u5165\u611f\u5230\u7591\u60d1\uff0c\u751a\u81f3\u8ba4\u4e3a\u5b83\u4eec\u5e76\u4e0d\u662f\u90a3\u4e48\u5fc5\u8981\u3002<\/p>\n<p>\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u60f3\u501f\u52a9\u51e0\u4e2a\u4f8b\u5b50\u6765\u5206\u4eab\u6211\u7684\u601d\u8003\uff0c\u5e76\u7ed9\u5927\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u6709\u610f\u601d\u7684\u89c6\u89d2\uff1a\u9006\u5411\u601d\u8003 .NET \u65b0\u7279\u6027\u80cc\u540e\u7684\u903b\u8f91\u548c\u601d\u8003\u65b9\u5f0f\u3002<\/p>\n<h2 id=\"\u533f\u540d\u7c7b\u578blambda-\u8868\u8fbe\u5f0f\u548c\u6269\u5c55\u65b9\u6cd5\">\n\u533f\u540d\u7c7b\u578b\u3001lambda \u8868\u8fbe\u5f0f\u548c\u6269\u5c55\u65b9\u6cd5\n<a href=\"#%e5%8c%bf%e5%90%8d%e7%b1%bb%e5%9e%8blambda-%e8%a1%a8%e8%be%be%e5%bc%8f%e5%92%8c%e6%89%a9%e5%b1%95%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 C# 3 \u4e2d\uff0c.NET \u5f15\u5165\u4e86\u533f\u540d\u7c7b\u578b\u3001lambda \u8868\u8fbe\u5f0f\u548c\u6269\u5c55\u65b9\u6cd5\u7b49\u7279\u6027\u3002\u6211\u4eec\u5148\u6765\u7b80\u5355\u56de\u987e\u4e00\u4e0b\u8fd9\u4e9b\u7279\u6027\u90fd\u662f\u4ec0\u4e48\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u533f\u540d\u7c7b\u578b<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">mapped<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"p\">{<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">,<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age<\/span> <span class=\"p\">});<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Lambda \u8868\u8fbe\u5f0f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">filtered<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age<\/span> <span class=\"p\">&gt;<\/span> <span class=\"m\">18<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6269\u5c55\u65b9\u6cd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">StringExtensions<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Where<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;(<\/span><span class=\"k\">this<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">source<\/span><span class=\"p\">,<\/span> <span class=\"n\">Func<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">,<\/span> <span class=\"kt\">bool<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">predicate<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">item<\/span> <span class=\"k\">in<\/span> <span class=\"n\">source<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">predicate<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">yield<\/span> <span class=\"k\">return<\/span> <span class=\"n\">item<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u76f8\u4fe1\u5927\u5bb6\u770b\u4e86\u4e0a\u9762\u6211\u201c\u522b\u6709\u7528\u5fc3\u201d\u7684\u5b9e\u4f8b\u4e4b\u540e\uff0c\u4e00\u5b9a\u4e0d\u96be\u53d1\u73b0\uff1a\u8fd9\u4e9b\u65b0\u7279\u6027\u4f3c\u4e4e\u90fd\u4e0e LINQ \u6709\u5173\uff0c\u800c LINQ \u6b63\u662f\u5728 C# 3.0 \u4e2d\u5f15\u5165\u7684\u3002<\/p>\n<p>\u56e0\u6b64\uff0c\u6211\u4eec\u4e0d\u96be\u5f97\u51fa\u7ed3\u8bba\uff1a\u8fd9\u4e9b\u65b0\u7279\u6027\u90fd\u662f\u4e3a\u4e86\u652f\u6301 LINQ \u7684\u8bed\u6cd5\u800c\u6dfb\u52a0\u7684\u3002\u5b83\u4eec\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u66f4\u7b80\u6d01\u5730\u7f16\u5199\u67e5\u8be2\u4ee3\u7801\uff0c\u63d0\u5347\u4e86\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u3002<\/p>\n<p>\u5f53\u7136\u4e86\uff0c\u8fd9\u4e09\u4e2a\u7279\u6027\u7edd\u4e0d\u4ec5\u4ec5\u662f\u4e3a\u4e86\u652f\u6301 LINQ \u800c\u5b58\u5728\u7684\u3002\u5b83\u4eec\u5728\u5176\u4ed6\u573a\u666f\u4e0b\u4e5f\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\u3002\u4f8b\u5982\uff0c\u533f\u540d\u7c7b\u578b\u53ef\u4ee5\u7528\u4e8e\u5feb\u901f\u521b\u5efa\u4e34\u65f6\u6570\u636e\u7ed3\u6784\uff0clambda \u8868\u8fbe\u5f0f\u53ef\u4ee5\u7528\u4e8e\u65b9\u4fbf\u5730\u58f0\u660e\u4e8b\u4ef6\u5904\u7406\u548c\u56de\u8c03\uff0c\u800c\u6269\u5c55\u65b9\u6cd5\u5219\u53ef\u4ee5\u8ba9\u6211\u4eec\u4e3a\u73b0\u6709\u7c7b\u578b\u6dfb\u52a0\u65b0\u7684\u529f\u80fd\u3002\u5b83\u4eec\u90fd\u662f\u76f8\u5f53\u5f3a\u5927\u7684\u529f\u80fd\u3002<\/p>\n<h2 id=\"\u4e22\u5f03\u8fd0\u7b97\u7b26\">\n\u4e22\u5f03\u8fd0\u7b97\u7b26\n<a href=\"#%e4%b8%a2%e5%bc%83%e8%bf%90%e7%ae%97%e7%ac%a6\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6211\u4eec\u518d\u6765\u770b\u4e00\u4e2a\u4f8b\u5b50\u3002C# 7 \u5f15\u5165\u4e86\u4e22\u5f03\u8fd0\u7b97\u7b26\uff08<code>_<\/code>\uff09\uff0c\u5b83\u53ef\u4ee5\u7528\u4e8e\u5ffd\u7565\u4e0d\u9700\u8981\u7684\u503c\u3002\u8fd9\u770b\u8d77\u6765\u4f3c\u4e4e\u662f\u4e00\u4e2a\u5c0f\u7279\u6027\uff0c\u4f46\u5982\u679c\u6211\u4eec\u518d\u53bb\u770b\u8fd9\u4e2a\u7248\u672c\u5f15\u5165\u7684\u5176\u4ed6\u51e0\u4e2a\u7279\u6027\uff0c\u5c31\u4e0d\u96be\u53d1\u73b0\u5b83\u4eec\u4e4b\u95f4\u7684\u5173\u7cfb\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ C# 7.0-<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">int<\/span> <span class=\"k\">value<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">TryParse<\/span><span class=\"p\">(<\/span><span class=\"n\">input<\/span><span class=\"p\">,<\/span> <span class=\"k\">out<\/span> <span class=\"k\">value<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Tuple<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">GetResults<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">results<\/span> <span class=\"p\">=<\/span> <span class=\"n\">GetResults<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"k\">value<\/span> <span class=\"p\">=<\/span> <span class=\"n\">results<\/span><span class=\"p\">.<\/span><span class=\"n\">Item1<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u5ffd\u7565 Item2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ C# 7.0+<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">TryParse<\/span><span class=\"p\">(<\/span><span class=\"n\">input<\/span><span class=\"p\">,<\/span> <span class=\"k\">out<\/span> <span class=\"kt\">var<\/span> <span class=\"n\">_<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span><span class=\"p\">)<\/span> <span class=\"n\">GetResults<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span><span class=\"p\">)<\/span> <span class=\"p\">=<\/span> <span class=\"n\">GetResults<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u4f7f\u7528\u5143\u7ec4\u89e3\u6784<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0d\u96be\u53d1\u73b0\uff0cC# 7 \u8fd8\u5f15\u5165\u4e86\u65b0\u7684 <code>out<\/code> \u53d8\u91cf\u58f0\u660e\u548c\u5143\u7ec4\u89e3\u6784\u8bed\u6cd5\u3002\u800c\u5728\u8fd9\u4e9b\u8bed\u6cd5\u4e2d\uff0c\u4e22\u5f03\u8fd0\u7b97\u7b26\u90fd\u53ef\u4ee5\u8d77\u5230\u4fbf\u6377\u7684\u4f5c\u7528\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u8bf4\uff0c\u8fd9\u51e0\u4e2a\u65b0\u7684\u7279\u6027\u662f\u5bc6\u4e0d\u53ef\u5206\u7684\uff0c\u6240\u4ee5\u5b83\u4eec\u4e5f\u5f97\u4ee5\u5728\u8fd9\u4e2a\u7248\u672c\u4e2d\u540c\u65f6\u51fa\u73b0\u3002<\/p>\n<h2 id=\"init-\u8bbf\u95ee\u5668\u4e0e\u8bb0\u5f55\u7c7b\">\n<code>init<\/code> \u8bbf\u95ee\u5668\u4e0e\u8bb0\u5f55\u7c7b\n<a href=\"#init-%e8%ae%bf%e9%97%ae%e5%99%a8%e4%b8%8e%e8%ae%b0%e5%bd%95%e7%b1%bb\" class=\"anchor\">&para;<\/a>\n<\/h2><p>C# 9 \u5f15\u5165\u4e86 <code>init<\/code> \u8bbf\u95ee\u5668\u548c\u8bb0\u5f55\u7c7b\uff08record class\uff09\u3002\u8bb0\u5f55\u7c7b\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u76f8\u5f53\u4fbf\u6377\u7684\u58f0\u660e\u4e0d\u53ef\u53d8\u6570\u636e\u7c7b\u578b\u7684\u65b9\u5f0f\uff0c\u5e76\u4e14\u91cd\u5199\u4e86 <code>Equals<\/code>\u3001<code>GetHashCode<\/code> \u548c <code>ToString<\/code> \u7b49\u65b9\u6cd5\uff0c\u6765\u63d0\u4f9b\u66f4\u597d\u7684\u8bed\u4e49\u3002<\/p>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e00\u4e2a\u8bb0\u5f55\u7c7b\u4e2d\u7684\u5c5e\u6027\u90fd\u662f\u53ea\u8bfb\u7684\uff0c\u5373\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">record<\/span> <span class=\"nc\">Person<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u76f8\u5f53\u4e8e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">init<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">init<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">override<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">Equals<\/span><span class=\"p\">(<\/span><span class=\"kt\">object?<\/span> <span class=\"n\">obj<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"cm\">\/* ... *\/<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">override<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">GetHashCode<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span> <span class=\"cm\">\/* ... *\/<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">override<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">ToString<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span> <span class=\"cm\">\/* ... *\/<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u56e0\u6b64\uff0c<code>init<\/code> \u8bbf\u95ee\u5668\u4e0e\u8bb0\u5f55\u7c7b\u4e00\u8d77\u51fa\u73b0\u662f\u5f88\u81ea\u7136\u7684\u3002\u5b83\u4eec\u5171\u540c\u63d0\u4f9b\u4e86\u4e00\u79cd\u58f0\u660e\u4e0d\u53ef\u53d8\u6570\u636e\u7c7b\u578b\u7684\u65b9\u5f0f\uff0c\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u66f4\u65b9\u4fbf\u5730\u521b\u5efa\u548c\u4f7f\u7528\u4e0d\u53ef\u53d8\u5bf9\u8c61\u3002<\/p>\n<h2 id=\"\u9876\u7ea7\u8bed\u53e5\u4e0e\u9690\u5f0f\u5f15\u5165\">\n\u9876\u7ea7\u8bed\u53e5\u4e0e\u9690\u5f0f\u5f15\u5165\n<a href=\"#%e9%a1%b6%e7%ba%a7%e8%af%ad%e5%8f%a5%e4%b8%8e%e9%9a%90%e5%bc%8f%e5%bc%95%e5%85%a5\" class=\"anchor\">&para;<\/a>\n<\/h2><p>C# 9 \u5f15\u5165\u4e86\u9876\u7ea7\u8bed\u53e5\uff0c\u800c C# 10 \u5f15\u5165\u4e86\u9690\u5f0f\u5f15\u5165\u3002\u8fd9\u6837\u6211\u4eec\u65e2\u4e0d\u7528\u518d\u5199 <code>Program<\/code> \u53ca <code>Main<\/code> \u65b9\u6cd5\uff0c\u4e5f\u4e0d\u7528\u518d\u5199\u5f88\u591a\u5e38\u89c1\u7684 <code>using<\/code> \u8bed\u53e5\u4e86\u3002\u7136\u540e\uff0c\u5728\u90a3\u6bb5\u65f6\u95f4\uff0c\u6211\u4eec\u8fd8\u5f97\u5230\u4e86\u4ec0\u4e48\u5462\uff1f\u6211\u4eec\u5f97\u5230\u4e86 ASP.NET Core Minimal APIs\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">builder<\/span> <span class=\"p\">=<\/span> <span class=\"n\">WebApplication<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateBuilder<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">app<\/span> <span class=\"p\">=<\/span> <span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Build<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">MapGet<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\/&#34;<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;Hello World!&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">Run<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e9b\u4ee3\u7801\u5c31\u5f88\u5927\u7a0b\u5ea6\u4e0a\u501f\u52a9\u4e86\u9876\u7ea7\u8bed\u53e5\u548c\u9690\u5f0f\u5f15\u5165\u7684\u7279\u6027\u3002\u5b83\u4eec\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u66f4\u7b80\u6d01\u5730\u7f16\u5199 ASP.NET Core \u5e94\u7528\u7a0b\u5e8f\u3002C# \u7528\u8fd9\u5c42\u7b80\u6d01\u7684\u4f2a\u88c5\uff0c\u8ba9\u66f4\u591a\u7684\u4eba\u8ba4\u4e3a\u7528\u5b83\u5f00\u53d1 Web \u5e94\u7528\u7a0b\u5e8f\u662f\u4ef6\u5f88\u7b80\u5355\u7684\u4e8b\u60c5\uff08\u7b11\uff09\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u4ece\u6b64\uff0cC# \u4e5f\u53ef\u4ee5\u7528 1 \u884c\u4ee3\u7801\u5b9e\u73b0 Hello World \u4e86\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Hello World!&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u63a5\u53e3\u7684\u62bd\u8c61\u9759\u6001\u6210\u5458\">\n\u63a5\u53e3\u7684\u62bd\u8c61\u9759\u6001\u6210\u5458\n<a href=\"#%e6%8e%a5%e5%8f%a3%e7%9a%84%e6%8a%bd%e8%b1%a1%e9%9d%99%e6%80%81%e6%88%90%e5%91%98\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u4ee5\u524d\u7684 C# \u7248\u672c\u4e2d\uff0c\u63a5\u53e3\u53ea\u80fd\u5305\u542b\u65b9\u6cd5\u3001\u5c5e\u6027\u3001\u4e8b\u4ef6\u548c\u7d22\u5f15\u5668\u7b49\u6210\u5458\uff0c\u800c\u4e0d\u80fd\u5305\u542b\u9759\u6001\u6210\u5458\u3002\u76f8\u4fe1\u8fd9\u662f\u7edd\u5927\u591a\u6570 .NET \u5f00\u53d1\u8005\u7684\u5171\u8bc6\uff0c\u4e5f\u662f\u7edd\u5927\u591a\u6570\u5f00\u53d1\u8005\u5728\u5165\u95e8\u65f6\u7684\u8ba4\u77e5\uff0c\u4ee5\u53ca\u5728\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u7ecf\u9a8c\u3002<\/p>\n<p>\u7136\u800c\uff0c\u5728 C# 11 \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u63a5\u53e3\u4e2d\u58f0\u660e\u62bd\u8c61\u9759\u6001\u6210\u5458\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">interface<\/span> <span class=\"nc\">IShape<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">double<\/span> <span class=\"n\">Area<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">static<\/span> <span class=\"kd\">abstract<\/span> <span class=\"n\">IShape<\/span> <span class=\"n\">Create<\/span><span class=\"p\">(<\/span><span class=\"kt\">double<\/span> <span class=\"n\">size<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Circle<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IShape<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">Radius<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">Area<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Math<\/span><span class=\"p\">.<\/span><span class=\"n\">PI<\/span> <span class=\"p\">*<\/span> <span class=\"n\">Radius<\/span> <span class=\"p\">*<\/span> <span class=\"n\">Radius<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">Circle<\/span> <span class=\"n\">Create<\/span><span class=\"p\">(<\/span><span class=\"kt\">double<\/span> <span class=\"n\">size<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Circle<\/span><span class=\"p\">(<\/span><span class=\"n\">size<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u7684\u58f0\u660e\u4f1a\u8981\u6c42\u5b9e\u73b0\u8be5\u63a5\u53e3\u7684\u7c7b\u5fc5\u987b\u63d0\u4f9b\u8fd9\u4e2a\u9759\u6001\u65b9\u6cd5\u3002\u90a3\u4e48\u8fd9\u4e2a\u65b0\u7279\u6027\u6709\u4ec0\u4e48\u7528\u5462\uff1f<\/p>\n<p>\u5f88\u5feb\uff0c\u6211\u4eec\u5728 C# 12 \u4e2d\u5c31\u770b\u5230\u4e86\u5b83\u7684\u5e94\u7528\uff1a<code>INumber<\/code> \u63a5\u53e3\u7684\u5f15\u5165\u3002\u8fd9\u4e2a\u63a5\u53e3\u5b9a\u4e49\u4e86\u6570\u5b57\u7c7b\u578b\u7684\u901a\u7528\u884c\u4e3a\uff0c\u5176\u4e2d\u5c31\u5305\u542b\u4e86\u4e0d\u5c11\u9759\u6001\u7684\u6210\u5458\uff0c\u6bd4\u5982 <code>Parse<\/code>\u3001<code>Zero<\/code> \u7b49\u7b49\u3002<\/p>\n<p>\u4e0d\u96be\u60f3\u8c61\uff0c\u5982\u679c\u6ca1\u6709\u8fd9\u4e2a\u65b0\u7684\u63a5\u53e3\u7279\u6027\uff0c\u8fd9\u4e2a\u63a5\u53e3\u7684\u5b9e\u73b0\u80af\u5b9a\u662f\u505a\u4e0d\u5230\u7684\u3002<\/p>\n<h2 id=\"\u7ed3\u8bba\">\n\u7ed3\u8bba\n<a href=\"#%e7%bb%93%e8%ae%ba\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5176\u5b9e\u5176\u4ed6\u7c7b\u4f3c\u7684\u4f8b\u5b50\u8fd8\u6709\u5f88\u591a\uff0c\u6bd4\u5982 <code>ref struct<\/code>\u3001<code>readonly struct<\/code> \u7b49\u4e0e <code>Span<\/code> \u53ca <code>Memory<\/code> \u76f8\u5173\u7684\u7279\u6027\uff0c<code>IAsyncEnumerable<\/code> \u4e0e <code>Channel<\/code> \u7b49\u7b49\u3002<\/p>\n<p>\u901a\u8fc7\u8fd9\u4e9b\u4f8b\u5b50\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c.NET \u7684\u65b0\u7279\u6027\u5f80\u5f80\u662f\u4e3a\u4e86\u652f\u6301\u67d0\u4e2a\u7279\u5b9a\u7684\u529f\u80fd\u6216\u8bed\u6cd5\u800c\u5f15\u5165\u7684\u3002\u5b83\u4eec\u4e4b\u95f4\u6709\u7740\u5bc6\u5207\u7684\u5173\u7cfb\u3002\u6709\u7684\u662f\u4e3a\u4e86\u652f\u6301\u67d0\u4e2a\u529f\u80fd\u7684\u5b9e\u73b0\uff0c\u6709\u7684\u662f\u4e3a\u4e86\u4f18\u5316\u67d0\u4e2a\u8bed\u6cd5\u7684\u4f7f\u7528\u4f53\u9a8c\uff0c\u6709\u7684\u5219\u662f\u4e3a\u4e86\u63d0\u4f9b\u66f4\u597d\u7684\u6027\u80fd\u6216\u53ef\u8bfb\u6027\u3002<\/p>\n<p>\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u6709\u7684\u7279\u6027\u5e76\u4e0d\u662f\u5b8c\u5168\u5728\u540c\u4e00\u4e2a\u7248\u672c\u51fa\u73b0\uff0c\u8fd9\u4e5f\u662f\u6709\u4e00\u4e9b\u539f\u56e0\u7684\u3002\u5176\u4e2d\u4e00\u4e2a\u539f\u56e0\u662f\uff0c.NET \u7684\u65b0\u7279\u6027\u5f80\u5f80\u9700\u8981\u7ecf\u8fc7\u591a\u6b21\u8fed\u4ee3\u548c\u5b8c\u5584\u624d\u80fd\u6700\u7ec8\u7a33\u5b9a\u4e0b\u6765\u3002\u6709\u53ef\u80fd\u76f4\u5230\u67d0\u4e2a\u7248\u672c\u8981\u53d1\u5e03\u65f6\uff0c\u60f3\u8981\u6dfb\u52a0\u7684\u65b0\u7279\u6027\u4ecd\u7136\u4e0d\u591f\u6210\u719f\uff0c\u56e0\u6b64\u4e3a\u4e86\u8f85\u52a9\u5b83\u800c\u8bde\u751f\u7684\u7279\u6027\u53ef\u80fd\u4f1a\u63d0\u524d\u5728\u8be5\u7248\u672c\u4e0a\u7ebf\uff0c\u800c\u5b83\u6240\u8f85\u52a9\u7684\u7279\u6027\u5219\u4f1a\u5728\u4e0b\u4e00\u4e2a\u7248\u672c\u4e2d\u5f15\u5165\u3002<\/p>\n<p>\u5e0c\u671b\u901a\u8fc7\u8fd9\u7bc7\u6587\u7ae0\uff0c\u5927\u5bb6\u80fd\u591f\u5bf9 .NET \u7684\u65b0\u7279\u6027\u6709\u4e00\u4e2a\u66f4\u6df1\u5165\u7684\u7406\u89e3\u3002\u9006\u5411\u601d\u8003\u8fd9\u4e9b\u7279\u6027\u80cc\u540e\u7684\u903b\u8f91\u548c\u601d\u8003\u65b9\u5f0f\uff0c\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u66f4\u597d\u5730\u7406\u89e3\u5b83\u4eec\u7684\u8bbe\u8ba1\u521d\u8877\u548c\u5e94\u7528\u573a\u666f\uff0c\u4e5f\u80fd\u8ba9\u6211\u4eec\u5728\u4f7f\u7528\u8fd9\u4e9b\u7279\u6027\u65f6\u66f4\u52a0\u5f97\u5fc3\u5e94\u624b\u3002\u8fd9\u6837\u7684\u4f8b\u5b50\u89c1\u5f97\u591a\u4e86\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u79cd\u201c\u5fae\u8f6f\u5728\u5f00\u53d1\u67d0\u529f\u80fd\u65f6\u5f15\u5165\u7684\u65b0\u7279\u6027\u56e0\u4e3a\u592a\u597d\u7528\u4e86\uff0c\u6240\u4ee5\u987a\u4fbf\u4e0b\u653e\u7ed9\u6211\u4eec\u4f7f\u7528\u201d\u7684\u611f\u89c9\u5427\ud83d\ude02\u3002<\/p>"},{"title":"\u662f\u4e0d\u662f\u6240\u6709 C# \u4e2d\u5b9e\u73b0\u4e86 Dispose \u65b9\u6cd5\u7684\u7c7b\u6211\u4eec\u90fd\u8981\u7528\u5b8c\u5373\u91ca\u653e\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/no-need-to-always-call-dispose\/","pubDate":"Mon, 21 Apr 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/no-need-to-always-call-dispose\/","description":"<p>C# \u4f5c\u4e3a\u4e00\u4e2a\u6709 GC\uff08\u5783\u573e\u56de\u6536\uff09\u7684\u8bed\u8a00\uff0c\u5728\u4f7f\u7528\u6258\u7ba1\u8d44\u6e90\u65f6\uff0c\u901a\u5e38\u4e0d\u9700\u8981\u5f00\u53d1\u8005\u5173\u6ce8\u8d44\u6e90\u7684\u91ca\u653e\u95ee\u9898\u3002\u4f46\u5982\u679c\u4f7f\u7528\u4e86\u975e\u6258\u7ba1\u8d44\u6e90\uff08\u5e38\u89c1\u7684\u5982\u6587\u4ef6\u53e5\u67c4\u3001\u6570\u636e\u5e93\u8fde\u63a5\u7b49\uff09\uff0c\u5c31\u9700\u8981\u624b\u52a8\u91ca\u653e\u8d44\u6e90\u4e86\u3002\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u8d44\u6e90\uff0c\u5e76\u5f62\u6210\u4e00\u79cd\u7edf\u4e00\u7684\u89c4\u8303\uff0cC# \u63d0\u4f9b\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\uff08\u540e\u6765\u8fd8\u63d0\u4f9b\u4e86 <code>IAsyncDisposable<\/code> \u63a5\u53e3\uff09\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e2a\u63a5\u53e3\u63d0\u4f9b\u7684 <code>Dispose<\/code> \u65b9\u6cd5\u6765\u91ca\u653e\u8d44\u6e90\uff0c\u8fd8\u53ef\u4ee5\u501f\u52a9 C# \u7684 <code>using<\/code> \u8bed\u53e5\u6765\u7b80\u5316\u8d44\u6e90\u7684\u91ca\u653e\u8fc7\u7a0b\u3002<\/p>\n<p>\u90a3\u4e48\u95ee\u9898\u6765\u4e86\uff1a\u662f\u5426\u6240\u6709\u5b9e\u73b0\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\u7684\u7c7b\u90fd\u9700\u8981\u5728\u7528\u540e\u7acb\u523b\u8c03\u7528 <code>Dispose<\/code> \u65b9\u6cd5\uff1f\u7b54\u6848\u662f\uff1a\u4e0d\u4e00\u5b9a\u3002<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u5c31\u501f\u52a9\u51e0\u4e2a\u5178\u578b\u7684\u4f8b\u5b50\uff0c\u6765\u770b\u770b\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e0d\u8c03\u7528 <code>Dispose<\/code> \u65b9\u6cd5\uff0c\u5e76\u4ece\u5e95\u5c42\u7684\u539f\u7406\u51fa\u53d1\uff0c\u7ed9\u5927\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u5224\u65ad\u662f\u5426\u6709\u5fc5\u8981\u8c03\u7528 <code>Dispose<\/code> \u65b9\u6cd5\u7684\u601d\u8def\u3002<\/p>\n<h2 id=\"\u5b9e\u73b0-idisposable-\u63a5\u53e3\u4f46\u4e0d\u6d89\u53ca\u8d44\u6e90\u91ca\u653e\u7684\u7c7b\">\n\u5b9e\u73b0 IDisposable \u63a5\u53e3\u4f46\u4e0d\u6d89\u53ca\u8d44\u6e90\u91ca\u653e\u7684\u7c7b\n<a href=\"#%e5%ae%9e%e7%8e%b0-idisposable-%e6%8e%a5%e5%8f%a3%e4%bd%86%e4%b8%8d%e6%b6%89%e5%8f%8a%e8%b5%84%e6%ba%90%e9%87%8a%e6%94%be%e7%9a%84%e7%b1%bb\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6211\u4eec\u770b\u7b2c\u4e00\u79cd\u60c5\u51b5\uff1a\u6709\u4e9b\u7c7b\u5b9e\u73b0\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\uff0c\u4f46\u5e76\u4e0d\u6d89\u53ca\u8d44\u6e90\u7684\u91ca\u653e\u3002\u8fd9\u65f6\u5019\u76f8\u4fe1\u6709\u7684\u8bfb\u8005\u5c31\u4f1a\u95ee\u4e86\uff1a\u8fd9\u79cd\u60c5\u51b5\u6709\u70b9\u592a\u5f3a\u884c\u51d1\u6570\u4e86\u5427\uff1f\u800c\u4e14\u8fd9\u96be\u9053\u4e0d\u662f\u5728\u6ee5\u7528 <code>IDisposable<\/code> \u5417\uff0c\u6bd5\u7adf\u5b83\u672c\u6765\u662f\u7528\u6765\u91ca\u653e\u8d44\u6e90\u7684\u554a\uff1f<\/p>\n<p>\u5176\u5b9e\u672a\u5fc5\u3002\u56e0\u4e3a C# \u7684 <code>using<\/code> \u5173\u952e\u5b57\u63d0\u4f9b\u4e86\u4e00\u4e2a\u975e\u5e38\u65b9\u4fbf\u7684\u8bed\u6cd5\u7cd6\uff0c\u53ef\u4ee5\u8ba9\u6211\u4eec\u5728\u4f7f\u7528\u5b8c\u4e00\u4e2a\u5bf9\u8c61\u540e\uff0c\u81ea\u52a8\u8c03\u7528\u5b83\u7684 <code>Dispose<\/code> \u65b9\u6cd5\u4e2d\u7684\u903b\u8f91\uff08\u5373\u4fbf\u5b83\u53ef\u80fd\u4e0e\u8d44\u6e90\u91ca\u653e\u65e0\u5173\uff09\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5b9e\u73b0\u5ef6\u8fdf\u6267\u884c\uff0c\u4ee5\u53ca\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\uff08\u5305\u62ec\u629b\u5f02\u5e38\uff09\u90fd\u80fd\u591f\u786e\u4fdd\u4f1a\u6267\u884c\u7684\u903b\u8f91\u4e86\u3002<\/p>\n<p>\u9996\u5148\u6211\u4eec\u7b80\u5355\u56de\u987e\u4e00\u4e0b <code>using<\/code> \u5173\u952e\u5b57\u5728\u5e55\u540e\u505a\u7684\u4e8b\u60c5\u3002\u6211\u4eec\u8fd9\u91cc\u770b\u4e00\u4e2a\u7b80\u5355\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">fs<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileStream<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;test.txt&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileMode<\/span><span class=\"p\">.<\/span><span class=\"n\">Open<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5176\u4ed6\u903b\u8f91<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0a\u9762\u7684\u4ee3\u7801\u5728\u7f16\u8bd1\u540e\u4f1a\u53d8\u6210\u4e0b\u9762\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">fs<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileStream<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;test.txt&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileMode<\/span><span class=\"p\">.<\/span><span class=\"n\">Open<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">try<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5176\u4ed6\u903b\u8f91<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">finally<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">fs<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">((<\/span><span class=\"n\">IDisposable<\/span><span class=\"p\">)<\/span><span class=\"n\">fs<\/span><span class=\"p\">).<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c<code>using<\/code> \u5173\u952e\u5b57\u5e76\u6ca1\u6709\u642d\u914d\u82b1\u62ec\u53f7\u8fdb\u884c\u4f7f\u7528\u3002\u8fd9\u662f C# 8.0 \u4e2d\u65b0\u589e\u7684\u8bed\u6cd5\u7cd6\uff0c\u53ef\u4ee5\u8ba9\u6211\u4eec\u51cf\u5c11\u4e00\u5c42\u7f29\u8fdb\u3002\u5b83\u76f8\u5f53\u4e8e\u82b1\u62ec\u53f7\u6db5\u76d6\u4e86\u4ece <code>using<\/code> \u5173\u952e\u5b57\u5230\u4f5c\u7528\u57df\u7684\u7ed3\u675f\u8fd9\u4e2a\u8303\u56f4\u3002<\/div>\n<\/div>\n<p>\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c<code>using<\/code> \u8bed\u53e5\u5728\u7f16\u8bd1\u540e\u4f1a\u53d8\u6210\u4e00\u4e2a <code>try...finally<\/code> \u8bed\u53e5\u5757\uff0c\u786e\u4fdd\u4e86\u5728 <code>try<\/code> \u5757\u4e2d\u7684\u4ee3\u7801\u6267\u884c\u5b8c\u540e\uff0c\u65e0\u8bba\u662f\u5426\u51fa\u73b0\u5f02\u5e38\uff0c\u6700\u7ec8\u90fd\u4f1a\u6267\u884c <code>finally<\/code> \u5757\u4e2d\u7684\u4ee3\u7801\u3002<\/p>\n<p>\u4e8e\u662f\u6211\u4eec\u5c31\u53ef\u4ee5\u501f\u52a9\u8fd9\u4e2a\u8bed\u6cd5\u6765\u5b9e\u73b0\u4e00\u4e9b\u5ef6\u8fdf\u6267\u884c\u7684\u903b\u8f91\u4e86\uff0c\u5c24\u5176\u662f\u7c7b\u4f3c Go \u8bed\u8a00\u4e2d\u7684 <code>defer<\/code> \u8bed\u53e5\u3002Go \u8bed\u8a00\u4e2d\uff0c<code>defer<\/code> \u8bed\u53e5\u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u65f6\u6267\u884c\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">defer<\/span> <span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;defer&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;hello&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e8e\u662f\u6211\u4eec\u53ef\u4ee5\u4eff\u7167\u8fd9\u4e2a\u601d\u8def\uff0c\u5728 C# \u4e2d\u5b9e\u73b0\u4e00\u4e2a\u7c7b\u4f3c\u7684\u529f\u80fd\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Defer<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IDisposable<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Action<\/span> <span class=\"n\">_action<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Defer<\/span><span class=\"p\">(<\/span><span class=\"n\">Action<\/span> <span class=\"n\">action<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_action<\/span> <span class=\"p\">=<\/span> <span class=\"n\">action<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Dispose<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_action<\/span><span class=\"p\">?.<\/span><span class=\"n\">Invoke<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5b83\u5728\u6784\u5efa\u65f6\u4f1a\u4f20\u5165\u4e00\u4e2a <code>Action<\/code> \u59d4\u6258\uff0c\u8868\u793a\u9700\u8981\u5ef6\u8fdf\u6267\u884c\u7684\u903b\u8f91\u3002\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u50cf\u4e0b\u9762\u8fd9\u6837\u4f7f\u7528\u5b83\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">defer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Defer<\/span><span class=\"p\">(()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;defer&#34;<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;hello&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6240\u4ee5\u5bf9\u4e8e\u8fd9\u6837\u7684\u4e00\u4e2a\u7c7b\uff0c\u5373\u4fbf\u5b83\u5b9e\u73b0\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\uff0c\u6211\u4eec\u4e5f\u4e0d\u5fc5\u987b\u5728\u4f7f\u7528\u5b8c\u540e\uff0c\u624b\u52a8\u8c03\u7528\u5b83\u7684 <code>Dispose<\/code> \u65b9\u6cd5\u3002\u56e0\u4e3a\u5b83\u7684 <code>Dispose<\/code> \u65b9\u6cd5\u5e76\u4e0d\u6d89\u53ca\u8d44\u6e90\u7684\u91ca\u653e\uff0c\u800c\u53ea\u662f\u6267\u884c\u4e00\u4e9b\u5ef6\u8fdf\u903b\u8f91\u800c\u5df2\u3002<\/p>\n<h2 id=\"\u56e0\u4e3a\u57fa\u7c7b\u6216\u63a5\u53e3\u7684\u7ea6\u675f\u800c\u5b9e\u73b0-idisposable-\u63a5\u53e3\u7684\u7c7b\">\n\u56e0\u4e3a\u57fa\u7c7b\u6216\u63a5\u53e3\u7684\u7ea6\u675f\u800c\u5b9e\u73b0 IDisposable \u63a5\u53e3\u7684\u7c7b\n<a href=\"#%e5%9b%a0%e4%b8%ba%e5%9f%ba%e7%b1%bb%e6%88%96%e6%8e%a5%e5%8f%a3%e7%9a%84%e7%ba%a6%e6%9d%9f%e8%80%8c%e5%ae%9e%e7%8e%b0-idisposable-%e6%8e%a5%e5%8f%a3%e7%9a%84%e7%b1%bb\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9664\u4e86\u4e0a\u9762\u63d0\u5230\u7684\u4e3a\u4e86\u501f\u52a9 <code>using<\/code> \u8bed\u53e5\u6765\u5b9e\u73b0\u5ef6\u8fdf\u6267\u884c\u7684\u903b\u8f91\u5916\uff0c\u8fd8\u6709\u4e00\u4e9b\u7c7b\u5b9e\u73b0\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\uff0c\u4f46\u5e76\u4e0d\u6d89\u53ca\u8d44\u6e90\u7684\u91ca\u653e\u3002<\/p>\n<p>\u6211\u4eec\u90fd\u77e5\u9053\uff0cC# \u4e2d\u6709\u4e00\u4e9b\u539f\u751f\u7684\u6570\u636e\u6d41\uff0c\u6bd4\u5982 <code>FileStream<\/code>\u3001<code>MemoryStream<\/code>\u3001<code>GZipStream<\/code> \u7b49\u7b49\u3002\u5b83\u4eec\u7684\u57fa\u7c7b <code>Stream<\/code> \u5b9e\u73b0\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\uff0c\u5e76\u4e14\u5b83\u4eec\u6839\u636e\u81ea\u5df1\u7684\u5b9e\u9645\u60c5\u51b5\uff0c\u4e5f\u5404\u81ea\u63d0\u4f9b\u4e86\u5177\u4f53\u7684 <code>Dispose<\/code> \u65b9\u6cd5\u7684\u5b9e\u73b0\uff0c\u6bd4\u5982 <code>FileStream<\/code> \u4f1a\u5173\u95ed\u6587\u4ef6\u53e5\u67c4\uff0c\u4ece\u800c\u91ca\u653e\u6587\u4ef6\u8d44\u6e90\uff0c\u907f\u514d\u6587\u4ef6\u88ab\u5360\u7528\u3002<\/p>\n<p>\u4f46\u8fd9\u5176\u4e2d\u7684 <code>MemoryStream<\/code> \u5c31\u6709\u4e9b\u975e\u540c\u5bfb\u5e38\u4e86\u3002\u5b83\u867d\u7136\u662f\u4e00\u4e2a\u6570\u636e\u6d41\uff0c\u4f46\u5b83\u5e76\u4e0d\u6d89\u53ca\u8d44\u6e90\u7684\u91ca\u653e\u3002\u56e0\u4e3a\u5b83\u7684\u5e95\u5c42\u6570\u636e\u662f\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u7684\u4e00\u4e2a\u5b57\u8282\u6570\u7ec4\uff08<code>byte[]<\/code>\uff09\u4e2d\uff0c\u800c\u8fd9\u4e2a\u5b57\u8282\u6570\u7ec4\u662f\u4e00\u4e2a\u6258\u7ba1\u8d44\u6e90\u3002\u5728\u5b83\u7684\u6e90\u4ee3\u7801\u4e2d\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MemoryStream<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Stream<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">_buffer<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ Either allocated internally or externally.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">_origin<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ For user-provided arrays, start at this origin<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">_position<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ read\/write head.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">_length<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ Number of bytes within the memory stream<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">_capacity<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ length of usable portion of buffer for stream<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_expandable<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ User-provided buffers aren&#39;t expandable.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_writable<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ Can user write to this stream?<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_exposable<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ Whether the array can be returned to the user.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_isOpen<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ Is this stream open or closed?<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">protected<\/span> <span class=\"kd\">override<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Dispose<\/span><span class=\"p\">(<\/span><span class=\"kt\">bool<\/span> <span class=\"n\">disposing<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">disposing<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isOpen<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_writable<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_expandable<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Don&#39;t set buffer to null - allow TryGetBuffer, GetBuffer &amp; ToArray to work.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_lastReadTask<\/span> <span class=\"p\">=<\/span> <span class=\"k\">default<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6240\u4ee5\u5bf9\u4e8e <code>MemoryStream<\/code> \u8fd9\u6837\u7684 <code>Dispose<\/code> \u65b9\u6cd5\u5e76\u4e0d\u6d89\u53ca\u8d44\u6e90\u91ca\u653e\u7684\u7c7b\u578b\uff0c\u5373\u4fbf\u6211\u4eec\u4e0d\u8c03\u7528\u5b83\u7684 <code>Dispose<\/code> \u65b9\u6cd5\uff0c\u4e5f\u4e0d\u4f1a\u9020\u6210\u8d44\u6e90\u6cc4\u6f0f\u3002\u5f53\u7136\u4e86\uff0c\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u751a\u81f3\u4e0d\u5e94\u8be5\u53bb\u505a\u8fd9\u4ef6\u4e8b\u60c5\uff0c\u56e0\u4e3a\u89c4\u8303\u7684\u5f00\u53d1\u4e60\u60ef\u4ecd\u65e7\u662f\u53ef\u4ee5\u4e3a\u6211\u4eec\u7684\u4ee3\u7801\u5e26\u6765\u66f4\u597d\u7684\u53ef\u8bfb\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u7684\u3002<\/p>\n<h2 id=\"\u5728\u7279\u5b9a\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e0d\u8c03\u7528-dispose-\u65b9\u6cd5\u7684\u7c7b\">\n\u5728\u7279\u5b9a\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e0d\u8c03\u7528 Dispose \u65b9\u6cd5\u7684\u7c7b\n<a href=\"#%e5%9c%a8%e7%89%b9%e5%ae%9a%e6%83%85%e5%86%b5%e4%b8%8b%e5%8f%af%e4%bb%a5%e4%b8%8d%e8%b0%83%e7%94%a8-dispose-%e6%96%b9%e6%b3%95%e7%9a%84%e7%b1%bb\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6709\u4e9b\u7c7b\u63d0\u4f9b\u4e86 <code>Dispose<\/code> \u65b9\u6cd5\uff0c\u4f46\u662f\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u5bf9\u8fd9\u4e00\u65b9\u6cd5\u7684\u8c03\u7528\u5e76\u4e0d\u662f\u81f3\u5173\u91cd\u8981\u7684\u3002\u8fd9\u91cc\u6709\u4e00\u4e2a\u5178\u578b\u7684\u4f8b\u5b50\u5c31\u662f\u6211\u4eec\u5728\u5f02\u6b65\u7f16\u7a0b\u4e2d\u5e38\u89c1\u7684 <code>CancellationTokenSource<\/code>\uff08\u4e0b\u9762\u7b80\u79f0\u4e3a CTS\uff09\u3002<\/p>\n<p>\u9996\u5148\u6211\u4eec\u6765\u5199\u4e00\u4e2a\u7b80\u5355\u7684\u4ee3\u7801\uff0c\u5e76\u89c2\u5bdf\u5b83\u5728\u8fd0\u884c\u65f6\u7684\u5185\u5b58\u5360\u7528\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"p\">&lt;<\/span> <span class=\"m\">100000000<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span><span class=\"p\">++)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">cts<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">CancellationTokenSource<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd0\u884c\u540e\u6211\u4eec\u4f1a\u53d1\u73b0\uff0c\u5185\u5b58\u51e0\u4e4e\u6ca1\u6709\u4efb\u4f55\u53d8\u5316\u3002\u8fd9\u662f\u5426\u610f\u5473\u7740\uff0cCTS \u7684 <code>Dispose<\/code> \u65b9\u6cd5\u5e76\u4e0d\u91cd\u8981\u5462\uff1f\u5176\u5b9e\u5e76\u4e0d\u662f\uff0c\u4f46\u662f\u5728\u4e0a\u9762\u7684\u8fd9\u4e2a\u7528\u6cd5\u4e2d\uff0c\u8c03\u7528\u4e0e\u5426\u786e\u5b9e\u6ca1\u6709\u592a\u5927\u7684\u533a\u522b\u3002\u8fd9\u662f\u600e\u4e48\u56de\u4e8b\u5462\uff1f<\/p>\n<p>\u6211\u4eec\u6765\u89c2\u5bdf CTS \u7684 <code>Dispose<\/code> \u65b9\u6cd5\u7684\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">protected<\/span> <span class=\"k\">virtual<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Dispose<\/span><span class=\"p\">(<\/span><span class=\"kt\">bool<\/span> <span class=\"n\">disposing<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">disposing<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"p\">!<\/span><span class=\"n\">_disposed<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ITimer<\/span><span class=\"p\">?<\/span> <span class=\"n\">timer<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_timer<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">timer<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_timer<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">timer<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_registrations<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_kernelEvent<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ManualResetEvent<\/span><span class=\"p\">?<\/span> <span class=\"n\">mre<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Interlocked<\/span><span class=\"p\">.<\/span><span class=\"n\">Exchange<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">ManualResetEvent<\/span><span class=\"p\">?&gt;(<\/span><span class=\"k\">ref<\/span> <span class=\"n\">_kernelEvent<\/span><span class=\"p\">!,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">mre<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">_state<\/span> <span class=\"p\">!=<\/span> <span class=\"n\">States<\/span><span class=\"p\">.<\/span><span class=\"n\">NotifyingState<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">mre<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_disposed<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53ef\u4ee5\u53d1\u73b0\uff0c\u8fd9\u91cc\u5b83\u5bf9\u4e24\u4e2a\u201c\u53ef\u6709\u53ef\u65e0\u201d\u7684\u5bf9\u8c61\u8fdb\u884c\u4e86\u56de\u6536\uff0c\u5206\u522b\u662f\uff1a<\/p>\n<ul>\n<li><code>_timer<\/code>\uff1a\u4e00\u4e2a <code>ITimer<\/code> \u5bf9\u8c61\uff0c\u8868\u793a\u4e00\u4e2a\u5b9a\u65f6\u5668<\/li>\n<li><code>_kernelEvent<\/code>\uff1a\u4e00\u4e2a <code>ManualResetEvent<\/code> \u5bf9\u8c61\uff0c\u662f\u4e00\u4e2a\u4fe1\u53f7\u91cf<\/li>\n<\/ul>\n<p>\u5b83\u4eec\u5206\u522b\u662f\u505a\u4ec0\u4e48\u7528\u7684\u5462\uff1f\u9996\u5148\u6211\u4eec\u6765\u770b\u5b9a\u65f6\u5668\u3002\u6211\u4eec\u77e5\u9053\uff0cCTS \u63d0\u4f9b\u4e86\u5ef6\u65f6\u81ea\u52a8\u53d6\u6d88\u7684\u529f\u80fd\u3002\u6bd4\u5982\u6211\u4eec\u5e0c\u671b\u5728 5 \u79d2\u540e\u81ea\u52a8\u53d6\u6d88\uff0c\u90a3\u4e48\u5b9e\u73b0\u65b9\u6cd5\u53ef\u4ee5\u662f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">delay<\/span> <span class=\"p\">=<\/span> <span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"m\">5<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">cts<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">CancellationTokenSource<\/span><span class=\"p\">(<\/span><span class=\"n\">delay<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6216\u8005\u4e5f\u53ef\u4ee5\u5728\u521b\u5efa\u540e\u8c03\u7528 CancelAfter \u65b9\u6cd5<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6b64\u65f6\uff0cCTS \u5185\u90e8\u5c31\u4f1a\u521b\u5efa\u8fd9\u4e2a\u5b9a\u65f6\u5668\uff0c\u4ece\u800c\u5b9e\u73b0\u8fd9\u4e2a\u529f\u80fd\u3002\u5728\u8fd9\u4e00\u60c5\u51b5\u4e0b\uff0c\u5c31\u4f1a\u4ea7\u751f\u9700\u8981\u6211\u4eec\u53bb\u91ca\u653e\u7684\u8d44\u6e90\u4e86\u3002<\/p>\n<p>\u53e6\u5916\u4e00\u4e2a\u4fe1\u53f7\u91cf\u53c8\u662f\u600e\u4e48\u56de\u4e8b\u5462\uff1f<\/p>\n<p>\u6211\u4eec\u90fd\u77e5\u9053\uff0cCTS \u73b0\u5728\u5e38\u7528\u4e8e\u5f02\u6b65\u7f16\u7a0b\u3002\u5b83\u7684 <code>CancellationToken<\/code> \u53ef\u4ee5\u4f20\u7ed9\u6807\u51c6\u5e93\u63d0\u4f9b\u7684 <code>Async<\/code> \u7ed3\u5c3e\u7684\u65b9\u6cd5\uff0c\u4ece\u800c\u5b9e\u73b0\u4efb\u52a1\u7684\u53d6\u6d88\u3002\u4f46\u662f\u4e00\u4e9b\u8001\u7684\u5e93\u51fd\u6570\u53ef\u80fd\u5e76\u4e0d\u652f\u6301 <code>CancellationToken<\/code>\uff0c\u8fd9\u65f6\u5019\u6211\u4eec\u5c31\u53ef\u4ee5\u501f\u52a9 <code>token<\/code> \u4e0a\u7684\u8fd9\u4e2a <code>WaitHandle<\/code> \u6765\u5b9e\u73b0\u4efb\u52a1\u7684\u53d6\u6d88\u4e86\u3002\u4e0b\u9762\u662f CTS \u4e2d\u5173\u4e8e <code>WaitHandle<\/code> \u5c5e\u6027\u7684\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">internal<\/span> <span class=\"n\">WaitHandle<\/span> <span class=\"n\">WaitHandle<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ThrowIfDisposed<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Return the handle if it was already allocated.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_kernelEvent<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">_kernelEvent<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Lazily-initialize the handle.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">mre<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ManualResetEvent<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">Interlocked<\/span><span class=\"p\">.<\/span><span class=\"n\">CompareExchange<\/span><span class=\"p\">(<\/span><span class=\"k\">ref<\/span> <span class=\"n\">_kernelEvent<\/span><span class=\"p\">,<\/span> <span class=\"n\">mre<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">mre<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">IsCancellationRequested<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_kernelEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">Set<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">_kernelEvent<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53ef\u4ee5\u53d1\u73b0\uff0c\u5b83\u9ed8\u8ba4\u662f\u6ca1\u6709\u503c\u7684\uff1b\u5f53\u6211\u4eec\u7b2c\u4e00\u6b21\u8bbf\u95ee\u5b83\u65f6\uff0c\u5b83\u4fbf\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\uff0c\u5e76\u8fd4\u56de\u5b83\u3002\u8fd9\u6837\u7684\u64cd\u4f5c\u5c31\u4f1a\u4ea7\u751f\u4e00\u4e2a\u9700\u8981\u6211\u4eec\u53bb\u91ca\u653e\u8d44\u6e90\u7684\u5bf9\u8c61\u3002\u6211\u4eec\u53ef\u4ee5\u505a\u8fd9\u6837\u7684\u4e00\u4e2a\u5b9e\u9a8c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"p\">&lt;<\/span> <span class=\"m\">100000000<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span><span class=\"p\">++)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">cts<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">CancellationTokenSource<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">handle<\/span> <span class=\"p\">=<\/span> <span class=\"n\">cts<\/span><span class=\"p\">.<\/span><span class=\"n\">Token<\/span><span class=\"p\">.<\/span><span class=\"n\">WaitHandle<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\"><code>WaitHandle<\/code> \u5728 CTS \u4e0a\u662f <code>internal<\/code> \u7684\uff0c\u6211\u4eec\u53ea\u80fd\u4e5f\u5e94\u5f53\u5728 <code>CancellationToken<\/code> \u4e0a\u53bb\u8bbf\u95ee\uff0c\u56e0\u4e3a\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u4f20\u7ed9\u65b9\u6cd5\u7684\u53c2\u6570\u5e76\u4e0d\u662f CTS \u5bf9\u8c61\u672c\u8eab\uff0c\u800c\u662f\u5b83\u7684 <code>Token<\/code>\u3002<\/div>\n<\/div>\n<p>\u7136\u540e\u8fd0\u884c\u7a0b\u5e8f\uff0c\u5c31\u4f1a\u53d1\u73b0\u5185\u5b58\u5728\u4e0d\u65ad\u589e\u52a0\u3002\u53ea\u8981\u6211\u4eec\u8c03\u7528\u4e86 <code>CTS<\/code> \u7684 <code>Dispose<\/code> \u65b9\u6cd5\uff0c\u5185\u5b58\u4fbf\u4f1a\u4e0d\u518d\u4e0a\u5347\u3002<\/p>\n<p>\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u7ed3\u8bba\uff1a\u5982\u679c\u6211\u4eec\u5728\u4f7f\u7528 CTS \u65f6\uff0c\u65e2\u4e0d\u4f7f\u7528\u5ef6\u65f6\u81ea\u52a8\u53d6\u6d88\u7684\u529f\u80fd\uff0c\u4e5f\u4e0d\u4f7f\u7528 <code>WaitHandle<\/code> \u5c5e\u6027\uff0c\u90a3\u4e48\u6211\u4eec\u4e0d\u8c03\u7528 <code>Dispose<\/code> \u65b9\u6cd5\u4e5f\u4e0d\u4f1a\u9020\u6210\u8d44\u6e90\u7684\u6cc4\u6f0f\u3002<\/p>\n<h2 id=\"\u867d\u7136\u63d0\u4f9b\u4e86-dispose-\u65b9\u6cd5\u4f46\u4e0d\u5e94\u8be5\u7528\u5b8c\u7acb\u5373\u91ca\u653e\u7684\u7c7b\">\n\u867d\u7136\u63d0\u4f9b\u4e86 Dispose \u65b9\u6cd5\uff0c\u4f46\u4e0d\u5e94\u8be5\u7528\u5b8c\u7acb\u5373\u91ca\u653e\u7684\u7c7b\n<a href=\"#%e8%99%bd%e7%84%b6%e6%8f%90%e4%be%9b%e4%ba%86-dispose-%e6%96%b9%e6%b3%95%e4%bd%86%e4%b8%8d%e5%ba%94%e8%af%a5%e7%94%a8%e5%ae%8c%e7%ab%8b%e5%8d%b3%e9%87%8a%e6%94%be%e7%9a%84%e7%b1%bb\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd8\u6709\u4e00\u79cd\u60c5\u51b5\u662f\uff0c\u867d\u7136\u7c7b\u5b9e\u73b0\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\uff0c\u4f46\u6211\u4eec\u5e76\u4e0d\u5e94\u8be5\u5728\u7528\u5b8c\u540e\u7acb\u5373\u91ca\u653e\u5b83\u3002\u5b83\u88ab\u8bbe\u8ba1\u51fa\u6765\u5c31\u662f\u5e0c\u671b\u6211\u4eec\u80fd\u591f\u590d\u7528\u7684\u3002\u5178\u578b\u7684\u4f8b\u5b50\u5c31\u662f <code>HttpClient<\/code>\u3002<\/p>\n<p>\u6bd4\u5982\u4e0b\u9762\u8fd9\u4e2a\u9519\u8bef\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">urls<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;https:\/\/www.baidu.com&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;https:\/\/www.sogou.com&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;https:\/\/www.sohu.com&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">url<\/span> <span class=\"k\">in<\/span> <span class=\"n\">urls<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">client<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">HttpClient<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"n\">GetAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">url<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u4f8b\u5b50\u5c31\u662f\u4e00\u4e2a\u9519\u8bef\u7684\u7528\u6cd5\u3002\u6b63\u786e\u7684\u505a\u6cd5\u5e94\u8be5\u662f\u5c06 <code>HttpClient<\/code> \u7684\u58f0\u660e\u79fb\u52a8\u5230\u5faa\u73af\u5916\u90e8\uff0c\u6216\u8005\u8fd8\u53ef\u4ee5\u58f0\u660e\u4e3a\u4e00\u4e2a\u9759\u6001\u5bf9\u8c61\u7b49\u3002\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462\uff1f<\/p>\n<p>\u7b80\u5355\u6765\u8bf4\uff0c<code>HttpClient<\/code> \u5e95\u5c42\u4f1a\u4f7f\u7528 <code>HttpClientHandler<\/code> \u53bb\u5904\u7406\u6d89\u53ca\u5230\u8fde\u63a5\u6c60\u3001Socket\u3001TCP \u8fde\u63a5\u7b49\u8d44\u6e90\u7684\u7ba1\u7406\u3002TCP \u8fde\u63a5\u56e0\u4e3a\u6bd4\u8f83\u6602\u8d35\uff08\u6bd4\u5982\u6709\u4e09\u6b21\u63e1\u624b\u3001\u56db\u6b21\u6325\u624b\u7b49\uff09\uff0c\u6240\u4ee5\u5b83\u901a\u5e38\u4f1a\u88ab\u590d\u7528\u3002\u5f53\u6211\u4eec\u4f7f\u7528 <code>HttpClient<\/code> \u53bb\u8bbf\u95ee\u4e00\u4e2a\u94fe\u63a5\u65f6\uff0c\u8bbf\u95ee\u7ed3\u675f\u540e\u8fd9\u4e2a TCP \u8fde\u63a5\u5e76\u4e0d\u4f1a\u7acb\u5373\u5173\u95ed\uff0c\u800c\u662f\u4f1a\u88ab\u653e\u5165\u8fde\u63a5\u6c60\u4e2d\uff0c\u7b49\u5f85\u4e0b\u6b21\u7684\u590d\u7528\u3002<\/p>\n<p>\u4f46\u662f\uff0c\u5982\u679c\u6211\u4eec\u5728\u6bcf\u6b21\u8bf7\u6c42\u65f6\u90fd\u521b\u5efa\u4e00\u4e2a\u65b0\u7684 <code>HttpClient<\/code> \u5bf9\u8c61\uff0c\u90a3\u4e48\u8fd9\u4e2a TCP \u8fde\u63a5\u5c31\u4f1a\u5360\u636e\u8fde\u63a5\u6c60\u4e2d\u7684\u4e00\u4e2a\u4f4d\u7f6e\uff0c\u8fd8\u6709\u672c\u5730\u7aef\u53e3\u7b49\u8d44\u6e90\uff0c\u6700\u7ec8\u53ef\u80fd\u4f1a\u5bfc\u81f4\u8fde\u63a5\u6c60\u6216\u672c\u5730\u7aef\u53e3\u7684\u8017\u5c3d\uff0c\u8fdb\u800c\u629b\u51fa <code>SocketException<\/code> \u7b49\u5f02\u5e38\u3002<\/p>\n<p>\u56e0\u4e3a <code>HttpClient<\/code> \u662f\u4e00\u4e2a\u5305\u88c5\u597d\u7684\u529f\u80fd\u76f8\u5f53\u7075\u6d3b\u7684\u7c7b\uff0c\u56e0\u6b64\u6211\u4eec\u5b8c\u5168\u53ef\u4ee5\u53ea\u521b\u5efa\u4e00\u4e2a\uff0c\u5e76\u4e14\u591a\u6b21\u4f7f\u7528\u3002\u4e0d\u7ba1\u6211\u4eec\u8bbf\u95ee\u7684\u94fe\u63a5\u662f\u5426\u53ef\u4ee5\u590d\u7528\uff0c\u600e\u4e48\u590d\u7528\uff0c\u4fdd\u6301\u8fde\u63a5\u72b6\u6001\u591a\u4e45\uff0c\u90fd\u4f1a\u88ab\u5b83\u59a5\u5584\u5904\u7406\u3002\u6240\u4ee5\u5bf9\u4e8e\u4e00\u4e2a\u672c\u5730\u9879\u76ee\uff08\u5982\u63a7\u5236\u53f0\u5e94\u7528\u3001WPF \u5e94\u7528\u7b49\uff09\uff0c\u6211\u4eec\u5b8c\u5168\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a\u5355\u4f8b\u5e76\u5904\u5904\u4f7f\u7528\u5b83\u3002<\/p>\n<p>\u5982\u679c\u6211\u4eec\u5728\u9879\u76ee\u4e2d\u8fd8\u4f7f\u7528\u4e86 DI \u5bb9\u5668\uff08\u6bd4\u5982\u5fae\u8f6f\u5b98\u65b9\u63d0\u4f9b\u7684 <code>Microsoft.Extensions.DependencyInjection<\/code>\uff09\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u5c06 <code>HttpClient<\/code> \u6ce8\u518c\u4e3a\u4e00\u4e2a\u5355\u4f8b\u7684\u670d\u52a1\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6574\u4e2a\u9879\u76ee\u4e2d\u590d\u7528\u5b83\u4e86\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">services<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ServiceCollection<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddSingleton<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">HttpClient<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">serviceProvider<\/span> <span class=\"p\">=<\/span> <span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">BuildServiceProvider<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">client<\/span> <span class=\"p\">=<\/span> <span class=\"n\">serviceProvider<\/span><span class=\"p\">.<\/span><span class=\"n\">GetService<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">HttpClient<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5f53\u7136\u4e86\uff0c\u8fd9\u4e2a\u65b9\u5f0f\u5e76\u4e0d\u662f\u6700\u63a8\u8350\u7684\u65b9\u5f0f\uff08\u4e0d\u8fc7\u5bf9\u4e8e\u7b80\u5355\u7684\u672c\u5730\u9879\u76ee\u6765\u8bf4\u662f\u53ef\u53d6\u7684\uff09\u3002\u5bf9\u4e8e\u590d\u6742\u4e9b\u7684\u9879\u76ee\uff0c\u6211\u4eec\u66f4\u5e94\u8be5\u8003\u8651\u7684\u65b9\u5f0f\u662f\u4f7f\u7528 <code>HttpClientFactory<\/code>\u3002\u8981\u4f7f\u7528\u5b83\uff0c\u6211\u4eec\u8fd8\u8981\u5f15\u5165\u4e00\u4e2a\u5305\uff1a<code>Microsoft.Extentions.Http<\/code>\uff08\u63a7\u5236\u53f0\u6216 WPF \u7b49\u672c\u5730\u7a0b\u5e8f\u901a\u5e38\u9700\u8981\uff0c\u800c <code>ASP.NET Core<\/code> \u9879\u76ee\u4f1a\u81ea\u52a8\u5f15\u5165\u5b83\uff0c\u56e0\u6b64\u5c31\u4e0d\u9700\u8981\u989d\u5916\u5b89\u88c5\u5305\u4e86\uff09\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u4f7f\u7528\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">services<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ServiceCollection<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddHttpClient<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">serviceProvider<\/span> <span class=\"p\">=<\/span> <span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">BuildServiceProvider<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">factory<\/span> <span class=\"p\">=<\/span> <span class=\"n\">serviceProvider<\/span><span class=\"p\">.<\/span><span class=\"n\">GetService<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">IHttpClientFactory<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">client<\/span> <span class=\"p\">=<\/span> <span class=\"n\">factory<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateClient<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5bf9\u4e8e\u66f4\u52a0\u590d\u6742\u7684\u60c5\u51b5\uff0c\u6bd4\u5982\u6211\u4eec\u5e0c\u671b\u4e3a\u4e0d\u540c\u7684\u670d\u52a1\u7c7b\u6ce8\u5165\u914d\u7f6e\u4e0d\u540c\u7684 <code>HttpClient<\/code>\uff08\u6bd4\u5982\u4e0d\u540c\u7684 BaseAddress\u3001Header\u3001Timeout \u7b49\uff09\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>AddHttpClient<\/code> \u7684\u201c\u547d\u540d\u5ba2\u6237\u7aef\u201d\u7684\u65b9\u6cd5\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">services<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ServiceCollection<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddHttpClient<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;baidu&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">c<\/span> <span class=\"p\">=&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">c<\/span><span class=\"p\">.<\/span><span class=\"n\">BaseAddress<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Uri<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;https:\/\/www.baidu.com&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">c<\/span><span class=\"p\">.<\/span><span class=\"n\">Timeout<\/span> <span class=\"p\">=<\/span> <span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"m\">30<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">});<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddHttpClient<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;sogou&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">c<\/span> <span class=\"p\">=&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">c<\/span><span class=\"p\">.<\/span><span class=\"n\">BaseAddress<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Uri<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;https:\/\/www.sogou.com&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">c<\/span><span class=\"p\">.<\/span><span class=\"n\">DefaultRequestHeaders<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;User-Agent&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/58.0.3029.110 Safari\/537.3&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">});<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">serviceProvider<\/span> <span class=\"p\">=<\/span> <span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">BuildServiceProvider<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">factory<\/span> <span class=\"p\">=<\/span> <span class=\"n\">serviceProvider<\/span><span class=\"p\">.<\/span><span class=\"n\">GetService<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">IHttpClientFactory<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">baiduClient<\/span> <span class=\"p\">=<\/span> <span class=\"n\">factory<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateClient<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;baidu&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sogouClient<\/span> <span class=\"p\">=<\/span> <span class=\"n\">factory<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateClient<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;sogou&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u4e3a\u4e0d\u540c\u7684\u670d\u52a1\u7c7b\u6ce8\u5165\u4e0d\u540c\u7684 <code>HttpClient<\/code> \u4e86\u3002\u5173\u4e8e <code>HttpClientFactory<\/code> \u7684\u66f4\u591a\u7528\u6cd5\uff0c\u53ef\u4ee5\u53c2\u8003<a class=\"link\" href=\"https:\/\/learn.microsoft.com\/zh-cn\/aspnet\/core\/fundamentals\/http-requests?view=aspnetcore-9.0\" target=\"_blank\" rel=\"noopener\"\n>\u5b98\u65b9\u7684\u6559\u7a0b<\/a>\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u8ba8\u8bba\u4e86\u5728 C# \u4e2d\u662f\u5426\u9700\u8981\u603b\u662f\u8c03\u7528 <code>Dispose<\/code> \u65b9\u6cd5\u7684\u95ee\u9898\u3002\u6211\u4eec\u901a\u8fc7\u51e0\u4e2a\u5178\u578b\u7684\u4f8b\u5b50\uff0c\u6765\u770b\u770b\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e0d\u8c03\u7528 <code>Dispose<\/code> \u65b9\u6cd5\uff0c\u5e76\u4ece\u5e95\u5c42\u7684\u539f\u7406\u51fa\u53d1\uff0c\u7ed9\u5927\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u5224\u65ad\u662f\u5426\u6709\u5fc5\u8981\u8c03\u7528 <code>Dispose<\/code> \u65b9\u6cd5\u7684\u601d\u8def\u3002<\/p>\n<p>\u5728\u5b9e\u9645\u7684\u5f00\u53d1\u4e2d\uff0c\u4e0e\u5176\u8bf4\u6211\u4eec\u9700\u8981\u5206\u8fa8\u51fa\u54ea\u4e9b\u5bf9\u8c61\u662f\u53ef\u4ee5\u4e0d\u7528\u91ca\u653e\u7684\uff0c\u4e0d\u5982\u8bf4\u6211\u4eec\u5e94\u5f53\u660e\u767d\u5982\u4f55\u5bf9\u8fd9\u4e00\u64cd\u4f5c\u7684\u5fc5\u8981\u6027\u8fdb\u884c\u6b63\u786e\u7684\u5224\u65ad\uff0c\u5e76\u517b\u6210\u7edf\u4e00\u4e14\u89c4\u8303\u7684\u5f00\u53d1\u4e60\u60ef\u3002\u8fd9\u6837\u4e0d\u7ba1\u662f\u5bf9\u56e2\u961f\u7684\u5176\u4ed6\u5f00\u53d1\u8005\uff0c\u8fd8\u662f\u672a\u6765\u7684\u81ea\u5df1\uff0c\u90fd\u662f\u6709\u597d\u5904\u7684\u3002<\/p>"},{"title":"\u5728\u591a\u7ebf\u7a0b\u5f00\u53d1\u4e2d\u7528\u4fe1\u53f7\u91cf\u4ee3\u66ff\u8f6e\u8be2\u548c\u6807\u5fd7\u4f4d","link":"https:\/\/blog.coldwind.top\/posts\/use-signal-over-polling-flags\/","pubDate":"Wed, 02 Apr 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/use-signal-over-polling-flags\/","description":"<blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1e7o2YTEpi\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<p>\u6211\u4eec\u5728\u591a\u7ebf\u7a0b\u5f00\u53d1\u4e2d\uff0c\u7ecf\u5e38\u4f1a\u7528\u5230\u6807\u5fd7\u4f4d\u548c\u8f6e\u8be2\uff0c\u4ece\u800c\u63a7\u5236\u4e00\u4e2a\u7ebf\u7a0b\u4e2d\u7684\u6267\u884c\u903b\u8f91\u3002\u4f46\u662f\u8fd9\u6837\u7684\u65b9\u5f0f\u4f1a\u5bfc\u81f4\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u4e0b\u964d\uff0c\u5e76\u4e14\u4e5f\u4e0d\u591f\u4f18\u96c5\u3002\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u6765\u770b\u4e00\u770b\u5982\u4f55\u7528\u4fe1\u53f7\u91cf\u7b49\u673a\u5236\u6765\u66ff\u4ee3\u8f6e\u8be2\u6807\u5fd7\u4f4d\u7684\u65b9\u5f0f\uff0c\u4ece\u800c\u5b9e\u73b0\u7ebf\u7a0b\u95f4\u7684\u901a\u4fe1\u548c\u63a7\u5236\u3002<\/p>\n<h2 id=\"\u4f20\u7edf\u65b9\u5f0f\">\n\u4f20\u7edf\u65b9\u5f0f\n<a href=\"#%e4%bc%a0%e7%bb%9f%e6%96%b9%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6211\u4eec\u6765\u770b\u4e00\u770b\u4f20\u7edf\u7684\u6807\u5fd7\u4f4d\u548c\u8f6e\u8be2\u662f\u600e\u4e48\u4e00\u56de\u4e8b\u3002\u8fd9\u91cc\u6211\u4eec\u7528\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u6765\u63a2\u8ba8\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">volatile<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_shouldStop<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">?<\/span> <span class=\"n\">_workerThread<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Start<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">(<\/span><span class=\"n\">Worker<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_shouldStop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Stop<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_shouldStop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">?.<\/span><span class=\"n\">Join<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Worker<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">_shouldStop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6267\u884c\u4e00\u4e9b\u5de5\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"m\">50<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u6a21\u62df\u5de5\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0a\u9762\u5c31\u662f\u4e00\u4e2a\u5178\u578b\u7684\u4f8b\u5b50\u3002\u8fd9\u91cc\uff0c<code>_shouldStop<\/code> \u662f\u4e00\u4e2a\u6807\u5fd7\u4f4d\uff0c\u8868\u793a\u7ebf\u7a0b\u662f\u5426\u9700\u8981\u505c\u6b62\u3002\u6211\u4eec\u5728 <code>Start<\/code> \u548c <code>Stop<\/code> \u65b9\u6cd5\u4e2d\u5206\u522b\u8bbe\u7f6e\u548c\u8bfb\u53d6\u8fd9\u4e2a\u6807\u5fd7\u4f4d\uff0c\u5e76\u5728 <code>Worker<\/code> \u65b9\u6cd5\u4e2d\uff0c\u901a\u8fc7\u8f6e\u8be2\u5b83\u6765\u5224\u65ad\u7ebf\u7a0b\u662f\u5426\u9700\u8981\u7ee7\u7eed\u6267\u884c\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u4e0a\u9762\u7684\u6807\u5fd7\u4f4d <code>_shouldStop<\/code> \u662f <code>volatile<\/code> \u7684\uff0c\u8fd9\u6837\u505a\u80fd\u591f\u4fdd\u8bc1\u7f16\u8bd1\u5668\u4e0d\u4f1a\u5bf9\u5176\u8fdb\u884c\u4f18\u5316\uff0c\u4ece\u800c\u4fdd\u8bc1\u6bcf\u6b21\u8bfb\u53d6\u90fd\u662f\u6700\u65b0\u7684\u503c\u3002\u5176\u5b9e\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u5982\u679c\u6211\u4eec\u7684\u8f6e\u8be2\u4e2d\u5305\u542b\u4e86 <code>Thread.Sleep<\/code> \u7b49\u64cd\u4f5c\uff0c\u90a3\u4e48\u5373\u4fbf\u4e0d\u52a0 <code>volatile<\/code>\uff0c\u4e5f\u4f9d\u65e7\u662f\u53ef\u4ee5\u8bfb\u5230\u6700\u65b0\u7684\u503c\u7684\u3002<\/div>\n<\/div>\n<div class=\"notice warning\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"><\/i>Warning\n<\/div>\n<div class=\"notice-content\">\u6ce8\u610f\uff0c\u8fd9\u91cc\u6211\u4eec\u53ea\u662f\u7528\u7b80\u5355\u7684\u4ee3\u7801\u5927\u6982\u4ecb\u7ecd\u601d\u8def\uff0c\u5e76\u6ca1\u6709\u63d0\u4f9b\u4e00\u4e2a\u7a33\u5065\u7684\u5b9e\u73b0\u3002\u6bd4\u5982\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u5e76\u6ca1\u6709\u5904\u7406\u7528\u6237\u591a\u6b21\u8c03\u7528 <code>Start<\/code> \u65b9\u6cd5\uff0c\u4e5f\u6ca1\u6709\u5904\u7406\u7ebf\u7a0b\u5f02\u5e38\u7b49\u60c5\u51b5\u3002<\/div>\n<\/div>\n<p>\u5982\u679c\u6211\u4eec\u60f3\u5728\u4e0a\u9762\u7684\u57fa\u7840\u4e0a\u518d\u6dfb\u52a0\u6682\u505c\u548c\u7ee7\u7eed\u7684\u529f\u80fd\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u9700\u8981\u6dfb\u52a0\u66f4\u591a\u7684\u6807\u5fd7\u4f4d\u548c\u8f6e\u8be2\u903b\u8f91\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><span class=\"lnt\">40\n<\/span><span class=\"lnt\">41\n<\/span><span class=\"lnt\">42\n<\/span><span class=\"lnt\">43\n<\/span><span class=\"lnt\">44\n<\/span><span class=\"lnt\">45\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">volatile<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_shouldStop<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">volatile<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_isRunning<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">?<\/span> <span class=\"n\">_workerThread<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Start<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">(<\/span><span class=\"n\">Worker<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_shouldStop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunning<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Stop<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_shouldStop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">?.<\/span><span class=\"n\">Join<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Pause<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunning<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Resume<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunning<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Worker<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">_shouldStop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_isRunning<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6267\u884c\u4e00\u4e9b\u5de5\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"m\">50<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u6682\u505c\u65f6\u4e5f\u8981\u4f11\u7720\uff0c\u907f\u514d CPU \u5360\u7528\u8fc7\u9ad8<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u7ecf\u5178\u7684\u4e24\u4e2a\u6807\u5fd7\u4f4d\">\n\u7ecf\u5178\u7684\u4e24\u4e2a\u6807\u5fd7\u4f4d\n<a href=\"#%e7%bb%8f%e5%85%b8%e7%9a%84%e4%b8%a4%e4%b8%aa%e6%a0%87%e5%bf%97%e4%bd%8d\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u73b0\u5728\u6211\u4eec\u6765\u770b\u4e00\u770b\u5982\u4f55\u4f7f\u7528\u4fe1\u53f7\u91cf\u6765\u66ff\u4ee3\u6807\u5fd7\u4f4d\u3002<\/p>\n<h3 id=\"\u7528-manualresetevent-\u5b9e\u73b0\u7ebf\u7a0b\u7684\u6682\u505c\u548c\u7ee7\u7eed\">\n\u7528 <code>ManualResetEvent<\/code> \u5b9e\u73b0\u7ebf\u7a0b\u7684\u6682\u505c\u548c\u7ee7\u7eed\n<a href=\"#%e7%94%a8-manualresetevent-%e5%ae%9e%e7%8e%b0%e7%ba%bf%e7%a8%8b%e7%9a%84%e6%9a%82%e5%81%9c%e5%92%8c%e7%bb%a7%e7%bb%ad\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u6211\u4eec\u5148\u6765\u601d\u8003\u4e00\u4e0b\uff0c\u4e0a\u9762\u7684 <code>_isRunning<\/code> \u7684\u4f5c\u7528\u548c\u6548\u679c\u662f\u4ec0\u4e48\u3002\u6211\u4eec\u60f3\u7528\u5b83\u7684\u503c\u6765\u63a7\u5236\u7ebf\u7a0b\u662f\u5426\u8981\u6267\u884c\u64cd\u4f5c\uff0c\u4f46\u662f\u6211\u4eec\u4e0d\u80fd\u5728\u5b83\u53d1\u751f\u53d8\u5316\u65f6\u7acb\u523b\u5f97\u5230\u901a\u77e5\uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u80fd\u6bcf\u9694\u4e00\u6bb5\u65f6\u95f4\u53bb\u8f6e\u8be2\u4e00\u4e0b\u3002\u90a3\u4e48\uff0c\u5982\u679c\u6709\u529e\u6cd5\u80fd\u591f\u5728\u5b83\u4e3a <code>false<\/code> \u65f6\u4e0d\u9700\u8981\u6211\u4eec\u8f6e\u8be2\uff0c\u800c\u662f\u76f4\u63a5\u963b\u585e\u5728\u67d0\u4e2a\u5730\u65b9\uff0c\u7b49\u5230\u5b83\u53d8\u4e3a <code>true<\/code> \u65f6\u518d\u7ee7\u7eed\u6267\u884c\uff0c\u662f\u4e0d\u662f\u5c31\u597d\u5f88\u591a\u4e86\uff1f<\/p>\n<p>\u6839\u636e\u8fd9\u4e00\u9700\u6c42\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>WaitHandle<\/code> \u7684\u4e24\u4e2a\u5b50\u7c7b\u2014\u2014<code>ManualResetEvent<\/code> \u53ca <code>AutoResetEvent<\/code> \u6765\u5b9e\u73b0\u3002<code>ManualResetEvent<\/code> \u662f\u4e00\u4e2a\u53ef\u4ee5\u624b\u52a8\u91cd\u7f6e\u7684\u4fe1\u53f7\u91cf\u3002\u5f53\u5b83 <code>Set<\/code> \u540e\uff0c\u5c06\u4f1a\u4fdd\u6301\u653e\u884c\u72b6\u6001\uff0c\u76f4\u5230\u518d\u6b21 <code>Reset<\/code> \u624d\u4f1a\u5173\u95ed\u3002\u4e0e\u5b83\u76f8\u5bf9\u7684\u662f <code>AutoResetEvent<\/code>\uff0c\u5b83\u4f1a\u5728\u6bcf\u6b21\u653e\u884c\u540e\u81ea\u52a8\u91cd\u7f6e\u3002\u8fd9\u91cc\u66f4\u7b26\u5408\u6211\u4eec\u7684\u9700\u6c42\u7684\u662f <code>ManualResetEvent<\/code>\uff0c\u56e0\u4e3a\u6211\u4eec\u5e0c\u671b\u653e\u884c\u540e\u80fd\u591f\u8fde\u7eed\u6267\u884c\u591a\u6b21\uff0c\u800c\u4e0d\u9700\u8981\u6bcf\u6b21\u90fd <code>Set<\/code> \u540e\u6267\u884c\u4e00\u6b21\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><span class=\"lnt\">40\n<\/span><span class=\"lnt\">41\n<\/span><span class=\"lnt\">42\n<\/span><span class=\"lnt\">43\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">volatile<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_shouldStop<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">ManualResetEvent<\/span> <span class=\"n\">_isRunningEvent<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ManualResetEvent<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u521d\u59cb\u662f\u5173\u95ed\u7684<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">?<\/span> <span class=\"n\">_workerThread<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Start<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">(<\/span><span class=\"n\">Worker<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_shouldStop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunningEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">Set<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u7ebf\u7a0b\u5f00\u59cb\u65f6\u653e\u884c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Stop<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_shouldStop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">?.<\/span><span class=\"n\">Join<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Pause<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunningEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">Reset<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u5173\u95ed\u4fe1\u53f7\u91cf<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Resume<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunningEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">Set<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u653e\u884c\u4fe1\u53f7\u91cf<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Worker<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">_shouldStop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunningEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">WaitOne<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u7b49\u5f85\u4fe1\u53f7\u91cf\u653e\u884c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6267\u884c\u4e00\u4e9b\u5de5\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"m\">50<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u9002\u5f53\u4f11\u7720\uff0c\u907f\u514d CPU \u5360\u7528\u8fc7\u9ad8<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"\u7528-cancellationtoken-\u5b9e\u73b0\u4efb\u52a1\u7684\u505c\u6b62\">\n\u7528 <code>CancellationToken<\/code> \u5b9e\u73b0\u4efb\u52a1\u7684\u505c\u6b62\n<a href=\"#%e7%94%a8-cancellationtoken-%e5%ae%9e%e7%8e%b0%e4%bb%bb%e5%8a%a1%e7%9a%84%e5%81%9c%e6%ad%a2\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u6211\u4eec\u53ef\u4ee5\u8fdb\u4e00\u6b65\u4f18\u5316\u4e0a\u9762\u7684\u4f8b\u5b50\uff0c\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>CancellationToken<\/code> \u6765\u5b9e\u73b0\u4efb\u52a1\u7684\u505c\u6b62\u3002<code>CancellationToken<\/code> \u662f .NET \u4e2d\u7528\u4e8e\u53d6\u6d88\u64cd\u4f5c\u7684\u673a\u5236\uff0c\u5b83\u53ef\u4ee5\u5728\u4efb\u52a1\u4e2d\u4f20\u9012\u4e00\u4e2a\u53d6\u6d88\u8bf7\u6c42\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u4efb\u52a1\u4e2d\u68c0\u67e5\u8fd9\u4e2a\u8bf7\u6c42\u3002\u5b83\u4e0d\u4ec5\u53ef\u4ee5\u7528\u4e8e\u5f02\u6b65\u7f16\u7a0b\uff0c\u4e5f\u53ef\u4ee5\u7528\u4e8e\u591a\u7ebf\u7a0b\u7f16\u7a0b\u3002\u8fd9\u91cc\uff0c\u6211\u4eec\u7528\u5b83\u6765\u53d6\u4ee3 <code>_shouldStop<\/code> \u6807\u5fd7\u4f4d\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><span class=\"lnt\">40\n<\/span><span class=\"lnt\">41\n<\/span><span class=\"lnt\">42\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">ManualResetEvent<\/span> <span class=\"n\">_isRunningEvent<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ManualResetEvent<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u521d\u59cb\u662f\u5173\u95ed\u7684<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">?<\/span> <span class=\"n\">_workerThread<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">CancellationTokenSource<\/span> <span class=\"n\">_cancellationTokenSource<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">CancellationTokenSource<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Start<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">(<\/span><span class=\"n\">Worker<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunningEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">Set<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u7ebf\u7a0b\u5f00\u59cb\u65f6\u653e\u884c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Stop<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_cancellationTokenSource<\/span><span class=\"p\">.<\/span><span class=\"n\">Cancel<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u53d6\u6d88\u64cd\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">?.<\/span><span class=\"n\">Join<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Pause<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunningEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">Reset<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u5173\u95ed\u4fe1\u53f7\u91cf<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Resume<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunningEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">Set<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u653e\u884c\u4fe1\u53f7\u91cf<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Worker<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">_cancellationTokenSource<\/span><span class=\"p\">.<\/span><span class=\"n\">Token<\/span><span class=\"p\">.<\/span><span class=\"n\">IsCancellationRequested<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunningEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">WaitOne<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u7b49\u5f85\u4fe1\u53f7\u91cf\u653e\u884c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u6267\u884c\u4e00\u4e9b\u5de5\u4f5c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"m\">50<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u9002\u5f53\u4f11\u7720\uff0c\u907f\u514d CPU \u5360\u7528\u8fc7\u9ad8<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0a\u9762\u7684\u4f8b\u5b50\u56e0\u4e3a\u6bd4\u8f83\u7b80\u5355\uff0c\u6240\u4ee5\u5e76\u6ca1\u6709\u4f53\u73b0\u51fa\u4f7f\u7528 <code>CancellationToken<\/code> \u7684\u4f18\u52bf\u3002\u5b9e\u9645\u4e0a\uff0c\u6709\u5f88\u591a\u65b9\u6cd5\u90fd\u53ef\u4ee5\u63a5\u6536\u4e00\u4e2a <code>CancellationToken<\/code> \u53c2\u6570\u3002\u8fd9\u6837\u6211\u4eec\u8fd8\u53ef\u4ee5\u901a\u8fc7\u4f20\u9012\u5b83\u6765\u5b9e\u73b0\u505c\u6b62\u5728 <code>Worker<\/code> \u65b9\u6cd5\u4e2d\u8c03\u7528\u7684\u957f\u65f6\u95f4\u8fd0\u884c\u7684\u5176\u4ed6\u4efb\u52a1\uff1b\u5426\u5219\u6211\u4eec\u53ef\u80fd\u5c31\u53ea\u80fd\u5728\u53d6\u6d88\u540e\u7b49\u5f85\u8fd9\u4e9b\u4efb\u52a1\u7684\u7ed3\u675f\u4e86\u3002<\/p>\n<h2 id=\"\u4f18\u5316\u4f7f\u7528\u6d88\u606f\u961f\u5217\u7684\u60c5\u5f62\">\n\u4f18\u5316\u4f7f\u7528\u6d88\u606f\u961f\u5217\u7684\u60c5\u5f62\n<a href=\"#%e4%bc%98%e5%8c%96%e4%bd%bf%e7%94%a8%e6%b6%88%e6%81%af%e9%98%9f%e5%88%97%e7%9a%84%e6%83%85%e5%bd%a2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9664\u4e86\u4e0a\u9762\u7684\u4f8b\u5b50\uff0c\u6211\u4eec\u8fd8\u7ecf\u5e38\u4f1a\u9047\u5230\u9700\u8981\u4f7f\u7528\u4e00\u4e2a\u961f\u5217\u6765\u5b9e\u73b0\u751f\u4ea7\u8005\u6d88\u8d39\u8005\u6a21\u5f0f\u7684\u60c5\u51b5\u3002\u6bd4\u5982\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><span class=\"lnt\">40\n<\/span><span class=\"lnt\">41\n<\/span><span class=\"lnt\">42\n<\/span><span class=\"lnt\">43\n<\/span><span class=\"lnt\">44\n<\/span><span class=\"lnt\">45\n<\/span><span class=\"lnt\">46\n<\/span><span class=\"lnt\">47\n<\/span><span class=\"lnt\">48\n<\/span><span class=\"lnt\">49\n<\/span><span class=\"lnt\">50\n<\/span><span class=\"lnt\">51\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Queue<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_queue<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Queue<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">_lock<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">object<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">volatile<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_shouldStop<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">volatile<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_isRunning<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">?<\/span> <span class=\"n\">_workerThread<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Start<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Thread<\/span><span class=\"p\">(<\/span><span class=\"n\">Worker<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_shouldStop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isRunning<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Stop<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_shouldStop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_workerThread<\/span><span class=\"p\">?.<\/span><span class=\"n\">Join<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u7701\u7565 Pause \u548c Resume \u65b9\u6cd5\u7684\u5b9e\u73b0<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Enqueue<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">lock<\/span> <span class=\"p\">(<\/span><span class=\"n\">_lock<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">Enqueue<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Worker<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">_shouldStop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">lock<\/span> <span class=\"p\">(<\/span><span class=\"n\">_lock<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">&gt;<\/span> <span class=\"m\">0<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">_isRunning<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ \u4e5f\u53ef\u4ee5\u4f7f\u7528 TryDequeue<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">item<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">Dequeue<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5904\u7406 item<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"m\">50<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u6682\u505c\u65f6\u4e5f\u8981\u4f11\u7720\uff0c\u907f\u514d CPU \u5360\u7528\u8fc7\u9ad8<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u5177\u4f53\u505a\u4e86\u8fd9\u6837\u51e0\u4ef6\u4e8b\u60c5\uff1a<\/p>\n<ol>\n<li>\u4f7f\u7528 <code>Queue<\/code> \u6765\u5b58\u50a8\u6570\u636e\uff0c\u5e76\u4f7f\u7528\u7ebf\u7a0b\u9501\u548c <code>lock<\/code> \u8bed\u53e5\u6765\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\uff1b<\/li>\n<li>\u4f7f\u7528 <code>_shouldStop<\/code> \u548c <code>_isRunning<\/code> \u6765\u63a7\u5236\u7ebf\u7a0b\u7684\u6267\u884c\uff1b<\/li>\n<li>\u5728 <code>Worker<\/code> \u65b9\u6cd5\u4e2d\u4f7f\u7528 <code>lock<\/code> \u6765\u83b7\u53d6\u9501\uff0c\u5e76\u5728\u961f\u5217\u4e0d\u4e3a\u7a7a\u65f6\u83b7\u53d6\u4f20\u5165\u7684\u4efb\u52a1\u548c\u8fdb\u884c\u5904\u7406\uff1b<\/li>\n<li>\u66b4\u9732\u4e00\u4e2a <code>Enqueue<\/code> \u65b9\u6cd5\u6765\u8ba9\u751f\u4ea7\u8005\u6dfb\u52a0\u4efb\u52a1\u5230\u961f\u5217\u4e2d\u3002<\/li>\n<\/ol>\n<p>\u90a3\u4e48\u6211\u4eec\u8be5\u5982\u4f55\u4f18\u5316\u8fd9\u4e2a\u4f8b\u5b50\u5462\uff1f<\/p>\n<h3 id=\"\u7528\u7ebf\u7a0b\u5b89\u5168\u7684\u96c6\u5408\u7c7b\u578b\">\n\u7528\u7ebf\u7a0b\u5b89\u5168\u7684\u96c6\u5408\u7c7b\u578b\n<a href=\"#%e7%94%a8%e7%ba%bf%e7%a8%8b%e5%ae%89%e5%85%a8%e7%9a%84%e9%9b%86%e5%90%88%e7%b1%bb%e5%9e%8b\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5b9e\u9645\u4e0a\uff0c.NET \u6807\u51c6\u5e93\u4e2d\u5df2\u7ecf\u63d0\u4f9b\u4e86\u7ebf\u7a0b\u5b89\u5168\u7684\u96c6\u5408\u7c7b\u578b\uff0c\u6bd4\u5982 <code>ConcurrentQueue&lt;T&gt;<\/code>\u3002\u5b83\u4eec\u53ef\u4ee5\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d\u5b89\u5168\u5730\u4f7f\u7528\uff0c\u800c\u4e0d\u9700\u8981\u6211\u4eec\u624b\u52a8\u52a0\u9501\u3002\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u7528\u5b83\u6765\u66ff\u4ee3\u4e0a\u9762\u7684 <code>Queue<\/code> \u548c <code>lock<\/code> \u8bed\u53e5\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ConcurrentQueue<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_queue<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ConcurrentQueue<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Enqueue<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">Enqueue<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Worker<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">_shouldStop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_isRunning<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">TryDequeue<\/span><span class=\"p\">(<\/span><span class=\"k\">out<\/span> <span class=\"kt\">var<\/span> <span class=\"n\">item<\/span><span class=\"p\">))<\/span> <span class=\"c1\">\/\/ \u4e5f\u53ef\u4ee5\u4f7f\u7528 TryDequeue<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5904\u7406 item<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"m\">50<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u6682\u505c\u65f6\u4e5f\u8981\u4f11\u7720\uff0c\u907f\u514d CPU \u5360\u7528\u8fc7\u9ad8<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u901a\u8fc7\u8fd9\u6837\u7684\u65b9\u5f0f\uff0c\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u624b\u52a8\u52a0\u9501\u4e86\u3002<code>ConcurrentQueue&lt;T&gt;<\/code> \u4f1a\u81ea\u52a8\u5904\u7406\u7ebf\u7a0b\u5b89\u5168\u7684\u95ee\u9898\u3002<\/p>\n<h3 id=\"\u7528\u4fe1\u53f7\u91cf\u6765\u53d6\u4ee3\u6807\u5fd7\u4f4d\">\n\u7528\u4fe1\u53f7\u91cf\u6765\u53d6\u4ee3\u6807\u5fd7\u4f4d\n<a href=\"#%e7%94%a8%e4%bf%a1%e5%8f%b7%e9%87%8f%e6%9d%a5%e5%8f%96%e4%bb%a3%e6%a0%87%e5%bf%97%e4%bd%8d\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u53c8\u7528\u5230\u4e86\u8f6e\u8be2\u3002\u4f46\u662f\u8fd9\u4e2a\u8f6e\u8be2\u672c\u8d28\u4e0a\u505a\u7684\u4e8b\u60c5\u662f\u7b49\u5f85\u961f\u5217\u4e2d\u6709\u6570\u636e\u53ef\u7528\u3002\u57fa\u4e8e\u8fd9\u4e00\u601d\u8def\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u7528\u4e00\u4e2a\u53ea\u5728\u6709\u65b0\u6570\u636e\u5230\u6765\u65f6\u624d\u653e\u884c\u4e00\u6b21\u7684\u4fe1\u53f7\u91cf\u2014\u2014\u4e5f\u5c31\u662f <code>AutoResetEvent<\/code> \u6765\u66ff\u4ee3\u5b83\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ConcurrentQueue<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_queue<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ConcurrentQueue<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">AutoResetEvent<\/span> <span class=\"n\">_queueEvent<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">AutoResetEvent<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u521d\u59cb\u662f\u5173\u95ed\u7684<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Enqueue<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">Enqueue<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_queueEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">Set<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u653e\u884c\u4fe1\u53f7\u91cf<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Worker<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">_shouldStop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_queueEvent<\/span><span class=\"p\">.<\/span><span class=\"n\">WaitOne<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u7b49\u5f85\u4fe1\u53f7\u91cf\u653e\u884c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_isRunning<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">TryDequeue<\/span><span class=\"p\">(<\/span><span class=\"k\">out<\/span> <span class=\"kt\">var<\/span> <span class=\"n\">item<\/span><span class=\"p\">))<\/span> <span class=\"c1\">\/\/ \u4e5f\u53ef\u4ee5\u4f7f\u7528 TryDequeue<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5904\u7406 item<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u662f\u8fd9\u4e2a\u4f8b\u5b50\u5e76\u4e0d\u597d\uff0c\u56e0\u4e3a\u5982\u679c\u540c\u65f6\u6765\u4e86\u591a\u6761\u6570\u636e\uff0c\u90a3\u4e48\u6211\u4eec\u867d\u7136\u4f1a\u8c03\u7528\u591a\u6b21 <code>Set<\/code>\uff0c\u4f46\u662f\u4fe1\u53f7\u91cf\u53ea\u4f1a\u653e\u884c\u4e00\u6b21\u3002\u53ef\u5c31\u6709\u53ef\u80fd\u51fa\u73b0\u6570\u636e\u5904\u7406\u4e0d\u53ca\u65f6\u7684\u60c5\u51b5\u3002\u6240\u4ee5\u66f4\u597d\u7684\u65b9\u5f0f\u662f\u4f7f\u7528 <code>Semaphore<\/code>\u3002\u5b83\u597d\u6bd4\u4e00\u6247\u5bbd\u5ea6\u53ef\u53d8\u7684\u5927\u95e8\u3002\u6bcf\u6b21\u653e\u884c\u90fd\u4f1a\u8ba9\u95e8\u53d8\u5bbd\u4e00\u4e9b\uff0c\u800c\u4e0d\u50cf\u662f <code>AutoResetEvent<\/code> \u90a3\u6837\u53ea\u6709\u5f00\u548c\u5173\u8fd9\u4e24\u79cd\u72b6\u6001\u3002\u4e0d\u8fc7\u8fd9\u4e2a\u4f8b\u5b50\u6211\u4eec\u5c31\u4e0d\u6f14\u793a\u4e86\uff0c\u56e0\u4e3a\u6211\u4eec\u6709\u66f4\u597d\u7684\u65b9\u6cd5\u3002<\/p>\n<h3 id=\"\u7528-blockingcollection-\u6765\u5b9e\u73b0\u751f\u4ea7\u8005\u6d88\u8d39\u8005\u6a21\u5f0f\">\n\u7528 <code>BlockingCollection<\/code> \u6765\u5b9e\u73b0\u751f\u4ea7\u8005\u6d88\u8d39\u8005\u6a21\u5f0f\n<a href=\"#%e7%94%a8-blockingcollection-%e6%9d%a5%e5%ae%9e%e7%8e%b0%e7%94%9f%e4%ba%a7%e8%80%85%e6%b6%88%e8%b4%b9%e8%80%85%e6%a8%a1%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5b9e\u9645\u4e0a\uff0c.NET \u4e2d\u5df2\u7ecf\u63d0\u4f9b\u4e86\u4e00\u4e2a\u73b0\u6210\u7684\u7c7b\u6765\u5b9e\u73b0\u751f\u4ea7\u8005\u6d88\u8d39\u8005\u6a21\u5f0f\u2014\u2014<code>BlockingCollection&lt;T&gt;<\/code>\u3002\u5b83\u662f\u4e00\u4e2a\u7ebf\u7a0b\u5b89\u5168\u7684\u96c6\u5408\u7c7b\u578b\uff0c\u800c\u4e14\u5b83\u8fd8\u63d0\u4f9b\u4e86\u963b\u585e\u548c\u901a\u77e5\u7684\u529f\u80fd\u3002\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u7528\u5b83\u6765\u66ff\u4ee3\u4e0a\u9762\u7684 <code>ConcurrentQueue&lt;T&gt;<\/code> \u548c <code>AutoResetEvent<\/code>\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyService<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">BlockingCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_queue<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BlockingCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Enqueue<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u6dfb\u52a0\u6570\u636e\u5230\u961f\u5217\u4e2d<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Worker<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">_shouldStop<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_isRunning<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">TryTake<\/span><span class=\"p\">(<\/span><span class=\"k\">out<\/span> <span class=\"kt\">var<\/span> <span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"n\">Timeout<\/span><span class=\"p\">.<\/span><span class=\"n\">Infinite<\/span><span class=\"p\">))<\/span> <span class=\"c1\">\/\/ \u7b49\u5f85\u6570\u636e\u53ef\u7528<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5904\u7406 item<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\uff0c\u5982\u679c\u961f\u5217\u4e3a\u7a7a\u65f6\uff0c<code>TryTake<\/code> \u4f1a\u963b\u585e\u5f53\u524d\u7ebf\u7a0b\uff0c\u76f4\u5230\u6709\u6570\u636e\u53ef\u7528\u3002\u5f53\u8c03\u7528 <code>Add<\/code> \u65b9\u6cd5\u65f6\uff0c<code>BlockingCollection&lt;T&gt;<\/code> \u4f1a\u81ea\u52a8\u653e\u884c\u7b49\u5f85\u7684\u7ebf\u7a0b\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u624b\u52a8\u5904\u7406\u4fe1\u53f7\u91cf\u4e86\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5176\u5b9e\u901a\u8fc7\u89c2\u5bdf <code>BlockingCollection&lt;T&gt;<\/code> \u7684<a class=\"link\" href=\"https:\/\/source.dot.net\/#System.Collections.Concurrent\/System\/Collections\/Concurrent\/BlockingCollection.cs,3fc8b6e4e28ee36c\" target=\"_blank\" rel=\"noopener\"\n>\u6e90\u4ee3\u7801<\/a>\uff0c\u6211\u4eec\u4e0d\u96be\u53d1\u73b0\u5b83\u5728\u5e95\u5c42\u7528\u5230\u4e86 <code>ConcurrentQueue&lt;T&gt;<\/code> \u548c <code>SemaphoreSlim<\/code>\u3002\u6b64\u5916\uff0c\u5b83\u5e95\u5c42\u4f7f\u7528\u7684\u96c6\u5408\u7c7b\u578b\u4e5f\u662f\u53ef\u53d8\u7684\uff0c\u6bd4\u5982 <code>ConcurrentStack&lt;T&gt;<\/code> \u548c <code>ConcurrentBag&lt;T&gt;<\/code> \u7b49\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u4e0d\u540c\u7684\u96c6\u5408\u7c7b\u578b\u6765\u5b9e\u73b0\u4e0d\u540c\u7684\u884c\u4e3a\u3002<\/div>\n<\/div>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u63a2\u8ba8\u4e86\u5982\u4f55\u7528\u4fe1\u53f7\u91cf\u7b49\u673a\u5236\u6765\u66ff\u4ee3\u8f6e\u8be2\u6807\u5fd7\u4f4d\u7684\u65b9\u5f0f\uff0c\u4ece\u800c\u5b9e\u73b0\u7ebf\u7a0b\u95f4\u7684\u901a\u4fe1\u548c\u63a7\u5236\u3002\u6211\u4eec\u4f7f\u7528\u4e86 <code>ManualResetEvent<\/code>\u3001<code>AutoResetEvent<\/code>\u3001<code>CancellationToken<\/code> \u548c <code>BlockingCollection&lt;T&gt;<\/code> \u7b49\u7c7b\u6765\u5b9e\u73b0\u8fd9\u4e9b\u529f\u80fd\u3002\u901a\u8fc7\u8fd9\u4e9b\u7c7b\uff0c\u6211\u4eec\u53ef\u4ee5\u66f4\u4f18\u96c5\u5730\u5b9e\u73b0\u591a\u7ebf\u7a0b\u7f16\u7a0b\uff0c\u907f\u514d\u4e86\u8f6e\u8be2\u548c\u6807\u5fd7\u4f4d\u5e26\u6765\u7684\u95ee\u9898\u3002<\/p>\n<p>\u5927\u5bb6\u5728\u5b9e\u9645\u7684\u5f00\u53d1\u4e2d\uff0c\u4e5f\u4e00\u5b9a\u8981\u591a\u591a\u5173\u6ce8\u8fd9\u4e9b\u73b0\u6210\u7684\u7c7b\u548c\u5de5\u5177\uff0c\u800c\u4e0d\u662f\u76f2\u76ee\u5730\u81ea\u5df1\u9020\u8f6e\u5b50\u3002<\/p>"},{"title":"BSON \u4e0e MessagePack \u7684\u5f02\u540c\u53ca\u5982\u4f55\u9009\u62e9","link":"https:\/\/blog.coldwind.top\/posts\/bson-vs-msgpack\/","pubDate":"Thu, 20 Mar 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/bson-vs-msgpack\/","description":"<img src=\"https:\/\/s2.loli.net\/2025\/03\/21\/mU1W2s4uAMnov78.webp\" alt=\"Featured image of post BSON \u4e0e MessagePack \u7684\u5f02\u540c\u53ca\u5982\u4f55\u9009\u62e9\" \/><p>BSON \u4e0e MessagePack \u662f\u4e24\u79cd\u5e38\u89c1\u7684\u4e8c\u8fdb\u5236\u6570\u636e\u683c\u5f0f\u3002\u4ed6\u4eec\u90fd\u63d0\u4f9b\u4e86\u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316\u529f\u80fd\uff0c\u652f\u6301\u7075\u6d3b\u7684\u6570\u636e\u683c\u5f0f\uff0c\u4e5f\u5e7f\u6cdb\u5730\u88ab\u5404\u79cd\u7f16\u7a0b\u8bed\u8a00\u6240\u652f\u6301\u3002\u4f46\u662f\u5b83\u4eec\u4e4b\u95f4\u6709\u4ec0\u4e48\u5f02\u540c\u5462\uff1f\u5b83\u4eec\u7684\u6027\u80fd\u4ee5\u53ca\u7a7a\u95f4\u5229\u7528\u7387\u5982\u4f55\u5462\uff1f\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u53c8\u8be5\u5982\u4f55\u9009\u62e9\u5462\uff1f<\/p>\n<h2 id=\"\u57fa\u672c\u4fe1\u606f\">\n\u57fa\u672c\u4fe1\u606f\n<a href=\"#%e5%9f%ba%e6%9c%ac%e4%bf%a1%e6%81%af\" class=\"anchor\">&para;<\/a>\n<\/h2><p>BSON\uff08Binary JSON\uff09\u662f\u4e00\u79cd\u4e8c\u8fdb\u5236\u7f16\u7801\u7684 JSON \u683c\u5f0f\uff0c\u7531 MongoDB \u5f00\u53d1\uff0c\u4e3b\u8981\u7528\u4e8e MongoDB \u6570\u636e\u5e93\u4e2d\u6570\u636e\u7684\u5b58\u50a8\u548c\u4f20\u8f93\u3002\u5b83\u6269\u5c55\u4e86 JSON \u683c\u5f0f\uff0c\u589e\u52a0\u4e86\u5bf9\u989d\u5916\u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\uff0c\u5982\u65e5\u671f\u3001\u65f6\u95f4\u6233\u548c\u4e8c\u8fdb\u5236\u6570\u636e\u3002<\/p>\n<p>MessagePack \u662f\u4e00\u79cd\u9ad8\u6548\u7684\u4e8c\u8fdb\u5236\u5e8f\u5217\u5316\u683c\u5f0f\uff0c\u65e8\u5728\u5b9e\u73b0\u5c3d\u53ef\u80fd\u5c0f\u7684\u4f53\u79ef\u548c\u5c3d\u53ef\u80fd\u5feb\u7684\u5904\u7406\u901f\u5ea6\u3002\u5b83\u652f\u6301\u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\uff0c\u5e38\u7528\u4e8e\u7f51\u7edc\u901a\u4fe1\u548c\u6570\u636e\u5b58\u50a8\u3002<\/p>\n<h2 id=\"\u76f8\u540c\u70b9\">\n\u76f8\u540c\u70b9\n<a href=\"#%e7%9b%b8%e5%90%8c%e7%82%b9\" class=\"anchor\">&para;<\/a>\n<\/h2><p>BSON \u548c MessagePack \u5728\u591a\u4e2a\u65b9\u9762\u5177\u6709\u76f8\u4f3c\u4e4b\u5904\u3002\u9996\u5148\uff0c\u5b83\u4eec\u90fd\u5c06\u6570\u636e\u7f16\u7801\u4e3a\u4e8c\u8fdb\u5236\u5f62\u5f0f\uff0c\u4e0e\u57fa\u4e8e\u6587\u672c\u7684 JSON \u76f8\u6bd4\uff0c\u53ef\u4ee5\u51cf\u5c0f\u6570\u636e\u4f53\u79ef\uff0c\u63d0\u9ad8\u4f20\u8f93\u6548\u7387\u3002JSON \u867d\u7136\u5177\u6709\u53ef\u8bfb\u6027\u7684\u4f18\u52bf\uff0c\u4f46\u5728\u5904\u7406\u5927\u91cf\u6570\u636e\u65f6\uff0c\u5176\u6587\u672c\u7279\u6027\u4f1a\u5bfc\u81f4\u89e3\u6790\u901f\u5ea6\u8f83\u6162\uff0c\u4e14\u5360\u7528\u66f4\u591a\u7684\u5b58\u50a8\u7a7a\u95f4\u3002\u800c\u4e8c\u8fdb\u5236\u683c\u5f0f\u5219\u907f\u514d\u4e86\u8fd9\u4e9b\u95ee\u9898\uff0c\u5b83\u4eec\u4ee5\u8ba1\u7b97\u673a\u66f4\u5bb9\u6613\u5904\u7406\u7684\u65b9\u5f0f\u5b58\u50a8\u6570\u636e\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u6548\u7387\u3002<\/p>\n<p>\u5176\u6b21\uff0c\u5b83\u4eec\u90fd\u652f\u6301\u591a\u79cd\u6570\u636e\u7c7b\u578b\uff0c\u5305\u62ec\u57fa\u672c\u7c7b\u578b\uff08\u5982\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5b57\u7b26\u4e32\u3001\u5e03\u5c14\u503c\uff09\u548c\u590d\u6742\u7c7b\u578b\uff08\u5982\u6570\u7ec4\u3001\u4e8c\u8fdb\u5236\u3001\u65e5\u671f\u7b49\uff09\u3002\u8fd9\u4f7f\u5f97\u5b83\u4eec\u53ef\u4ee5\u7075\u6d3b\u5730\u5904\u7406\u5404\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u6ee1\u8db3\u4e0d\u540c\u5e94\u7528\u573a\u666f\u7684\u9700\u6c42\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u4e24\u8005\u90fd\u63d0\u4f9b\u4e86\u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u7684\u5b9e\u73b0\uff0c\u4f7f\u5f97\u5b83\u4eec\u53ef\u4ee5\u5728\u4e0d\u540c\u7684\u7cfb\u7edf\u548c\u5e73\u53f0\u4e4b\u95f4\u8fdb\u884c\u6570\u636e\u4ea4\u6362\u3002\u65e0\u8bba\u662f\u4f7f\u7528 Python\u3001Java\u3001C#\u3001Go\uff0c\u8fd8\u662f\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u627e\u5230\u76f8\u5e94\u7684\u5e93\u6765\u4f7f\u7528\u5b83\u4eec\u3002\u6700\u540e\uff0c\u5b83\u4eec\u90fd\u63d0\u4f9b\u4e86\u9ad8\u6548\u7684\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u673a\u5236\uff0c\u4f7f\u5f97\u5f00\u53d1\u8005\u53ef\u4ee5\u65b9\u4fbf\u5730\u8fdb\u884c\u6570\u636e\u7684\u76f8\u5173\u64cd\u4f5c\u3002<\/p>\n<p>\u90a3\u4e48\uff0c\u540c\u6837\u90fd\u662f\u4e8c\u8fdb\u5236\u6570\u636e\uff0c\u5b83\u4eec\u662f\u5426\u90fd\u5177\u5907\u76f8\u5f53\u9ad8\u7684\u7a7a\u95f4\u5229\u7528\u7387\u4ee5\u53ca\u6027\u80fd\u5462\uff1f<\/p>\n<h2 id=\"\u4e0d\u540c\u70b9\">\n\u4e0d\u540c\u70b9\n<a href=\"#%e4%b8%8d%e5%90%8c%e7%82%b9\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u7136\u800c\uff0cBSON \u548c MessagePack \u4e4b\u95f4\u4e5f\u5b58\u5728\u4e00\u4e9b\u5173\u952e\u7684\u8bbe\u8ba1\u4e0a\u7684\u5dee\u5f02\u3002\u8fd9\u4e9b\u5dee\u5f02\u5bfc\u81f4\u4e86\u5b83\u4eec\u7684\u7a7a\u95f4\u5229\u7528\u7387\uff0c\u4ee5\u53ca\u5404\u81ea\u6240\u64c5\u957f\u7684\u529f\u80fd\u5e76\u4e0d\u76f8\u540c\u3002<\/p>\n<p>BSON \u7684\u8bbe\u8ba1\u76ee\u6807\u662f\u4e3b\u8981\u7528\u4e8e MongoDB \u7684\u6570\u636e\u5b58\u50a8\u548c\u4f20\u8f93\uff0c\u800c\u4e0d\u662f\u4e3a\u4e86\u63d0\u4f9b\u4e00\u4e2a JSON \u7684\u4e0a\u4f4d\u66ff\u4ee3\u3002\u8fd9\u79cd\u8bbe\u8ba1\u7406\u5ff5\u4e0a\u7684\u5dee\u5f02\u76f4\u63a5\u5f71\u54cd\u4e86\u5b83\u4eec\u5728\u7a7a\u95f4\u5229\u7528\u7387\u548c\u6027\u80fd\u65b9\u9762\u7684\u8868\u73b0\u3002\u7531\u4e8e BSON \u5305\u542b\u4e00\u4e9b\u989d\u5916\u7684\u5143\u6570\u636e\uff08\u5982\u5b57\u6bb5\u957f\u5ea6\u7b49\uff09\uff0c\u56e0\u6b64\u5176\u7a7a\u95f4\u6548\u7387\u76f8\u5bf9\u8f83\u4f4e\uff1b\u800c MessagePack \u4f7f\u7528\u7d27\u51d1\u7684\u8868\u793a\u65b9\u5f0f\u6765\u7f16\u7801\u6570\u636e\uff0c\u4f8b\u5982\u4f7f\u7528\u66f4\u5c11\u7684\u5b57\u8282\u6765\u8868\u793a\u8f83\u5c0f\u7684\u6574\u6570\uff0c\u56e0\u6b64\u7a7a\u95f4\u6548\u7387\u975e\u5e38\u9ad8\u3002MessagePack \u7684\u8bbe\u8ba1\u54f2\u5b66\u662f\u201c\u5c3d\u53ef\u80fd\u5730\u5c0f\u201d\uff0c\u8fd9\u4f7f\u5f97\u5b83\u5728\u5bf9\u6570\u636e\u5927\u5c0f\u6709\u4e25\u683c\u8981\u6c42\u7684\u573a\u666f\u4e2d\u6210\u4e3a\u7406\u60f3\u7684\u9009\u62e9\u3002<\/p>\n<p>\u5728\u6027\u80fd\u65b9\u9762\uff0cBSON \u7684\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u901f\u5ea6\u76f8\u5bf9\u8f83\u6162\uff0c\u800c MessagePack \u7684\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u901f\u5ea6\u975e\u5e38\u5feb\u3002\u8fd9\u662f\u56e0\u4e3a MessagePack \u7684\u7f16\u7801\u65b9\u5f0f\u66f4\u52a0\u7b80\u5355\u9ad8\u6548\uff0c\u51cf\u5c11\u4e86\u5904\u7406\u6570\u636e\u6240\u9700\u7684\u8ba1\u7b97\u91cf\u3002\u7136\u800c\uff0cBSON \u867d\u7136\u6548\u7387\u76f8\u5bf9\u8f83\u4f4e\uff0c\u4f46\u5b83\u5728 MongoDB \u4e2d\u6709\u8bb8\u591a\u4f18\u5316\uff0c\u4f8b\u5982\u5728\u7d22\u5f15\u65b9\u9762\uff0cBSON \u7684\u7ed3\u6784\u5141\u8bb8 MongoDB \u9ad8\u6548\u5730\u904d\u5386\u548c\u67e5\u8be2\u6570\u636e\uff0c\u8fd9\u5f25\u8865\u4e86\u5176\u5728\u901a\u7528\u6027\u80fd\u4e0a\u7684\u4e00\u4e9b\u4e0d\u8db3\u3002\u5177\u4f53\u6765\u8bf4\uff0cMongoDB \u53ef\u4ee5\u5229\u7528 BSON \u4e2d\u5b58\u50a8\u7684\u5b57\u6bb5\u957f\u5ea6\u7b49\u4fe1\u606f\uff0c\u5feb\u901f\u5b9a\u4f4d\u5230\u9700\u8981\u7684\u6570\u636e\uff0c\u800c\u4e0d\u9700\u8981\u50cf\u89e3\u6790 JSON \u90a3\u6837\u9010\u4e2a\u5b57\u7b26\u5730\u626b\u63cf\u3002<\/p>\n<h2 id=\"\u4ee3\u7801\u5bf9\u6bd4\">\n\u4ee3\u7801\u5bf9\u6bd4\n<a href=\"#%e4%bb%a3%e7%a0%81%e5%af%b9%e6%af%94\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u91cc\uff0c\u6211\u4eec\u5728 C# \u4e2d\u7528\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u6765\u5bf9\u6bd4 BSON \u548c MessagePack\u3002\u6211\u4eec\u4f7f\u7528 <a class=\"link\" href=\"https:\/\/www.nuget.org\/packages\/Newtonsoft.Json.Bson\" target=\"_blank\" rel=\"noopener\"\n><code>Newtonsoft.Json.Bson<\/code><\/a> \u548c <a class=\"link\" href=\"https:\/\/www.nuget.org\/packages\/MessagePack\" target=\"_blank\" rel=\"noopener\"\n><code>MessagePack<\/code><\/a> \u8fd9\u4e24\u4e2a\u5e93\u6765\u5b9e\u73b0\u3002<\/p>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u8bbe\u8ba1\u4e00\u4e2a\u5305\u542b\u4e00\u4e9b\u5c5e\u6027\u7684\u7c7b\uff0c\u5e76\u4e14\u4e3a\u5b83\u586b\u5145\u4e00\u4e9b\u6570\u636e\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><span class=\"lnt\">40\n<\/span><span class=\"lnt\">41\n<\/span><span class=\"lnt\">42\n<\/span><span class=\"lnt\">43\n<\/span><span class=\"lnt\">44\n<\/span><span class=\"lnt\">45\n<\/span><span class=\"lnt\">46\n<\/span><span class=\"lnt\">47\n<\/span><span class=\"lnt\">48\n<\/span><span class=\"lnt\">49\n<\/span><span class=\"lnt\">50\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MyModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">DateTime<\/span> <span class=\"n\">CreatedAt<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">IsActive<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">decimal<\/span> <span class=\"n\">Price<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">Rating<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Guid<\/span> <span class=\"n\">UniqueId<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">Data<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Tags<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Dictionary<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Counts<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">long<\/span> <span class=\"n\">BigNumber<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">short<\/span> <span class=\"n\">SmallNumber<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">char<\/span> <span class=\"n\">Initial<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">TimeSpan<\/span> <span class=\"n\">Duration<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Uri<\/span> <span class=\"n\">Website<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Version<\/span> <span class=\"n\">Version<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">DynamicValue<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Status<\/span> <span class=\"n\">Status<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">enum<\/span> <span class=\"n\">Status<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Pending<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">InProgress<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Completed<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">model<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MyModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Id<\/span> <span class=\"p\">=<\/span> <span class=\"m\">123<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;My Model&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">CreatedAt<\/span> <span class=\"p\">=<\/span> <span class=\"n\">DateTime<\/span><span class=\"p\">.<\/span><span class=\"n\">UtcNow<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">IsActive<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Price<\/span> <span class=\"p\">=<\/span> <span class=\"m\">99.99<\/span><span class=\"n\">m<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Rating<\/span> <span class=\"p\">=<\/span> <span class=\"m\">4.5<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">UniqueId<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Guid<\/span><span class=\"p\">.<\/span><span class=\"n\">NewGuid<\/span><span class=\"p\">(),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Data<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">3<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Tags<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"s\">&#34;tag1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;tag2&#34;<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Counts<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Dictionary<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"p\">{<\/span> <span class=\"s\">&#34;a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span> <span class=\"p\">},<\/span> <span class=\"p\">{<\/span> <span class=\"s\">&#34;b&#34;<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span> <span class=\"p\">}<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">BigNumber<\/span> <span class=\"p\">=<\/span> <span class=\"m\">123456789012345<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">SmallNumber<\/span> <span class=\"p\">=<\/span> <span class=\"m\">123<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Initial<\/span> <span class=\"p\">=<\/span> <span class=\"sc\">&#39;A&#39;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Duration<\/span> <span class=\"p\">=<\/span> <span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromMinutes<\/span><span class=\"p\">(<\/span><span class=\"m\">15<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Website<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Uri<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;https:\/\/www.example.com&#34;<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Version<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Version<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">DynamicValue<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Value<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;dynamic&#34;<\/span> <span class=\"p\">},<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Status<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Status<\/span><span class=\"p\">.<\/span><span class=\"n\">InProgress<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\uff0c\u6211\u4eec\u7528\u4e24\u79cd\u65b9\u6cd5\u6765\u5e8f\u5217\u5316\u8fd9\u4e2a\u5bf9\u8c61\u3002\u9996\u5148\u662f BSON\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Newtonsoft.Json<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Newtonsoft.Json.Bson<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">fs<\/span> <span class=\"p\">=<\/span> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">OpenWrite<\/span><span class=\"p\">(<\/span><span class=\"s\">@&#34;bson.dat&#34;<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">writer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BsonWriter<\/span><span class=\"p\">(<\/span><span class=\"n\">fs<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">serializer<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">JsonSerializer<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">serializer<\/span><span class=\"p\">.<\/span><span class=\"n\">Serialize<\/span><span class=\"p\">(<\/span><span class=\"n\">writer<\/span><span class=\"p\">,<\/span> <span class=\"n\">model<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u662f MessagePack\u3002\u8fd9\u91cc\u4e3a\u4e86\u5e8f\u5217\u5316\u4e0a\u8ff0\u6a21\u578b\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u4e3a\u6a21\u578b\u7c7b\u6dfb\u52a0\u4e00\u4e9b\u7279\u6027\uff0c\u5305\u62ec\uff1a<\/p>\n<ul>\n<li>\u4e3a\u7c7b\u6dfb\u52a0 <code>[MessagePackObject]<\/code><\/li>\n<li>\u4e3a\u6bcf\u4e2a\u5c5e\u6027\u4f9d\u6b21\u6dfb\u52a0 <code>[Key(0)]<\/code>\u3001<code>[Key(1)]<\/code>\u3001<code>[Key(2)]<\/code>\u2026\u2026<\/li>\n<\/ul>\n<p>\u5426\u5219\u5e8f\u5217\u5316\u4ee3\u7801\u5c06\u4f1a\u62a5\u9519\u3002\u8fd9\u91cc\uff0c\u4fee\u6539\u540e\u7684\u6a21\u578b\u7c7b\uff08\u90e8\u5206\uff09\u53ca\u5e8f\u5217\u5316\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"na\">[MessagePackObject]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MyModel<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Key(0)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Key(1)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Key(2)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">DateTime<\/span> <span class=\"n\">CreatedAt<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Key(3)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">IsActive<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">fs<\/span> <span class=\"p\">=<\/span> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">OpenWrite<\/span><span class=\"p\">(<\/span><span class=\"s\">@&#34;msgpack.dat&#34;<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">data<\/span> <span class=\"p\">=<\/span> <span class=\"n\">MessagePackSerializer<\/span><span class=\"p\">.<\/span><span class=\"n\">Serialize<\/span><span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">fs<\/span><span class=\"p\">.<\/span><span class=\"n\">Write<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\uff0c\u6211\u4eec\u89c2\u5bdf\u6587\u4ef6\u5927\u5c0f\uff1a<\/p>\n<ul>\n<li>BSON\uff1a381 \u5b57\u8282<\/li>\n<li>MsgPack\uff1a166 \u5b57\u8282<\/li>\n<\/ul>\n<p>\u53ef\u4ee5\u660e\u663e\u770b\u51fa\uff0cBSON \u5728\u7a7a\u95f4\u6548\u7387\u4e0a\u5b8c\u5168\u6ca1\u6709\u4f18\u52bf\u3002<\/p>\n<div class=\"notice note\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-sticky-note\" aria-hidden=\"true\"><\/i>Note\n<\/div>\n<div class=\"notice-content\">\u5b9e\u9645\u4e0a\uff0c\u5c31\u7b97\u662f\u5bf9\u6bd4 JSON\uff0cBSON \u5728\u7a7a\u95f4\u6548\u7387\u4e0a\u4e5f\u672a\u5fc5\u4f1a\u6709\u663e\u8457\u7684\u4f18\u52bf\u3002BSON \u7684\u4f18\u52bf\u4e3b\u8981\u6765\u81ea\u5bf9\u65e5\u671f\u3001\u4e8c\u8fdb\u5236\u6570\u636e\u3001\u6570\u5b57\u7b49\u7684\u5904\u7406\uff0c\u800c JSON \u53ea\u80fd\u5168\u90e8\u4ee5\u5b57\u7b26\u4e32\u7684\u5f62\u5f0f\u5b58\u50a8\u3002\u5bf9\u4e8e 100,000,000 \u8fd9\u6837\u7684\u5927\u6570\u5b57\uff0cJSON \u9700\u8981 9 \u4e2a\u5b57\u7b26\uff0c\u800c BSON \u53ea\u9700\u8981 4 \u4e2a\u5b57\u8282\uff1b\u4f46\u5bf9\u4e8e 1.0 \u8fd9\u6837\u7684\u5c0f\u6570\uff0cJSON \u9700\u8981 3 \u4e2a\u5b57\u7b26\uff0c\u800c BSON \u53ea\u9700\u8981 8 \u4e2a\u5b57\u8282\u3002\u4e0d\u4ec5\u5982\u6b64\uff0cBSON \u8fd8\u5305\u542b\u4e86\u989d\u5916\u7684\u5143\u6570\u636e\uff0c\u5982\u5b57\u6bb5\u540d\u79f0\u3001\u5b57\u6bb5\u957f\u5ea6\u7b49\uff0c\u8fd9\u4e5f\u5bfc\u81f4\u4e86 BSON \u7684\u7a7a\u95f4\u6548\u7387\u5e76\u6ca1\u6709\u76f8\u8f83\u4e8e JSON \u6709\u591a\u5c11\u63d0\u5347\u3002<\/div>\n<\/div>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u603b\u800c\u8a00\u4e4b\uff0cBSON \u548c MessagePack \u90fd\u662f\u4f18\u79c0\u4e14\u73b0\u4ee3\u7684\u4e8c\u8fdb\u5236\u5e8f\u5217\u5316\u683c\u5f0f\u3002BSON \u7684\u4f18\u52bf\u5728\u4e8e\u4e0e JSON \u7684\u517c\u5bb9\u6027\u548c\u5bf9\u4e30\u5bcc\u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\uff0c\u4f7f\u5f97\u5b83\u5728 MongoDB \u7b49\u6570\u636e\u5e93\u5e94\u7528\u4e2d\u8868\u73b0\u51fa\u8272\uff1bMessagePack \u7684\u4f18\u52bf\u5728\u4e8e\u5176\u9ad8\u6027\u80fd\u548c\u9ad8\u7a7a\u95f4\u6548\u7387\uff0c\u8fd9\u4f7f\u5f97\u5b83\u5728\u7f51\u7edc\u901a\u4fe1\u3001\u5927\u6570\u636e\u5904\u7406\u7b49\u9700\u8981\u5feb\u901f\u4f20\u8f93\u548c\u5904\u7406\u5927\u91cf\u6570\u636e\u7684\u573a\u666f\u4e2d\u66f4\u6709\u4f18\u52bf\u3002\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u5e94\u5f53\u6839\u636e\u5177\u4f53\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u683c\u5f0f\u3002<\/p>"},{"title":"\u4e3a\u4ec0\u4e48\u4e0d\u8bd5\u8bd5 ReactiveUI \u5462\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/why-not-using-rxui\/","pubDate":"Wed, 12 Mar 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/why-not-using-rxui\/","description":"<p>\u5728\u53bb\u5e74\uff0c\u6211\u5236\u4f5c\u4e86<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1NA4m1w7rd\/\" target=\"_blank\" rel=\"noopener\"\n>\u4e00\u671f\u89c6\u9891<\/a>\u4e0e\u5927\u5bb6\u63a2\u8ba8\u54cd\u5e94\u5f0f\u7f16\u7a0b\uff08Reactive Programming\uff09\u3002\u5728\u89c6\u9891\u7684\u7ed3\u5c3e\uff0c\u6211\u4e5f\u201c\u5267\u900f\u201d\u4e86\u81ea\u5df1\u6216\u8bb8\u4f1a\u5728\u5c06\u6765\u7684\u4e00\u5929\u7ee7\u7eed\u6df1\u5165\u8fd9\u4e2a\u8bdd\u9898\uff0c\u4e0e\u5927\u5bb6\u63a2\u8ba8\u4f7f\u7528 ReactiveUI\uff08\u4ee5\u4e0b\u7b80\u79f0\u4e3a\u201cRxUI\u201d\uff09\u8fd9\u4e2a\u5e93\u6765\u505a\u7b26\u5408 MVVM \u6a21\u5f0f\u7684\u684c\u9762\u5e94\u7528\u3002<\/p>\n<p>\u4f46\u73b0\u5728\u5df2\u7ecf\u8fc7\u53bb\u5f88\u4e45\u4e86\uff0c\u540e\u7eed\u5185\u5bb9\u8fdf\u8fdf\u6ca1\u6709\u51fa\u73b0\u3002\u8fd9\u771f\u7684\u662f\u4e00\u4ef6\u5c34\u5c2c\u7684\u4e8b\u60c5\u3002\u4e8b\u5b9e\u4e0a\uff0c\u8fd9\u4e2a\u8bdd\u9898\u53ef\u8c13\u96be\u5ea6\u975e\u5e38\u9ad8\uff0c\u5c24\u5176\u662f\u76f8\u8f83\u4e8e\u5176\u4ed6 MVVM \u6846\u67b6\uff08\u6bd4\u5982 CommunityToolkit.Mvvm\u3001Prism \u7b49\uff09\u6765\u8bf4\uff0c\u5b83\u7684\u5165\u95e8\u96be\u5ea6\u6781\u9ad8\u3002<\/p>\n<p>\u6700\u8fd1\u770b\u4e86\u4e00\u7bc7\u5217\u5728\u4e86 ReactiveUI <a class=\"link\" href=\"https:\/\/www.reactiveui.net\/docs\/index.html\" target=\"_blank\" rel=\"noopener\"\n>\u5b98\u65b9\u6587\u6863<\/a>\u7684\u201c\u8d44\u6e90\u201d\u4e2d\u7684\u535a\u6587\uff1a<a class=\"link\" href=\"https:\/\/ericsink.com\/entries\/dont_use_rxui.html\" target=\"_blank\" rel=\"noopener\"\n>I have become a huge fan of ReactiveUI<\/a>\u3002\u6709\u8da3\u7684\u662f\uff0c\u5f53\u4f60\u70b9\u5f00\u8fd9\u7bc7\u6587\u7ae0\u540e\uff0c\u4f60\u4f1a\u53d1\u73b0\u6807\u9898\u662f\u201cDon&rsquo;t use ReactiveUI\u201d\u3002\u4e0d\u8fc7\u4f5c\u8005\u7acb\u523b\u5728\u7b2c\u4e00\u6bb5\u5c31\u6f84\u6e05\u4e86\u8fd9\u53ea\u662f\u4e00\u4e2a\u9887\u5177\u6b3a\u9a97\u6027\u7684\u6807\u9898\uff0c\u5b9e\u9645\u4e0a\u5e76\u4e0d\u662f\u60f3\u8868\u8fbe\u8fd9\u4e2a\u610f\u601d\uff0c\u4f5c\u8005\u662f\u5728\u8bf4\u53cd\u8bdd\u3002<\/p>\n<p>\u6240\u4ee5\u6211\u7684\u8fd9\u7bc7\u6587\u7ae0\u4e5f\u4eff\u7167\u8fd9\u4e00\u70b9\uff0c\u8d77\u4e86\u4e00\u4e2a\u9887\u5177\u6b3a\u9a97\u6027\u7684\u6807\u9898\u2014\u2014\u662f\u7684\uff0c\u6211\u4e5f\u5728\u8bf4\u53cd\u8bdd\u3002\u73b0\u9636\u6bb5\u6211\u4e0d\u63a8\u8350\u4efb\u4f55\u4eba\u4f7f\u7528 RxUI\uff0c\u5c24\u5176\u662f\u73b0\u5728\u6709 CommunityToolkit.Mvvm \u8fd9\u6837\u6210\u719f\u4e14\u6613\u4e0a\u624b\u7684\u6846\u67b6\u7684\u60c5\u51b5\u4e0b\uff08\u6211\u8fd8\u4e13\u95e8\u5199\u4e86\u4e00\u6574\u4e2a <a class=\"link\" href=\"https:\/\/mvvm.coldwind.top\" target=\"_blank\" rel=\"noopener\"\n>\u5165\u95e8\u6559\u7a0b<\/a> \u6765\u548c\u5927\u5bb6\u5206\u4eab\u8fd9\u4e2a\u5de5\u5177\u5305\u7684\u4f7f\u7528\uff09\u3002<\/p>\n<h2 id=\"\u4e3a\u4ec0\u4e48\u4e0d\u63a8\u8350\u4f7f\u7528-rxui\">\n\u4e3a\u4ec0\u4e48\u4e0d\u63a8\u8350\u4f7f\u7528 RxUI\uff1f\n<a href=\"#%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%8d%e6%8e%a8%e8%8d%90%e4%bd%bf%e7%94%a8-rxui\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u90a3\u4e48\u4e3a\u4ec0\u4e48\u6211\u4e0d\u63a8\u8350\u4f7f\u7528 RxUI \u5462\uff1f<\/p>\n<p>\u5982\u679c\u4f60\u6216\u4f60\u7684\u56e2\u961f\u9009\u62e9\u4e86 RxUI \u6765\u8fdb\u884c\u5f00\u53d1\uff0c\u90a3\u4e48\u4f60\u5c06\u83b7\u5f97\u4e0b\u9762\u51e0\u4e2a\u4f18\u52bf\uff1a<\/p>\n<ol>\n<li>\u4f60\u7684\u4ee3\u7801\u4f1a\u770b\u8d77\u6765\u5f88\u9177\uff1b<\/li>\n<li>\u4f60\u4f1a\u83b7\u5f97\u65b0\u9896\u800c\u4e0d\u540c\u5bfb\u5e38\u7684\u5f00\u53d1\u4f53\u9a8c\uff1b<\/li>\n<li>\u4f60\u7684\u4ee3\u7801\u4f1a\u975e\u5e38\u96be\u4ee5\u8ba9\u65b0\u5165\u804c\u7684\u540c\u4e8b\u63a5\u624b\uff0c\u8fd9\u4f1a\u8ba9\u4f60\u53d8\u5f97\u66f4\u52a0\u91cd\u8981\uff0c\u4e5f\u66f4\u96be\u4ee5\u88ab\u201c\u4f18\u5316\u201d\uff1b<\/li>\n<li>\u4f60\u4f1a\u5145\u5206\u57f9\u517b\u81ea\u5df1\u7684\u81ea\u5b66\u80fd\u529b\u2014\u2014\u56e0\u4e3a\u4f60\u51e0\u4e4e\u65e0\u6cd5\u9760\u522b\u4eba\u7406\u6e05\u695a\u4f60\u5230\u5e95\u5728\u5e72\u4ec0\u4e48\u3002<\/li>\n<\/ol>\n<p>\u662f\u7684\uff0c\u5982\u679c\u4f60\u9009\u62e9\u4e86 RxUI\uff0c\u90a3\u4e48\u201cyou are on your own.\u201d\uff0c\u751a\u81f3\u5305\u62ec\u76ee\u524d\u6700\u806a\u660e\u7684\u51e0\u4e2a\u5927\u8bed\u8a00\u6a21\u578b\uff0c\u6bd4\u5982 ChatGPT o3\u3001Claude 3.7 Sonnet\u3001Gemini 2.0 Pro\u3001Grok 3\u3001DeepSeek R1 \u7b49\uff0c\u4e5f\u5e2e\u4e0d\u4e86\u4f60\u3002\u73b0\u5728\u4e0d\u80fd\uff0c\u5c06\u6765\u5e94\u8be5\u4e5f\u4e0d\u80fd\uff0c\u56e0\u4e3a\u5b83\u4eec\u7684\u8bad\u7ec3\u96c6\u91cc\u9762\u5e76\u4e0d\u5145\u5206\u5305\u542b\u8fd9\u4e48\u4e00\u4e2a\u6280\u672f\u3002<\/p>\n<p>\u53ef\u80fd\u6709\u4e9b\u5f00\u53d1\u8005\u4f1a\u8bf4\uff0cRxUI \u6709\u4f60\u8bf4\u7684\u90a3\u4e48\u96be\u5417\uff1f\u6211\u89c9\u5f97\u8fd8\u597d\u554a\uff0c\u4e0d\u5c31\u662f\u501f\u52a9 <code>RaiseAndSetIfChanged<\/code> \u8fd9\u4e2a\u65b9\u6cd5\u6765\u5b9e\u73b0\u5c5e\u6027\u7684\u901a\u77e5\uff0c\u7528 <code>ReactiveCommand<\/code> \u6765\u521b\u5efa\u7528\u4e8e\u7ed1\u5b9a <code>Command<\/code> \u7684\u547d\u4ee4\uff0c\u6700\u591a\u518d\u7528 <code>ObservableAsPropertyHelper<\/code>\uff08OAPH\uff09\u6765\u521b\u5efa\u4e00\u4e2a\u53ea\u8bfb\u5c5e\u6027\uff08\u6216\u8005\u8bf4\u8ba1\u7b97\u5c5e\u6027\uff09\uff0c\u5c31\u53ef\u4ee5\u4e86\u554a\uff1f\u5982\u679c\u5acc\u9ebb\u70e6\uff0c\u8fd8\u53ef\u4ee5\u501f\u52a9 Fody\uff0c\u6216\u8005\u6e90\u751f\u6210\u5668\u4e0d\u662f\u561b\u3002<\/p>\n<p>\u5982\u679c\u4f60\u8fd9\u6837\u60f3\uff0c\u90a3\u4e48\u606d\u559c\u4f60\uff0c\u4f60\u53ef\u80fd\u53ea\u662f\u521a\u521a\u5165\u95e8\uff0c\u5e76\u4e14\u4f60\u7684\u9879\u76ee\u5e76\u4e0d\u590d\u6742\uff0c\u4ec5\u9760\u5165\u95e8\u7684\u8fd9\u4e9b\u77e5\u8bc6\u5c31\u53ef\u4ee5\u5e94\u4ed8\u3002\u5982\u679c\u4f60\u6df1\u5165\u4e86\u89e3 RxUI\uff0c\u4f60\u4f1a\u53d1\u73b0\u4f60\u8981\u8003\u8651\u7684\u56e0\u7d20\u5b9e\u5728\u662f\u592a\u591a\u4e86\uff0c\u5e76\u4e14\u5f88\u591a\u65f6\u5019\u4f60\u53ef\u80fd\u90fd\u4e0d\u77e5\u9053\u81ea\u5df1\u5728\u505a\u4ec0\u4e48\uff0c\u8be5\u60f3\u4ec0\u4e48\uff0c\u4ee5\u53ca\u8be5\u5982\u4f55\u5224\u65ad\u67d0\u79cd\u505a\u6cd5\u7684\u4f18\u52a3\u3002<\/p>\n<p>\u4e0d\u76f8\u4fe1\u7684\u8bdd\uff0c\u4e0d\u59a8\u95ee\u81ea\u5df1\u8fd9\u4e48\u51e0\u4e2a\u95ee\u9898\uff1a<\/p>\n<ul>\n<li>\u4f60\u77e5\u9053\u89c6\u56fe\u53ca\u89c6\u56fe\u6a21\u578b\u7684\u751f\u547d\u5468\u671f\uff0c\u4ee5\u53ca\u4ec0\u4e48\u65f6\u5019\u8be5\u4f7f\u7528 <code>WhenActivated<\/code> \u5417\uff1f<\/li>\n<li>\u4f60\u77e5\u9053\u54ea\u4e9b\u5bf9\u8c61\u5e94\u5f53\u8003\u8651\u8d44\u6e90\u56de\u6536\u7684\u95ee\u9898\u5417\uff1f<\/li>\n<li>\u5982\u679c\u4f60\u4e0d\u786e\u5b9a\u67d0\u4e2a\u5bf9\u8c61\u662f\u5426\u5e94\u8be5\u663e\u5f0f\u91ca\u653e\u8d44\u6e90\uff0c\u4f60\u77e5\u9053\u8be5\u5982\u4f55\u53bb\u5224\u65ad\u5417\uff1f<\/li>\n<li>\u4f60\u77e5\u9053 <code>WhenAny<\/code>\u3001<code>WhenAnyValue<\/code>\u3001<code>WhenAnyObservable<\/code> \u8fd9\u4e09\u4e2a\u65b9\u6cd5\u7684\u533a\u522b\u4ee5\u53ca\u89e6\u53d1\u65f6\u673a\u5417\uff1f<\/li>\n<li>\u4f60\u77e5\u9053\u4ec0\u4e48\u65f6\u5019\u8be5\u4f7f\u7528 <code>Bind<\/code>\u3001<code>BindCommand<\/code> \u7b49\u65b9\u6cd5\u800c\u4e0d\u662f\u76f4\u63a5\u5728 XAML \u4e2d\u7ed1\u5b9a\u5417\uff1f<\/li>\n<li>\u4f60\u77e5\u9053 <code>MessageBus<\/code>\u3001<code>DynamicData<\/code> \u8fd9\u4e9b\u7c7b\u7684\u4f5c\u7528\u5417\uff1f<\/li>\n<li>\u4f60\u77e5\u9053\u5982\u4f55\u5904\u7406\u53ef\u89c2\u6d4b\u5bf9\u8c61\u7684\u5f02\u5e38\u5417\uff1f<\/li>\n<li>\u4f60\u77e5\u9053\u5982\u4f55\u53d6\u6d88\u4e00\u4e2a\u4ece\u53ef\u89c2\u6d4b\u5bf9\u8c61\u6216\u5f02\u6b65\u4efb\u52a1\u521b\u5efa\u7684\u547d\u4ee4\u5417\uff1f<\/li>\n<li>\u4f60\u77e5\u9053\u5982\u4f55\u6b63\u786e\u642d\u914d IoC \u5bb9\u5668\u6765\u4f7f\u7528 RxUI \u5417\uff1f\u4f60\u77e5\u9053 RxUI \u6240\u4f9d\u8d56\u7684 Splat \u5417\uff1f<\/li>\n<li>\u4f60\u719f\u6089\u54cd\u5e94\u5f0f\u7f16\u7a0b\u5417\uff1f<\/li>\n<\/ul>\n<p>\u6700\u540e\u4e00\u4e2a\u95ee\u9898\u5e94\u8be5\u624d\u662f\u7075\u9b42\u62f7\u95ee\u3002\u5982\u679c\u4f60\u6ca1\u6709\u62ff\u4e0b\u54cd\u5e94\u5f0f\u7f16\u7a0b\u7684\u4fe1\u5fc3\uff0c\u90a3\u4e48\u6211\u5efa\u8bae\u4f60\u8fd8\u662f\u5148\u653e\u5f03 RxUI\uff0c\u5e76\u4e14\u4e5f\u57fa\u672c\u4e0a\u4e0d\u8981\u6307\u671b\u53ef\u4ee5\u4e00\u8fb9\u5b66\u4e60 RxUI \u4e00\u8fb9\u5165\u95e8\u54cd\u5e94\u5f0f\u7f16\u7a0b\uff0c\u56e0\u4e3a\u54cd\u5e94\u5f0f\u7f16\u7a0b\u662f\u4e00\u79cd\u601d\u60f3\uff0c\u800c\u8fd9\u4e2a\u601d\u60f3\u5728 RxUI \u4e2d\u53ea\u4f53\u73b0\u4e86\u4e00\u65b9\u9762\u3002\u4f46 RxUI \u8fd8\u9700\u8981\u5b66\u4e60\u7684\u4e1c\u897f\u8fd8\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u5982\u4f55\u9075\u5faa MVVM \u6a21\u5f0f\uff0c\u5982\u4f55\u6b63\u786e\u4f7f\u7528\u4f9d\u8d56\u6ce8\u5165\uff0c\u5982\u4f55\u7ba1\u7406\u89c6\u56fe\u7684\u751f\u547d\u5468\u671f\uff0c\u5982\u4f55\u5728\u754c\u9762\u6846\u67b6\u4e2d\u53bb\u5b9e\u73b0\u7ed1\u5b9a\u7b49\u3002\u5982\u679c\u4f60\u4e00\u8fb9\u5b66\u4e60\u4e00\u8fb9\u5f00\u53d1\uff0c\u90a3\u4e48\u5f88\u6709\u53ef\u80fd\u968f\u7740\u4f60\u6162\u6162\u7406\u89e3\u8fd9\u4e00\u5207\uff0c\u4f60\u4f1a\u53d1\u73b0\u4f60\u4e4b\u524d\u5199\u7684\u4ee3\u7801\u662f\u591a\u4e48\u5730\u7cdf\u7cd5\u3002<\/p>\n<h2 id=\"\u5f53\u4f60\u5ea6\u8fc7\u91cd\u91cd\u56f0\u96be\u6700\u7ec8\u4f1a\u5f97\u5230\u4ec0\u4e48\">\n\u5f53\u4f60\u5ea6\u8fc7\u91cd\u91cd\u56f0\u96be\uff0c\u6700\u7ec8\u4f1a\u5f97\u5230\u4ec0\u4e48\uff1f\n<a href=\"#%e5%bd%93%e4%bd%a0%e5%ba%a6%e8%bf%87%e9%87%8d%e9%87%8d%e5%9b%b0%e9%9a%be%e6%9c%80%e7%bb%88%e4%bc%9a%e5%be%97%e5%88%b0%e4%bb%80%e4%b9%88\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u597d\u5427\u3002\u5047\u5982\u4f60\u5386\u7ecf\u5343\u8f9b\u4e07\u82e6\uff0c\u7ec8\u4e8e\u719f\u7ec3\u638c\u63e1\u4e86 RxUI\uff0c\u90a3\u4e48\u4f60\u4f1a\u5f97\u5230\u4ec0\u4e48\u5462\uff1f\u6216\u8005\u8bf4\uff0c\u5982\u679c\u4f60\u6253\u4e00\u5f00\u59cb\u5c31\u9009\u62e9\u4e86 CommunityToolkit.Mvvm\uff0c\u4f60\u4f1a\u635f\u5931\u4ec0\u4e48\uff1f<\/p>\n<p>\u9996\u5148\uff0c\u4f60\u53ef\u4ee5\u4f18\u96c5\u5730\u5b9e\u73b0\u4e00\u4e2a\u641c\u7d22\u6846\uff0c\u8fd9\u4e5f\u662f RxUI \u5b98\u65b9\u793a\u4f8b\u4e2d\u7ecf\u5e38\u5c55\u793a\u7684\u573a\u666f\uff1a\u7528\u6237\u8f93\u5165\u6587\u5b57\uff0c\u641c\u7d22\u7ed3\u679c\u5b9e\u65f6\u66f4\u65b0\uff0c\u5e76\u80fd\u6709\u6548\u5904\u7406\u5ef6\u8fdf\u3001\u53bb\u91cd\u7b49\u590d\u6742\u903b\u8f91\uff1b\u6b64\u5916\uff0c\u5982\u679c\u6709\u4e00\u4e9b\u5c5e\u6027\u53ca\u547d\u4ee4\uff0c\u5b83\u4eec\u4e4b\u95f4\u7684\u901a\u77e5\u5173\u7cfb\u6bd4\u8f83\u590d\u6742\uff0c\u90a3\u4e48 RxUI \u4f1a\u8ba9\u4f60\u7684\u4ee3\u7801\u66f4\u52a0\u76f4\u89c2\uff0c\u597d\u6bd4\u4e8e\u4ece\u5927\u5bb6\u7684\u4e3b\u52a8\u901a\u77e5\u76ee\u6807\u53d8\u6210\u4e86\u76ee\u6807\u53bb\u4e3b\u52a8\u89c2\u5bdf\u5927\u5bb6\uff1b\u66f4\u91cd\u8981\u7684\u662f\uff0c\u4f60\u8fd8\u5165\u95e8\u4e86\u54cd\u5e94\u5f0f\u7f16\u7a0b\u8fd9\u4e00\u4e2a\u6709\u8da3\u7684\u6982\u5ff5\u3002<\/p>\n<p>\u7136\u800c\uff0c\u8fd9\u79cd\u4fbf\u5229\u5e76\u975e\u6beb\u65e0\u4ee3\u4ef7\u3002\u4f60\u53ef\u80fd\u4f1a\u4e3a\u4e86\u638c\u63e1 RxUI \u4ed8\u51fa\u5927\u91cf\u7684\u65f6\u95f4\u548c\u7cbe\u529b\u3002\u66f4\u91cd\u8981\u7684\u662f\uff0c\u4f60\u7684\u4ee3\u7801\u5e93\u53ef\u80fd\u4f1a\u53d8\u5f97\u96be\u4ee5\u7ef4\u62a4\uff0c\u56e0\u4e3a\u5176\u4e2d\u5145\u65a5\u7740 RxUI \u7279\u6709\u7684 API \u548c\u6982\u5ff5\u3002\u8fd9\u4e9b API \u672c\u8eab\u5c31\u5e26\u6709\u4e00\u4e1d\u201c\u9ed1\u9b54\u6cd5\u201d\u7684\u8272\u5f69\uff0c\u53ef\u80fd\u4f1a\u8ba9\u56e2\u961f\u4e2d\u7684\u5176\u4ed6\u6210\u5458\uff0c\u751a\u81f3\u672a\u6765\u7684\u7ef4\u62a4\u8005\u611f\u5230\u56f0\u60d1\u2014\u2014\u638c\u63e1\u8fd9\u95e8\u6846\u67b6\u7684\u4eba\u624d\uff0c\u591a\u5417\uff1f<\/p>\n<p>\u9047\u5230\u4e86\u56f0\u96be\uff0c\u4f60\u53bb\u770b\u5b98\u65b9\u6587\u6863\uff0c\u53bb\u95ee\u7fa4\u53cb\uff0c\u53bb\u95ee\u5927\u6a21\u578b\uff0c\u6050\u6015\u90fd\u4e0d\u4f1a\u6709\u592a\u591a\u7684\u5e2e\u52a9\u3002\u81f3\u5c11\u6211\u5e76\u4e0d\u8ba4\u4e3a\uff0cRxUI \u8fd9\u4e48\u590d\u6742\u7684\u6846\u67b6\uff0c\u5b83\u7684\u5b98\u65b9\u6587\u6863\u8db3\u591f\u8be6\u5c3d\u548c\u6613\u61c2\uff0c\u6211\u4e5f\u57fa\u672c\u4e0a\u627e\u4e0d\u5230\u4ec0\u4e48\u7a0d\u5fae\u6df1\u5165\u4e00\u4e9b\u7684\u793a\u4f8b\u9879\u76ee\uff0c\u66f4\u662f\u51e0\u4e4e\u770b\u4e0d\u5230\u6709\u591a\u5c11\u4eba\u5728\u5199\u5173\u4e8e RxUI \u7684\u535a\u5ba2\u2014\u2014\u90a3\u8be5\u5982\u4f55\u6307\u671b\u5927\u8bed\u8a00\u6a21\u578b\u80fd\u591f\u638c\u63e1\u8fd9\u4e2a\u6280\u672f\u5462\uff1f<\/p>\n<p>\u4f46\u5982\u679c\u4f60\u9009\u62e9\u4e86\u522b\u7684\u6846\u67b6\uff0c\u90a3\u4e48\u76f8\u5173\u7684\u6559\u7a0b\u5b9e\u5728\u662f\u592a\u591a\u4e86\uff0c\u6bd5\u7adf MVVM \u6559\u7a0b\u591a\u5f97\u662f\uff0c\u65e0\u975e\u5c31\u662f\u4e86\u89e3\u4e00\u4e0b\u6846\u67b6\u7684\u7528\u6cd5\uff0c\u5b83\u4eec\u7684\u89c6\u56fe\u6a21\u578b\u7684\u57fa\u7c7b\u662f\u5982\u4f55\u5b9e\u73b0 INPC \u63a5\u53e3\uff0c\u5e76\u63d0\u4f9b\u4e86\u4e00\u4e9b\u989d\u5916\u7684\u8f85\u52a9\u65b9\u6cd5\u7684\uff0c\u5c31\u5dee\u4e0d\u591a\u4e86\u3002\u8fd9\u4e48\u76f4\u767d\u7684\u5b66\u4e60\u8def\u7ebf\uff0c\u662f RxUI \u6240\u4e0d\u62e5\u6709\u7684\uff0c\u56e0\u4e3a\u540e\u8005\u9700\u8981\u66f4\u591a\u7684\u80cc\u666f\u77e5\u8bc6\u3002<\/p>\n<p>\u54e6\u5bf9\u4e86\uff0c\u5dee\u70b9\u5fd8\u4e86\u4e00\u4ef6\u4e8b\u60c5\uff1a\u5982\u679c\u4f60\u9009\u62e9\u4e86 RxUI\uff0c\u4f60\u8fd8\u6709\u53ef\u80fd\u83b7\u5f97\u4e00\u4e2a\u201c\u56db\u4e0d\u50cf\u201d\u7684\u9879\u76ee\u3002\u56e0\u4e3a RxUI \u4e3a\u4e86\u5b9e\u73b0 MVVM\uff0c\u5c06\u6574\u4e2a\u54cd\u5e94\u5f0f\u7f16\u7a0b\u7684\u6982\u5ff5\u5f15\u5165\u5230\u4e86\u9879\u76ee\u4e2d\uff0c\u4f46\u662f\u8fd9\u4e00\u6982\u5ff5\u4e00\u822c\u60c5\u51b5\u4e0b\u6211\u4eec\u6839\u672c\u7528\u4e0d\u5230\u3002\u56e0\u6b64\uff0c\u5f88\u591a\u4eba\u5373\u4fbf\u5728\u81ea\u5df1\u7684\u9879\u76ee\u4e2d\u4f7f\u7528\u4e86 RxUI\uff0c\u4f46\u662f\u5bf9\u4e8e\u5176\u4ed6\u7684\u4e1a\u52a1\u903b\u8f91\uff0c\u4ecd\u65e7\u4f7f\u7528\u7684\u662f\u4f20\u7edf\u7684\u601d\u8def\uff0c\u6bd4\u5982\u4f7f\u7528\u591a\u7ebf\u7a0b\u52a0\u9501\uff08\u597d\u4e00\u70b9\u7684\u7528\u4fe1\u53f7\u91cf\uff0c\u5dee\u4e00\u70b9\u7684\u751a\u81f3\u8fd8\u5728\u7528 bool \u7c7b\u578b\u7684\u6807\u5fd7\u4f4d\uff09\u3001\u7ebf\u7a0b\u5b89\u5168\u7684\u961f\u5217\u3001LINQ \u751a\u81f3\u662f <code>for<\/code> \u5faa\u73af\uff0c\u800c\u5b8c\u5168\u4e0d\u8003\u8651 Rx \u63d0\u4f9b\u7684\u6570\u636e\u6d41\u8fd9\u4e00\u6982\u5ff5\u3002<\/p>\n<p>\u6b64\u5916\uff0cRxUI \u8fd8\u5f15\u5165\u4e86 Splat \u8fd9\u4e2a\u5e93\uff0c\u7528\u4e8e\u89e3\u51b3\u8de8\u5e73\u53f0\u7684\u95ee\u9898\uff08\u6bd4\u5982\u8bfb\u53d6\u672c\u5730\u56fe\u7247\u7b49\uff09\uff0c\u8fd8\u63d0\u4f9b\u4e86\u4e00\u5957\u7b80\u5355\u7684 IoC \u5bb9\u5668\u2014\u2014\u4e0d\u7ba1\u4f60\u7528\u5230\u7528\u4e0d\u5230\uff0c\u5b83\u90fd\u5728\u90a3\u91cc\u3002\u4f5c\u4e3a\u4e00\u4e2a\u5b8c\u7f8e\u4e3b\u4e49\u8005\uff0c\u6211\u975e\u5e38\u4e0d\u559c\u6b22\u5f15\u5165\u4e00\u4e2a\u5e93\uff0c\u4f46\u662f\u53ea\u7528\u4e86\u4e00\u5c0f\u90e8\u5206\u529f\u80fd\u8fd9\u4ef6\u4e8b\u60c5\u3002\u56e0\u6b64\u6211\u66f4\u559c\u6b22 CommunityToolkit.Mvvm\uff0c\u56e0\u4e3a\u5b83\u53ea\u63d0\u4f9b\u4e86 MVVM \u7684\u57fa\u7840\u529f\u80fd\uff0c\u6211\u53ef\u4ee5\u968f\u610f\u642d\u914d\u5176\u4ed6\u6211\u60f3\u7528\u7684 IoC \u5bb9\u5668\u7b49\uff08\u540c\u7406\uff0c\u6211\u4e5f\u5e76\u4e0d\u600e\u4e48\u559c\u6b22 Prism\uff09\u3002<\/p>\n<p>\u56e0\u6b64\uff0c\u6743\u8861\u5229\u5f0a\u81f3\u5173\u91cd\u8981\u3002\u5982\u679c\u4f60\u9700\u8981\u5904\u7406\u6781\u5176\u590d\u6742\u7684\u54cd\u5e94\u5f0f\u573a\u666f\uff0c\u5e76\u4e14\u613f\u610f\u6295\u5165\u5927\u91cf\u65f6\u95f4\u548c\u7cbe\u529b\u53bb\u5b66\u4e60\u548c\u7ef4\u62a4\uff0c\u90a3\u4e48 RxUI \u6216\u8bb8\u662f\u4e00\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\uff1b\u4f46\u5982\u679c\u4f60\u7684\u9879\u76ee\u590d\u6742\u5ea6\u9002\u4e2d\uff0c\u6216\u8005\u56e2\u961f\u6210\u5458\u5bf9\u54cd\u5e94\u5f0f\u7f16\u7a0b\u4e0d\u719f\u6089\uff0c\u90a3\u4e48\u9009\u62e9\u66f4\u6613\u4e0a\u624b\u7684\u6846\u67b6\u53ef\u80fd\u66f4\u4e3a\u660e\u667a\u3002\u6bd5\u7adf\uff0c\u6280\u672f\u7684\u9009\u62e9\u5e94\u8be5\u670d\u52a1\u4e8e\u9879\u76ee\u7684\u76ee\u6807\uff0c\u800c\u4e0d\u662f\u53cd\u8fc7\u6765\u3002<\/p>\n<h2 id=\"\u6211\u8fd8\u6253\u4e0d\u6253\u7b97\u8bb2-rxui-\u4e86\">\n\u6211\u8fd8\u6253\u4e0d\u6253\u7b97\u8bb2 RxUI \u4e86\uff1f\n<a href=\"#%e6%88%91%e8%bf%98%e6%89%93%e4%b8%8d%e6%89%93%e7%ae%97%e8%ae%b2-rxui-%e4%ba%86\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u662f\u4e00\u4e2a\u5145\u6ee1\u77db\u76fe\u7684\u95ee\u9898\u3002\u4e00\u65b9\u9762\uff0c\u6211\u5199\u4e86\u8fd9\u4e48\u591a\u6765\u201c\u5531\u8870\u201dRxUI\uff0c\u529d\u9000\u65b0\u624b\uff0c\u4f3c\u4e4e\u5df2\u7ecf\u7ed9\u5b83\u5224\u4e86\u201c\u6b7b\u5211\u201d\u3002\u90a3\u4e48\uff0c\u6211\u8fd8\u4f1a\u7ee7\u7eed\u6df1\u5165\u8bb2\u89e3\u5b83\u5417\uff1f<\/p>\n<p>\u6211\u60f3\uff0c\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002\u5c3d\u7ba1\u5165\u95e8\u95e8\u69db\u9ad8\uff0c\u7ef4\u62a4\u6210\u672c\u5927\uff0c\u4f46 RxUI \u7ec8\u7a76\u662f\u4e00\u95e8\u6709\u8da3\u7684\u6280\u672f\uff0c\u4e00\u4e2a\u6709\u7740\u5341\u51e0\u5e74\u5386\u53f2\u5374\u4f9d\u7136\u201c\u65b0\u9896\u201d\u7684\u6846\u67b6\uff0c\u4e00\u4e2a\u80fd\u5c06\u4e0d\u754f\u6311\u6218\u7684\u5f00\u53d1\u8005\u7b5b\u9009\u51fa\u6765\u7684\u6982\u5ff5\u3002\u80fd\u591f\u653b\u514b\u5b83\uff0c\u638c\u63e1\u5b83\uff0c\u5e76\u5c06\u7ecf\u9a8c\u5206\u4eab\u7ed9\u5927\u5bb6\uff0c\u8fd9\u672c\u8eab\u5c31\u662f\u4e00\u4ef6\u5145\u6ee1\u6210\u5c31\u611f\u7684\u4e8b\u60c5\u3002<\/p>\n<p>\u5f53\u7136\uff0c\u8fd9\u4e00\u5929\u6050\u6015\u4e0d\u4f1a\u5f88\u5feb\u5230\u6765\u3002\u9996\u5148\uff0c\u6211\u5bf9\u54cd\u5e94\u5f0f\u7f16\u7a0b\u672c\u8eab\u7684\u7406\u89e3\u8fd8\u9700\u8981\u8fdb\u4e00\u6b65\u52a0\u6df1\u3002\u5176\u6b21\uff0c\u5982\u679c\u4ec5\u4ec5\u662f\u91cd\u590d\u4ecb\u7ecd <code>RaiseAndSetIfChanged<\/code>\u3001<code>ReactiveCommand<\/code>\u3001<code>ObservableAsPropertyHelper<\/code> \u8fd9\u4e9b\u57fa\u7840\u7528\u6cd5\uff0c\u90a3\u6beb\u65e0\u610f\u4e49\u3002\u5e02\u9762\u4e0a\u5e76\u4e0d\u7f3a\u4e4f\u8fd9\u79cd\u7ea7\u522b\u7684\u6559\u7a0b\u3002\u771f\u6b63\u6709\u4ef7\u503c\u7684\uff0c\u662f\u89e3\u51b3\u524d\u9762\u63d0\u5230\u7684\u90a3\u4e9b\u6df1\u5c42\u95ee\u9898\uff0c\u5e2e\u52a9\u5927\u5bb6\u771f\u6b63\u7406\u89e3\u548c\u638c\u63e1 RxUI \u7684\u7cbe\u9ad3\u3002\u5426\u5219\uff0c\u4e92\u8054\u7f51\u4e0a\u53ea\u4f1a\u591a\u51fa\u4e00\u7bc7\u5e73\u5eb8\u7684\u201c\u6559\u7a0b\u201d\uff0c\u800c\u4e0d\u662f\u4e00\u7bc7\u771f\u6b63\u5177\u6709\u201c\u6559\u80b2\u610f\u4e49\u201d\u7684\u6587\u7ae0\u3002<\/p>\n<p>\u6240\u4ee5\uff0c\u6211\u771f\u5fc3\u671f\u5f85\u6709\u8bfb\u8005\u80fd\u5728\u8bc4\u8bba\u533a\u201c\u6253\u8138\u201d\uff0c\u5206\u4eab\u4f60\u4f18\u79c0\u7684 RxUI \u5b66\u4e60\u8def\u7ebf\u548c\u5b9e\u8df5\u7ecf\u9a8c\u3002\u8fd9\u4e0d\u4ec5\u80fd\u8ba9\u6211\u53d7\u76ca\uff0c\u66f4\u80fd\u5e2e\u52a9\u6240\u6709\u5bf9 RxUI \u611f\u5174\u8da3\u7684\u5f00\u53d1\u8005\u3002\u5982\u679c\u80fd\u770b\u5230\u66f4\u591a\u4eba\u5206\u4eab\u4ed6\u4eec\u6210\u529f\u4f7f\u7528 RxUI \u7684\u6848\u4f8b\uff0c\u90a3\u5c06\u662f\u5bf9\u6211\u89c2\u70b9\u6700\u597d\u7684\u53cd\u9a73\uff0c\u4e5f\u662f\u6211\u6700\u4e50\u4e8e\u89c1\u5230\u7684\u3002\u6bd5\u7adf\uff0c\u6280\u672f\u7684\u4e16\u754c\uff0c\u6c38\u8fdc\u6b22\u8fce\u4e0d\u540c\u7684\u58f0\u97f3\u548c\u89c2\u70b9\u3002<\/p>"},{"title":"WPF \u4e2d\u7684 ContentControl \u53ca ContentPresenter \u6709\u4f55\u5f02\u540c\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/contentcontrol-vs-contentpresenter\/","pubDate":"Wed, 05 Mar 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/contentcontrol-vs-contentpresenter\/","description":"<p>\u6807\u9898\u4e2d\u63d0\u5230\u7684 <code>ContentControl<\/code> \u548c <code>ContentPresenter<\/code> \u90fd\u662f WPF \u4e2d\u8f83\u4e3a\u5e38\u89c1\u7684\u663e\u793a\u5185\u5bb9\u7684\u63a7\u4ef6\uff0c\u5b83\u4eec\u6709\u5404\u81ea\u7684\u7528\u9014\u3002\u4f46\u6709\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u8005\u53ef\u80fd\u4f1a\u641e\u4e0d\u6e05\u695a\u5b83\u4eec\u4e4b\u95f4\u7684\u533a\u522b\uff0c\u5bfc\u81f4\u9009\u9519\u4e86\u63a7\u4ef6\uff08\u5374\u5f80\u5f80\u53c8\u56e0\u4e3a\u6548\u679c\u5b9e\u73b0\u4e86\u800c\u5ffd\u89c6\u8fd9\u4e00\u95ee\u9898\uff09\u3002\u672c\u6587\u5c06\u7b80\u5355\u4ecb\u7ecd\u4e00\u4e0b\u8fd9\u4e24\u4e2a\u63a7\u4ef6\u7684\u5f02\u540c\u3002<\/p>\n<h2 id=\"\u4e8c\u8005\u7684\u5171\u540c\u70b9\">\n\u4e8c\u8005\u7684\u5171\u540c\u70b9\n<a href=\"#%e4%ba%8c%e8%80%85%e7%9a%84%e5%85%b1%e5%90%8c%e7%82%b9\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\uff0c\u6211\u4eec\u6765\u770b\u4e00\u4e0b <code>ContentControl<\/code> \u548c <code>ContentPresenter<\/code> \u4e4b\u95f4\u7684\u5171\u540c\u70b9\uff1a<\/p>\n<ol>\n<li>\u90fd\u5305\u542b\u4e00\u4e2a <code>Content<\/code> \u5c5e\u6027\uff1b<\/li>\n<li>\u90fd\u53ef\u4ee5\u7528\u4f5c\u4e00\u4e2a\u5c06\u8981\u5c55\u793a\u5185\u5bb9\u7684\u5bb9\u5668\u6216\u5360\u4f4d\u7b26\uff1b<\/li>\n<li>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u901a\u5e38\u90fd\u6ca1\u6709\u4ec0\u4e48\u6837\u5f0f\uff0c\u5b8c\u5168\u900f\u660e\u4e14\u7a7a\u767d\uff0c\u770b\u8d77\u6765\u5341\u5206\u8f7b\u91cf\u3002<\/li>\n<\/ol>\n<p>\u56e0\u6b64\uff0c\u5f53\u7528\u4e8e\u5c55\u793a\u4e00\u4e2a\u63a7\u4ef6\u6216\u5185\u5bb9\u65f6\uff0c\u5b83\u4eec\u770b\u8d77\u6765\u90fd\u53ef\u4ee5\u80dc\u4efb\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ContentControl&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/ContentControl&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6216\u8005\u6211\u4eec\u8fd8\u53ef\u4ee5\u5728\u8d44\u6e90\u8bcd\u5178\u4e2d\u58f0\u660e\u4e00\u4e2a\u63a7\u4ef6\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;MyButton&#34;<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span> <span class=\"na\">x:Shared=<\/span><span class=\"s\">&#34;False&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ContentControl<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;{StaticResource MyButton}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u8fd9\u91cc\u6211\u4eec\u4f7f\u7528\u4e86 <code>x:Shared=&quot;False&quot;<\/code> \u6765\u786e\u4fdd\u6bcf\u6b21\u4f7f\u7528\u8fd9\u4e2a\u8d44\u6e90\u65f6\u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u5b9e\u4f8b\u3002\u5426\u5219\uff0c\u5982\u679c\u6211\u4eec\u5728\u591a\u4e2a\u5730\u65b9\u4f7f\u7528\u8fd9\u4e2a\u8d44\u6e90\uff0c\u90a3\u4e48\u8fd9\u4e9b\u5730\u65b9\u7684\u63a7\u4ef6\u90fd\u4f1a\u6307\u5411\u540c\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u5bfc\u81f4\u4e00\u4e9b\u95ee\u9898\uff08\u6bd4\u5982\u53ea\u6709\u4e00\u4e2a\u63a7\u4ef6\u6b63\u786e\u663e\u793a\uff09\u3002<\/div>\n<\/div>\n<p>\u5f53\u7136\u4e86\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u5728\u4ee3\u7801\u540e\u53f0\u53bb\u52a8\u6001\u8bbe\u7f6e <code>Content<\/code> \u5c5e\u6027\uff0c\u8fd9\u91cc\u6211\u4eec\u5c31\u4e0d\u6f14\u793a\u4e86\u3002<\/p>\n<h2 id=\"\u4e8c\u8005\u7684\u533a\u522b\">\n\u4e8c\u8005\u7684\u533a\u522b\n<a href=\"#%e4%ba%8c%e8%80%85%e7%9a%84%e5%8c%ba%e5%88%ab\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4f46\u6b63\u662f\u56e0\u4e3a\u5b83\u4eec\u6709\u7740\u8fd9\u6837\u7684\u76f8\u540c\u70b9\uff0c\u56e0\u6b64\u7ecf\u5e38\u4f1a\u6709\u5f00\u53d1\u8005\u8bef\u7528\u4e86\u5b83\u4eec\u4e24\u4e2a\u3002\u90a3\u4e48\uff0c\u5b83\u4eec\u4e4b\u95f4\u7684\u533a\u522b\u53c8\u662f\u4ec0\u4e48\u5462\uff1f<\/p>\n<h3 id=\"\u5b83\u4eec\u7684\u57fa\u7c7b\u4e0d\u540c\">\n\u5b83\u4eec\u7684\u57fa\u7c7b\u4e0d\u540c\n<a href=\"#%e5%ae%83%e4%bb%ac%e7%9a%84%e5%9f%ba%e7%b1%bb%e4%b8%8d%e5%90%8c\" class=\"anchor\">&para;<\/a>\n<\/h3><p><code>ContentControl<\/code> \u662f <code>Control<\/code> \u7684\u5b50\u7c7b\uff0c\u800c <code>ContentPresenter<\/code> \u662f <code>FrameworkElement<\/code> \u7684\u5b50\u7c7b\u3002<\/p>\n<p>\u9996\u5148\u6211\u4eec\u6765\u770b <code>FrameworkElement<\/code>\u3002\u5b83\u63d0\u4f9b\u4e86\u4e00\u4e9b\u6700\u57fa\u672c\u7684\u754c\u9762\u5143\u7d20\u5e94\u8be5\u6709\u7684\u5c5e\u6027\uff0c\u6bd4\u5982\u5bbd\u9ad8\u3001\u6837\u5f0f\u3001\u5e03\u5c40\u7b49\u3002<code>Control<\/code> \u662f\u5b83\u7684\u5b50\u7c7b\uff0c\u989d\u5916\u6dfb\u52a0\u4e86\u63a7\u4ef6\u9700\u8981\u7684\u8fb9\u6846\u3001\u524d\u80cc\u666f\u8272\u3001\u5b57\u4f53\u7b49\uff0c\u8fd8\u6709\u4e00\u4e2a\u76f8\u5f53\u91cd\u8981\u7684\u5c5e\u6027 <code>Template<\/code>\uff0c\u7528\u4e8e\u5b9a\u4e49\u63a7\u4ef6\u7684\u5916\u89c2\u3002<\/p>\n<p>\u7136\u540e\uff0c\u5728\u8fd9\u4e9b\u7684\u57fa\u7840\u4e0a\uff0c<code>ContentControl<\/code> \u7ee7\u627f\u4e86 <code>Control<\/code>\uff0c\u5e76\u6dfb\u52a0\u4e86\u4e00\u4e2a <code>Content<\/code> \u5c5e\u6027\uff0c\u7528\u4e8e\u5b58\u653e\u8981\u5c55\u793a\u7684\u5185\u5bb9\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c\u56e0\u4e3a\u5b83\u62e5\u6709\u6a21\u677f\uff08\u4ee5\u53ca\u6a21\u677f\u9009\u62e9\u5668\u7b49\uff09\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u6839\u636e\u4e00\u4e9b\u56e0\u7d20\u9009\u62e9\u5408\u9002\u7684\u6a21\u677f\u4ece\u800c\u53bb\u5c55\u793a\u5185\u5bb9\uff0c\u5e76\u4e14\u975e\u5e38\u9002\u5408\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u6539\u53d8\u5185\u5bb9\u3002\u6b64\u5916\uff0c\u5b83\u7684 <code>Content<\/code> \u4e0d\u4ec5\u53ef\u4ee5\u662f\u4e00\u4e2a\u5177\u4f53\u7684\u63a7\u4ef6\uff0c\u8fd8\u53ef\u4ee5\u662f\u4e00\u4e2a\u6570\u636e\u6a21\u578b\u7b49\uff08\u901a\u5e38\u8fd8\u53ef\u4ee5\u662f\u7ed1\u5b9a\u5f97\u5230\u7684\uff09\u3002<\/p>\n<p>\u53e6\u4e00\u65b9\u9762\uff0c<code>ContentPresenter<\/code> \u5e76\u4e0d\u62e5\u6709 <code>Control<\/code> \u6240\u63d0\u4f9b\u7684\u90a3\u4e9b\u5c5e\u6027\uff0c\u53ef\u4ee5\u8bf4\u662f\u4e00\u4e2a\u76f8\u5f53\u8f7b\u91cf\u7684\u754c\u9762\u5143\u7d20\u3002\u5b83\u7684\u4e3b\u8981\u4f7f\u7528\u573a\u666f\u5c31\u662f\u5728\u6a21\u677f\u4e2d\uff0c\u7528\u4e8e\u5c55\u793a\u6a21\u677f\u7684\u5185\u5bb9\u3002\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u5728\u4e00\u4e2a <code>Button<\/code> \u7684\u6a21\u677f\u4e2d\u4f7f\u7528 <code>ContentPresenter<\/code> \u6765\u5c55\u793a\u6309\u94ae\u7684\u5185\u5bb9\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ContentTemplate<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;MyButtonTemplate&#34;<\/span> <span class=\"na\">TargetType=<\/span><span class=\"s\">&#34;Button&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Border&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ContentPresenter<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Border&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/ContentTemplate&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0d\u4ec5\u5982\u6b64\uff0c\u56e0\u4e3a\u5b83\u592a\u9002\u5408\u7528\u5728\u8fd9\u4e2a\u573a\u666f\u4e86\uff0c\u6240\u4ee5\u901a\u5e38\u6211\u4eec\u6839\u672c\u4e0d\u9700\u8981\u53bb\u64cd\u4f5c\u5b83\u7684 <code>Content<\/code> \u5c5e\u6027\uff0c\u56e0\u4e3a\u5b83\u4f1a\u81ea\u52a8\u7ed1\u5b9a\u5230\u6a21\u677f\u7684 <code>Content<\/code> \u5c5e\u6027\u4e0a\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u4e0d\u9700\u8981\u5199 <code>Content=&quot;{TemplateBinding Content}&quot;<\/code> \u8fd9\u6837\u7684\u4ee3\u7801\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5176\u5b9e <code>ContentPresenter<\/code> \u7684\u4f5c\u7528\u5c31\u662f\u5728\u6a21\u677f\u4e2d\u7528\u6765\u5c55\u793a <code>Content<\/code>\uff0c\u6240\u4ee5 <code>ContentControl<\/code> \u53ca\u5176\u5b50\u63a7\u4ef6\u81ea\u7136\u4e5f\u90fd\u7528\u5230\u4e86\u5b83\u3002\u5982\u679c\u4f60\u5728\u4e00\u4e2a\u6a21\u677f\u4e2d\uff0c\u9519\u8bef\u5730\u5c06 <code>ContentControl<\/code> \u7528\u5728\u4e86\u5e94\u8be5\u7528 <code>ContentPresenter<\/code> \u7684\u5730\u65b9\uff0c\u5e76\u4e14\u624b\u5199\u4e86 <code>Content<\/code> \u5c5e\u6027\u7684\u7ed1\u5b9a\uff0c\u90a3\u4e48\u4f60\u4ecd\u7136\u6709\u53ef\u80fd\u770b\u5230\u6b63\u786e\u7684\u6548\u679c\u3002\u53ea\u662f\u5b83\u5e95\u5c42\u4f9d\u65e7\u662f\u501f\u52a9\u4e86 <code>ContentPresenter<\/code>\u3002<\/div>\n<\/div>\n<h3 id=\"\u5b83\u4eec\u7684\u529f\u80fd\u4e0d\u540c\">\n\u5b83\u4eec\u7684\u529f\u80fd\u4e0d\u540c\n<a href=\"#%e5%ae%83%e4%bb%ac%e7%9a%84%e5%8a%9f%e8%83%bd%e4%b8%8d%e5%90%8c\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u56e0\u4e3a\u4e0a\u9762\u7684\u539f\u56e0\uff0c\u6240\u4ee5\u5373\u4fbf\u5b83\u4eec\u770b\u8d77\u6765\uff08\u751a\u81f3\u7b80\u5355\u4f7f\u7528\u8d77\u6765\uff09\u5e76\u6ca1\u6709\u4ec0\u4e48\u533a\u522b\uff0c\u4f46\u662f\u5b83\u4eec\u88ab\u8bbe\u8ba1\u51fa\u6765\u7684\u76ee\u7684\u53ca\u4f5c\u7528\u662f\u5b8c\u5168\u4e0d\u4e00\u6837\u7684\u3002<\/p>\n<p><code>ContentControl<\/code> \u4e00\u822c\u6765\u8bf4\u6709\u8fd9\u4e48\u51e0\u79cd\u7528\u9014\uff1a<\/p>\n<ol>\n<li>\u7528\u4e8e\u5c55\u793a\u4e00\u4e2a\u63a7\u4ef6\u6216\u5185\u5bb9\uff08\u53ef\u4ee5\u7406\u89e3\u4e3a\u5bb9\u5668\u6216\u5360\u4f4d\u7b26\uff09\uff1b<\/li>\n<li>\u7528\u4f5c\u63a7\u4ef6\u7684\u57fa\u7c7b\uff0c\u53ef\u4ee5\u88ab\u7ee7\u627f\uff0c\u4ece\u800c\u5b9e\u73b0\u4e00\u4e9b\u81ea\u5b9a\u4e49\u7684\u63a7\u4ef6\uff1b<\/li>\n<li>\u7528\u4e8e\u52a8\u6001\u6539\u53d8\u5185\u5bb9\uff0c\u6bd4\u5982\u5728\u8fd0\u884c\u65f6\u6539\u53d8 <code>Content<\/code> \u5c5e\u6027\uff1b<\/li>\n<li>\u642d\u914d <code>DataTemplate<\/code> \u4f7f\u7528\uff0c\u7528\u4e8e\u6839\u636e\u6570\u636e\u6a21\u578b\u5c55\u793a\u4e0d\u540c\u7684\u5185\u5bb9\uff08\u5c24\u5176\u9002\u7528\u4e8e\u5bfc\u822a\u9875\u9762\uff09\u3002<\/li>\n<\/ol>\n<p>\u5bf9\u4e8e\u7b2c 4 \u70b9\uff0c\u8fd9\u91cc\u6709\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ContentControl<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;{Binding CurrentPageViewModel}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ContentControl.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;DataTemplate<\/span> <span class=\"na\">DataType=<\/span><span class=\"s\">&#34;{x:Type local:HomePage}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;local:HomePage<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/DataTemplate&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;DataTemplate<\/span> <span class=\"na\">DataType=<\/span><span class=\"s\">&#34;{x:Type local:AboutPage}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;local:AboutPage<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/DataTemplate&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ContentControl.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/ContentControl&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6b64\u65f6\uff0c\u867d\u7136\u5b83\u7684 <code>Content<\/code> \u5c5e\u6027\u7684\u503c\u5e76\u4e0d\u662f\u4e00\u4e2a\u63a7\u4ef6\uff0c\u800c\u662f\u4e00\u4e2a\u6a21\u578b\uff08Model\uff09\uff0c\u4f46\u662f\u5b83\u4f1a\u6839\u636e\u8fd9\u4e2a\u6a21\u578b\u7684\u7c7b\u578b\u81ea\u52a8\u9009\u62e9\u5408\u9002\u7684\u6a21\u677f\u6765\u5c55\u793a\u5185\u5bb9\u3002\u8fd9\u6837\u7684\u8bdd\uff0c\u53ea\u8981\u6211\u4eec\u7ed9\u5b83\u63d0\u4f9b\u89c6\u56fe\u6a21\u578b\uff08ViewModel\uff09\uff0c\u5b83\u5c31\u53ef\u4ee5\u81ea\u52a8\u9009\u62e9\u76f8\u5e94\u7684\u89c6\u56fe\uff08View\uff09\u6765\u5c55\u793a\uff0c\u5e76\u4e14\u8fd8\u4f1a\u81ea\u52a8\u5c06 <code>View<\/code> \u7684 <code>DataContext<\/code> \u8bbe\u7f6e\u4e3a <code>Content<\/code> \u7684\u503c\u3002<\/p>\n<p>\u800c <code>ContentPresenter<\/code> \u4e00\u822c\u6765\u8bf4\u53ea\u6709\u4e00\u79cd\u7528\u9014\uff0c\u90a3\u5c31\u662f\u7528\u5728 <code>ControlTemplate<\/code> \u4e2d\u3002\u7c7b\u4f3c\u7684\uff0c\u8fd8\u6709\u4e00\u4e2a <code>ItemsPresenter<\/code>\uff0c\u7528\u4e8e\u5728 <code>ItemsControl<\/code> \uff08\u53ca\u5176\u5b50\u63a7\u4ef6\uff0c\u5982 <code>ListBox<\/code> \u7b49\uff09\u7684\u6a21\u677f\u4e2d\u5c55\u793a\u5b50\u9879\u3002\u5982\u679c\u4f60\u5728\u4e00\u4e2a\u9700\u8981\u4f7f\u7528 <code>ContentControl<\/code> \u7684\u5730\u65b9\u4f7f\u7528\u4e86 <code>ContentPresenter<\/code>\uff0c\u90a3\u4e48\u4f60\u4e0d\u4ec5\u6ca1\u6709\u529e\u6cd5\u64cd\u4f5c <code>Template<\/code> \u6216\u63d0\u4f9b <code>DataTemplate<\/code> \u6765\u5c55\u793a\u6570\u636e\uff0c\u800c\u4e14\u8fd8\u5c06\u6ca1\u6709\u529e\u6cd5\u64cd\u4f5c\u4e00\u4e9b\u6700\u57fa\u672c\u7684 <code>Control<\/code> \u7684\u5c5e\u6027\uff0c\u6bd4\u5982\u524d\u666f\u8272\u3001\u80cc\u666f\u8272\u3001\u5b57\u4f53\u7b49\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6df1\u5165\u4e86\u89e3 <code>ContentControl<\/code> \u548c <code>ContentPresenter<\/code> \u7684\u533a\u522b\uff0c\u53ef\u80fd\u663e\u5f97\u6709\u4e9b\u7e41\u7410\u3002\u5176\u5b9e\u5927\u5bb6\u57fa\u672c\u4e0a\u53ea\u9700\u8981\u8bb0\u4f4f\uff0c<code>ContentPresenter<\/code> \u51e0\u4e4e\u53ea\u7528\u4e8e\u6a21\u677f\u4e2d\uff0c\u5176\u4f59\u60c5\u51b5\u4e0b\u90fd\u53ef\u4ee5\u4f7f\u7528 <code>ContentControl<\/code> \u5373\u53ef\u3002<\/p>\n<p>\u8ba9\u5408\u9002\u7684\u63a7\u4ef6\u505a\u5408\u9002\u7684\u4e8b\u60c5\uff0c\u8fd9\u6837\u624d\u6709\u52a9\u4e8e\u6211\u4eec\u5f00\u53d1\u51fa\u66f4\u52a0\u6e05\u6670\u3001\u7a33\u5065\u3001\u6613\u7ef4\u62a4\u7684\u4ee3\u7801\u3002<\/p>"},{"title":"WPF \u4e2d ObjectDataProvider \u7684\u4e00\u4e9b\u6709\u8da3\u7528\u6cd5","link":"https:\/\/blog.coldwind.top\/posts\/objectdataprovider-tips\/","pubDate":"Fri, 07 Feb 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/objectdataprovider-tips\/","description":"<img src=\"https:\/\/s2.loli.net\/2025\/03\/04\/6BmTwRWGapOPoIE.webp\" alt=\"Featured image of post WPF \u4e2d ObjectDataProvider \u7684\u4e00\u4e9b\u6709\u8da3\u7528\u6cd5\" \/><p>WPF \u4e2d\u7684 <code>ObjectDataProvider<\/code> \u662f\u4e00\u4e2a\u5f88\u6709\u7528\u7684\u7c7b\u3002\u4e0e\u5e38\u89c1\u7684\u76f4\u63a5\u7ed1\u5b9a\u5230\u5c5e\u6027\uff08\u5305\u62ec\u63a7\u4ef6\u7684\u4f9d\u8d56\u5c5e\u6027\u3001\u7c7b\u7684\u5b9e\u4f8b\u7684\u5c5e\u6027\u3001\u9759\u6001\u5c5e\u6027\u6216\u5b57\u6bb5\u7b49\uff09\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u53ef\u4ee5\u901a\u8fc7\u8c03\u7528\u6784\u9020\u51fd\u6570\u7684\u65b9\u5f0f\u6765\u521b\u5efa\u5bf9\u8c61\uff0c\u6216\u8c03\u7528\u5bf9\u8c61\u7684\u65b9\u6cd5\u6765\u83b7\u53d6\u6570\u636e\uff0c\u8fdb\u800c\u5c06\u5176\u7528\u4f5c\u7ed1\u5b9a\u7684\u6570\u636e\u6e90\u3002<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u5c31\u6765\u63a2\u8ba8\u4e00\u4e0b\u5b83\u7684\u4e00\u4e9b\u5b9e\u7528\u800c\u6709\u8da3\u7684\u7528\u6cd5\u3002<\/p>\n<h2 id=\"\u57fa\u672c\u7528\u6cd5\">\n\u57fa\u672c\u7528\u6cd5\n<a href=\"#%e5%9f%ba%e6%9c%ac%e7%94%a8%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"\u521b\u5efa\u5bf9\u8c61\">\n\u521b\u5efa\u5bf9\u8c61\n<a href=\"#%e5%88%9b%e5%bb%ba%e5%af%b9%e8%b1%a1\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u9996\u5148\uff0c\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u6700\u57fa\u672c\u7684\u7528\u6cd5\uff1a\u901a\u8fc7 <code>ObjectDataProvider<\/code> \u6765\u521b\u5efa\u4e00\u4e2a\u5bf9\u8c61\u3002\u6bd4\u5982\u6211\u4eec\u6709\u4e00\u4e2a <code>Person<\/code> \u7c7b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Person<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">age<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"n\">name<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Age<\/span> <span class=\"p\">=<\/span> <span class=\"n\">age<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c <code>Person<\/code> \u63d0\u4f9b\u4e86\u65e0\u53c2\u6784\u9020\u51fd\u6570\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u7528\u4f20\u7edf\u7684\u65b9\u5f0f\u76f4\u63a5\u5b9e\u4f8b\u5316\u4e00\u4e2a\u5bf9\u8c61\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;local:Person<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;PersonObject&#34;<\/span> <span class=\"na\">Name=<\/span><span class=\"s\">&#34;Tom&#34;<\/span> <span class=\"na\">Age=<\/span><span class=\"s\">&#34;25&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u73b0\u5728\u6211\u4eec\u5047\u8bbe <code>Person<\/code> \u7c7b\u53ea\u63d0\u4f9b\u4e86\u6709\u53c2\u6784\u9020\u51fd\u6570\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u65e0\u6cd5\u76f4\u63a5\u5b9e\u4f8b\u5316\u4e00\u4e2a\u5bf9\u8c61\u4e86\u3002\u8fd9\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 <code>ObjectDataProvider<\/code> \u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;PersonObject&#34;<\/span> <span class=\"na\">ObjectType=<\/span><span class=\"s\">&#34;{x:Type local:Person}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider.ConstructorParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:String&gt;<\/span>John<span class=\"nt\">&lt;\/sys:String&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32&gt;<\/span>25<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider.ConstructorParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{Binding Name, Source={StaticResource PersonObject}}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{Binding Age, Source={StaticResource PersonObject}}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u6211\u4eec\u901a\u8fc7 <code>ObjectType<\/code> \u5c5e\u6027\u6307\u5b9a\u4e86 <code>Person<\/code> \u7c7b\u578b\uff0c\u901a\u8fc7 <code>ConstructorParameters<\/code> \u5c5e\u6027\u4f20\u5165\u4e86\u6784\u9020\u51fd\u6570\u7684\u53c2\u6570\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u6210\u529f\u5730\u521b\u5efa\u4e86\u4e00\u4e2a <code>Person<\/code> \u5bf9\u8c61\uff0c\u5e76\u5c06\u5176\u7ed1\u5b9a\u5230\u4e86\u4e24\u4e2a <code>TextBlock<\/code> \u63a7\u4ef6\u4e0a\u3002<\/p>\n<h3 id=\"\u8c03\u7528\u65b9\u6cd5\">\n\u8c03\u7528\u65b9\u6cd5\n<a href=\"#%e8%b0%83%e7%94%a8%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u9664\u4e86\u521b\u5efa\u5bf9\u8c61\uff0c<code>ObjectDataProvider<\/code> \u8fd8\u53ef\u4ee5\u8c03\u7528\u5bf9\u8c61\u7684\u65b9\u6cd5\u3002\u6bd4\u5982\u6211\u4eec\u6709\u4e00\u4e2a <code>Calculator<\/code> \u7c7b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Calculator<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">b<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">a<\/span> <span class=\"p\">+<\/span> <span class=\"n\">b<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u65b9\u5f0f\u8c03\u7528 <code>Add<\/code> \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;CalculatorObject&#34;<\/span> <span class=\"na\">ObjectType=<\/span><span class=\"s\">&#34;{x:Type local:Calculator}&#34;<\/span> <span class=\"na\">MethodName=<\/span><span class=\"s\">&#34;Add&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32&gt;<\/span>10<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32&gt;<\/span>20<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{Binding Source={StaticResource CalculatorObject}}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0a\u9762\u7684\u65b9\u5f0f\u4f1a\u81ea\u52a8\u521b\u5efa\u4e00\u4e2a <code>Calculator<\/code> \u5bf9\u8c61\uff0c\u5e76\u8c03\u7528\u5176 <code>Add<\/code> \u65b9\u6cd5\uff0c\u4f20\u5165\u4e86\u4e24\u4e2a\u53c2\u6570\u3002\u6211\u4eec\u8fd8\u53ef\u4ee5\u5c06 <code>Calculator<\/code> \u7c7b\u53ca\u5176\u6210\u5458\u58f0\u660e\u4e3a\u9759\u6001\u7684\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u907f\u514d\u521b\u5efa\u5bf9\u8c61\u4e86\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5982\u679c <code>ObjectType<\/code> \u6307\u5b9a\u7684\u7c7b\u578b\u4e0d\u662f\u9759\u6001\u7684\uff0c\u90a3\u4e48\u5373\u4fbf\u6211\u4eec\u8981\u8bbf\u95ee\u7684\u5c5e\u6027\u6216\u65b9\u6cd5\u662f\u9759\u6001\u7684\uff0c<code>ObjectDataProvider<\/code> \u4e5f\u4f1a\u81ea\u52a8\u521b\u5efa\u4e00\u4e2a\u5bf9\u8c61\u3002\u8fd9\u4e00\u73b0\u8c61\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u901a\u8fc7\u89c2\u5bdf\u8be5\u8d44\u6e90\u7684 <code>ObjectInstance<\/code> \u5c5e\u6027\u6765\u9a8c\u8bc1\u3002<\/div>\n<\/div>\n<h3 id=\"\u7ed9\u5b9a\u5b9e\u4f8b\">\n\u7ed9\u5b9a\u5b9e\u4f8b\n<a href=\"#%e7%bb%99%e5%ae%9a%e5%ae%9e%e4%be%8b\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u9664\u4e86\u6307\u5b9a <code>ObjectType<\/code> \u5c5e\u6027\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u901a\u8fc7 <code>ObjectInstance<\/code> \u5c5e\u6027\u6765\u6307\u5b9a\u4e00\u4e2a\u5b9e\u4f8b\u3002\u6bd4\u5982\u6211\u4eec\u4e0a\u9762\u7684 <code>Calculator<\/code> \u7c7b\u63d0\u4f9b\u4e86\u5355\u4f8b\u6a21\u5f0f\u7684\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Calculator<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">Calculator<\/span> <span class=\"n\">Instance<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u65b9\u5f0f\u8c03\u7528 <code>Add<\/code> \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;CalculatorObject&#34;<\/span> <span class=\"na\">ObjectInstance=<\/span><span class=\"s\">&#34;{x:Static local:Calculator.Instance}&#34;<\/span> <span class=\"na\">MethodName=<\/span><span class=\"s\">&#34;Add&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32&gt;<\/span>10<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32&gt;<\/span>20<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{Binding Source={StaticResource CalculatorObject}}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5f53\u6211\u4eec\u6307\u5b9a\u4e86 <code>ObjectInstance<\/code> \u5c5e\u6027\u540e\uff0c\u5c31\u4e0d\u9700\u8981\u518d\u6307\u5b9a <code>ObjectType<\/code> \u5c5e\u6027\u4e86\u3002<\/p>\n<h3 id=\"\u5de5\u5382\u6a21\u5f0f\">\n\u5de5\u5382\u6a21\u5f0f\n<a href=\"#%e5%b7%a5%e5%8e%82%e6%a8%a1%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u8fd8\u6709\u4e00\u4e2a\u7ecf\u5178\u7528\u6cd5\u662f\uff0c\u6211\u4eec\u53ef\u4ee5\u7ed3\u5408\u5de5\u5382\u6a21\u5f0f\u6765\u5728 XAML \u4e2d\u521b\u5efa\u5bf9\u8c61\u3002\u6bd4\u5982\u6211\u4eec\u6709\u4e00\u4e2a <code>PersonFactory<\/code> \u7c7b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">PersonFactory<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">Person<\/span> <span class=\"n\">CreatePerson<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">age<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">age<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u65b9\u5f0f\u521b\u5efa\u4e00\u4e2a <code>Person<\/code> \u5bf9\u8c61\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;PersonFactory&#34;<\/span> <span class=\"na\">ObjectType=<\/span><span class=\"s\">&#34;{x:Type local:PersonFactory}&#34;<\/span> <span class=\"na\">MethodName=<\/span><span class=\"s\">&#34;CreatePerson&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:String&gt;<\/span>John<span class=\"nt\">&lt;\/sys:String&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32&gt;<\/span>25<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u4fbf\u4e3a XAML \u6ce8\u5165\u4e86\u66f4\u591a\u7684\u6d3b\u529b\u4e0e\u7075\u6d3b\u6027\u3002<\/p>\n<h2 id=\"\u7ecf\u5178\u7528\u6cd5\">\n\u7ecf\u5178\u7528\u6cd5\n<a href=\"#%e7%bb%8f%e5%85%b8%e7%94%a8%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"\u7ed1\u5b9a\u679a\u4e3e\u7c7b\u578b\u5230\u4e0b\u62c9\u9009\u5355\">\n\u7ed1\u5b9a\u679a\u4e3e\u7c7b\u578b\u5230\u4e0b\u62c9\u9009\u5355\n<a href=\"#%e7%bb%91%e5%ae%9a%e6%9e%9a%e4%b8%be%e7%b1%bb%e5%9e%8b%e5%88%b0%e4%b8%8b%e6%8b%89%e9%80%89%e5%8d%95\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u76f8\u4fe1\u6240\u6709\u548c <code>ComboBox<\/code> \u63a7\u4ef6\u6253\u8fc7\u4ea4\u9053\u7684\u5f00\u53d1\u8005\u90fd\u77e5\u9053\uff0c\u5982\u679c\u6211\u4eec\u5e0c\u671b\u5c06\u4e00\u4e2a\u679a\u4e3e\u7c7b\u578b\u7684\u503c\u7ed1\u5b9a\u5230 <code>ComboBox<\/code> \u63a7\u4ef6\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 <code>ObjectDataProvider<\/code> \u6765\u5b9e\u73b0\u3002<\/p>\n<p>\u6bd4\u5982\u6211\u4eec\u6709\u4e00\u4e2a <code>Fruit<\/code> \u679a\u4e3e\u7c7b\u578b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">enum<\/span> <span class=\"n\">Fruit<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Apple<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Banana<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Orange<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Pear<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u65b9\u5f0f\u5c06\u5176\u7ed1\u5b9a\u5230 <code>ComboBox<\/code> \u63a7\u4ef6\u4e0a\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;FruitEnumValues&#34;<\/span> <span class=\"na\">MethodName=<\/span><span class=\"s\">&#34;GetValues&#34;<\/span> <span class=\"na\">ObjectType=<\/span><span class=\"s\">&#34;{x:Type sys:Enum}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;x:Type<\/span> <span class=\"na\">TypeName=<\/span><span class=\"s\">&#34;local:Fruit&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ComboBox<\/span> <span class=\"na\">ItemsSource=<\/span><span class=\"s\">&#34;{Binding Source={StaticResource FruitEnumValues}}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u5176\u5b9e\u5c31\u4f53\u73b0\u4e86\u5bf9\u4e8e\u7c7b\u578b\u65b9\u6cd5\u7684\u8c03\u7528\u3002\u9996\u5148\uff0c\u6211\u4eec\u77e5\u9053\u5728 C# \u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u8fd9\u6837\u7684\u65b9\u5f0f\u6765\u83b7\u53d6\u679a\u4e3e\u7c7b\u578b\u7684\u6240\u6709\u503c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">values<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Enum<\/span><span class=\"p\">.<\/span><span class=\"n\">GetValues<\/span><span class=\"p\">(<\/span><span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">Fruit<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e5f\u5c31\u662f\u6211\u4eec\u8c03\u7528\u4e86 <code>Enum<\/code> \u7c7b\u578b\u7684 <code>GetValues<\/code> \u9759\u6001\u65b9\u6cd5\uff0c\u5e76\u4f20\u5165\u4e86 <code>Fruit<\/code> \u7c7b\u578b\uff08<code>Type<\/code>\uff09\uff0c\u4ece\u800c\u83b7\u53d6\u6240\u6709\u7684\u679a\u4e3e\u503c\u3002\u800c\u5728 XAML \u4e2d\uff0c\u6211\u4eec\u5c31\u662f\u501f\u52a9 <code>ObjectDataProvider<\/code> \u6765\u5b9e\u73b0\u4e86\u76f8\u540c\u7684\u64cd\u4f5c\u3002\u6211\u4eec\u901a\u8fc7 <code>ObjectType<\/code> \u5c5e\u6027\u6307\u5b9a\u4e86 <code>Enum<\/code> \u7c7b\u578b\uff0c\u901a\u8fc7 <code>MethodName<\/code> \u5c5e\u6027\u6307\u5b9a\u4e86 <code>GetValues<\/code> \u65b9\u6cd5\uff0c\u518d\u901a\u8fc7 <code>MethodParameters<\/code> \u5c5e\u6027\u4f20\u5165\u4e86 <code>Fruit<\/code> \u7c7b\u578b\u3002<\/p>\n<h3 id=\"\u4e3a\u4e0b\u62c9\u9009\u5355\u63d0\u4f9b\u6574\u6570\u6570\u636e\u6e90\">\n\u4e3a\u4e0b\u62c9\u9009\u5355\u63d0\u4f9b\u6574\u6570\u6570\u636e\u6e90\n<a href=\"#%e4%b8%ba%e4%b8%8b%e6%8b%89%e9%80%89%e5%8d%95%e6%8f%90%e4%be%9b%e6%95%b4%e6%95%b0%e6%95%b0%e6%8d%ae%e6%ba%90\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u501f\u9274\u4e0a\u9762\u7684\u601d\u8def\uff0c\u6211\u4eec\u5f88\u5bb9\u6613\u4ea7\u751f\u66f4\u591a\u7684\u60f3\u6cd5\uff1a\u65e2\u7136\u5b83\u53ef\u4ee5\u8c03\u7528\u4efb\u4f55\u7c7b\u578b\u7684\u65b9\u6cd5\uff0c\u90a3\u4e48 LINQ \u7684 <code>Enumerable<\/code> \u4e0a\u9762\u7684\u4e00\u4e9b\u9759\u6001\u65b9\u6cd5\u5c82\u4e0d\u4e5f\u80fd\u4e3a\u6211\u4eec\u6240\u7528\u4e86\uff1f<\/p>\n<p>\u90a3\u4e48\u6211\u4eec\u5c31\u8d76\u5feb\u6765\u8bd5\u4e00\u8bd5\u5427\u3002\u6211\u4eec\u5047\u5982\u6211\u4eec\u60f3\u7ed9\u4e00\u4e2a <code>ComboBox<\/code> \u6dfb\u52a0\u51e0\u4e2a\u8fde\u7eed\u7684\u6570\u5b57\u4f5c\u4e3a\u5b83\u7684\u9009\u9879\uff08\u6bd4\u5982 1~5\uff09\uff0c\u5728\u4ee3\u7801\u540e\u53f0\u6211\u4eec\u4f1a\u8fd9\u6837\u8c03\u7528\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">numbers<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Enumerable<\/span><span class=\"p\">.<\/span><span class=\"n\">Range<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u90a3\u4e48\u5728 XAML \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"na\">xmlns:linq=<\/span><span class=\"s\">&#34;clr-namespace:System.Linq;assembly=netstandard&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;Numbers&#34;<\/span> <span class=\"na\">MethodName=<\/span><span class=\"s\">&#34;Range&#34;<\/span> <span class=\"na\">ObjectType=<\/span><span class=\"s\">&#34;{x:Type linq:Enumerable}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32&gt;<\/span>1<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;sys:Int32&gt;<\/span>5<span class=\"nt\">&lt;\/sys:Int32&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider.MethodParameters&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ObjectDataProvider&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ComboBox<\/span> <span class=\"na\">ItemsSource=<\/span><span class=\"s\">&#34;{Binding Source={StaticResource Numbers}}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u662f\u4e0d\u662f\u5f88\u6709\u610f\u601d\u5462\uff1f<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>ObjectDataProvider<\/code> \u662f\u4e00\u4e2a\u975e\u5e38\u6709\u7528\u7684\u7c7b\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5728 XAML \u4e2d\u5b9e\u73b0\u66f4\u591a\u7684\u529f\u80fd\u3002\u901a\u8fc7\u8c03\u7528\u6784\u9020\u51fd\u6570\u6216\u5bf9\u8c61\u7684\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u66f4\u591a\u7684\u6570\u636e\u7ed1\u5b9a\u64cd\u4f5c\u3002\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u6839\u636e\u5177\u4f53\u7684\u9700\u6c42\uff0c\u7075\u6d3b\u5730\u4f7f\u7528 <code>ObjectDataProvider<\/code>\uff0c\u4ece\u800c\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\u3002<\/p>\n<p>\u4e0d\u8fc7\uff0c\u597d\u7528\u5f52\u597d\u7528\uff0c\u5b83\u6216\u8bb8\u5e76\u4e0d\u603b\u662f\u6700\u4f18\u89e3\u3002\u5982\u679c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9 <code>ViewModel<\/code> \u4e2d\u7684\u6210\u5458\uff0c\u6216 <code>MarkupExtension<\/code> \u7b49\u65b9\u5f0f\u6765\u5b9e\u73b0\uff0c\u90a3\u4e48\u6211\u4eec\u4e00\u822c\u5c31\u53ef\u4ee5\u4e0d\u8003\u8651\u4f7f\u7528 <code>ObjectDataProvider<\/code> \u4e86\u3002\u6bd5\u7adf\uff0c<code>ObjectDataProvider<\/code> \u58f0\u660e\u8d77\u6765\u8fd8\u662f\u663e\u5f97\u6709\u4e9b\u7e41\u7410\uff0c\u800c\u4e14\u56e0\u4e3a\u501f\u52a9\u53cd\u5c04\uff0c\u6211\u4eec\u5728\u7f16\u8bd1\u65f6\u4e5f\u53ef\u80fd\u65e0\u6cd5\u53d1\u73b0\u4e00\u4e9b\u6f5c\u5728\u7684\u95ee\u9898\u3002<\/p>"},{"title":"\u4e3a\u4ec0\u4e48\u7528\u6237\u5bc6\u7801\u9700\u8981\u52a0\u76d0\u54c8\u5e0c\u540e\u518d\u5b58\u50a8\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/why-password-hash-with-salt\/","pubDate":"Thu, 23 Jan 2025 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/why-password-hash-with-salt\/","description":"<img src=\"https:\/\/s2.loli.net\/2025\/01\/23\/oNjelMu2p8TmiPw.jpg\" alt=\"Featured image of post \u4e3a\u4ec0\u4e48\u7528\u6237\u5bc6\u7801\u9700\u8981\u52a0\u76d0\u54c8\u5e0c\u540e\u518d\u5b58\u50a8\uff1f\" \/><blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1F4wWehErP\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<p>\u6211\u4eec\u5e38\u8bf4\uff0c\u5bc6\u7801\u4e0d\u80fd\u660e\u6587\u5b58\u50a8\u5728\u6570\u636e\u5e93\u4e2d\uff0c\u800c\u662f\u5e94\u5f53\u54c8\u5e0c\u540e\u5b58\u50a8\u3002\u5c24\u5176\u6211\u4eec\u8fd8\u8981\u5bf9\u5bc6\u7801\u8fdb\u884c\u52a0\u76d0\u5904\u7406\u3002\u8fd9\u6837\u505a\u7684\u76ee\u7684\u53ca\u5fc5\u8981\u6027\u662f\u4ec0\u4e48\u5462\uff1f\u5728 C# \u4e2d\u53c8\u8be5\u5982\u4f55\u5b9e\u73b0\u5462\uff1f\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u5c31\u6765\u63a2\u8ba8\u4e00\u4e0b\u3002\u6211\u4eec\u5c06\u4ece\u6700\u4e0d\u5b89\u5168\u5230\u6700\u5b89\u5168\uff0c\u9010\u6b65\u8bb2\u89e3\u4e3a\u4ec0\u4e48\u8981\u8fd9\u6837\u505a\u3002<\/p>\n<h2 id=\"\u660e\u6587\u5b58\u50a8\">\n\u660e\u6587\u5b58\u50a8\n<a href=\"#%e6%98%8e%e6%96%87%e5%ad%98%e5%82%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6211\u4eec\u5c31\u6765\u770b\u4e00\u770b\u6700\u4e0d\u5b89\u5168\u7684\u65b9\u5f0f\u5427\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">User<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"c1\">\/\/ \u81ea\u589e\u4e3b\u952e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Username<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Password<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"c1\">\/\/ \u660e\u6587\u5bc6\u7801<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u53bb\u521b\u5efa\u4e00\u4e2a\u7528\u6237\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">user<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">User<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Username<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;admin&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Password<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;123456&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u90a3\u4e48\u73b0\u5728\uff0c\u6570\u636e\u5e93\u4e2d\u5b58\u50a8\u7684\u5c31\u662f\u7528\u6237\u7684\u660e\u6587\u5bc6\u7801\u4e86\u3002\u8fd9\u6837\u5176\u5b9e\u662f\u975e\u5e38\u5371\u9669\u7684\u3002<\/p>\n<ul>\n<li>\u5047\u5982\u662f\u672c\u5730\u7684\u5982 SQLite \u6570\u636e\u5e93\uff0c\u90a3\u4e48\u53ea\u8981\u6709\u4eba\u80fd\u591f\u8bbf\u95ee\u5230\u6570\u636e\u5e93\u6587\u4ef6\uff0c\u6216\u901a\u8fc7\u53cd\u7f16\u8bd1\u7b49\u65b9\u5f0f\u83b7\u53d6\u5230\u4e86\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u90a3\u4e48\u5c31\u53ef\u4ee5\u76f4\u63a5\u770b\u5230\u7528\u6237\u7684\u5bc6\u7801\uff1b<\/li>\n<li>\u5047\u5982\u662f\u8fdc\u7a0b\u7684\u6570\u636e\u5e93\uff0c\u90a3\u4e48\u9ed1\u5ba2\u4f9d\u65e7\u6709\u591a\u79cd\u65b9\u5f0f\u53ef\u4ee5\u83b7\u53d6\u5230\u6570\u636e\u5e93\u7684\u6570\u636e\uff0c\u6bd4\u5982 SQL \u6ce8\u5165\u3001SSH \u5bc6\u94a5\u6cc4\u9732\u3001\u6570\u636e\u5e93\u5907\u4efd\u6587\u4ef6\u6cc4\u9732\u3001\u5176\u4ed6\u670d\u52a1\u5668\u6f0f\u6d1e\u7b49\u7b49\u3002<\/li>\n<\/ul>\n<p>\u660e\u6587\u7684\u5bc6\u7801\u53ef\u4ee5\u8bf4\u662f\u76f8\u5f53\u4e0d\u5e94\u8be5\u88ab\u6cc4\u9732\u7684\u3002\u5b83\u4e0d\u4ec5\u53ef\u80fd\u5305\u542b\u4e86\u7528\u6237\u7684\u79c1\u5bc6\u4fe1\u606f\u4ee5\u53ca\u4f7f\u7528\u4e60\u60ef\uff0c\u8fd8\u53ef\u4ee5\u88ab\u9ed1\u5ba2\u76f4\u63a5\u7528\u6765\u649e\u5e93\uff08\u5373\u901a\u8fc7\u6cc4\u9732\u7684\u5bc6\u7801\u5c1d\u8bd5\u767b\u5f55\u5176\u4ed6\u7f51\u7ad9\uff09\u3002\u6240\u4ee5\u6211\u4eec\u5e94\u5f53\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u907f\u514d\u660e\u6587\u5b58\u50a8\u5bc6\u7801\u3002<\/p>\n<h2 id=\"\u54c8\u5e0c\u5b58\u50a8md5--sha1\">\n\u54c8\u5e0c\u5b58\u50a8\uff08MD5 \/ SHA1\uff09\n<a href=\"#%e5%93%88%e5%b8%8c%e5%ad%98%e5%82%a8md5--sha1\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e0b\u9762\u6211\u4eec\u7a0d\u5fae\u5347\u7ea7\u4e00\u4e0b\u6211\u4eec\u7684\u4ee3\u7801\uff0c\u6539\u4e3a\u5b58\u50a8\u4f7f\u7528 MD5 \u6216 SHA1 \u54c8\u5e0c\u540e\u7684\u5bc6\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">User<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"c1\">\/\/ \u81ea\u589e\u4e3b\u952e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Username<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">PasswordHash<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"c1\">\/\/ \u5bc6\u7801\u54c8\u5e0c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u4e3a\u4e86\u65b9\u4fbf\u5f00\u53d1\uff0c\u6211\u4eec\u518d\u5199\u4e00\u4e2a\u5bc6\u7801\u8f85\u52a9\u7c7b\uff0c\u7528\u6765\u8fdb\u884c\u5bc6\u7801\u54c8\u5e0c\u53ca\u9a8c\u8bc1\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">PasswordHelper<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">HashPassword<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">md5<\/span> <span class=\"p\">=<\/span> <span class=\"n\">MD5<\/span><span class=\"p\">.<\/span><span class=\"n\">Create<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">hash<\/span> <span class=\"p\">=<\/span> <span class=\"n\">md5<\/span><span class=\"p\">.<\/span><span class=\"n\">ComputeHash<\/span><span class=\"p\">(<\/span><span class=\"n\">Encoding<\/span><span class=\"p\">.<\/span><span class=\"n\">UTF8<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">.<\/span><span class=\"n\">ToBase64String<\/span><span class=\"p\">(<\/span><span class=\"n\">hash<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">VerifyPassword<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">passwordHash<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">HashPassword<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">)<\/span> <span class=\"p\">==<\/span> <span class=\"n\">passwordHash<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u8fd9\u4e2a\u65b9\u6cd5\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528 MD5 \u7b97\u6cd5\u5bf9\u5bc6\u7801\u8fdb\u884c\u54c8\u5e0c\uff0c\u5e76\u6700\u7ec8\u8f6c\u6362\u4e3a Base64 \u5b57\u7b26\u4e32\u3002\u5728\u9a8c\u8bc1\u5bc6\u7801\u65f6\uff0c\u6211\u4eec\u53ea\u9700\u8981\u518d\u6b21\u54c8\u5e0c\u8f93\u5165\u7684\u5bc6\u7801\uff0c\u7136\u540e\u4e0e\u6570\u636e\u5e93\u4e2d\u7684\u5bc6\u7801\u54c8\u5e0c\u8fdb\u884c\u6bd4\u8f83\u5373\u53ef\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\"><p>\u4e3a\u4ec0\u4e48\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u5bc6\u7801\u8f6c\u4e3a Base64 \u5b57\u7b26\u4e32\u518d\u8fdb\u884c\u5b58\u50a8\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u5b58\u4e3a\u6bd4\u5982 BLOB \u5462\uff1f\u8fd9\u662f\u56e0\u4e3a Base64 \u5b57\u7b26\u4e32\u662f\u53ef\u8bfb\u7684\uff0c\u65b9\u4fbf\u6211\u4eec\u5728\u6570\u636e\u5e93\u4e2d\u67e5\u770b\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c\u5b57\u7b26\u4e32\u7684\u7d22\u5f15\u7684\u6548\u7387\u4e5f\u6bd4 BLOB \u66f4\u9ad8\u3002<\/p>\n<p>\u5728\u540e\u9762\u7684\u65b9\u6cd5\u4e2d\uff0c\u6211\u4eec\u8fd8\u4f1a\u770b\u5230\u4e00\u4e9b\u54c8\u5e0c\u540e\u7684\u5bc6\u7801\u672c\u8eab\u5c31\u662f\u53ef\u8bfb\u5b57\u7b26\u4e32\u7684\u65b9\u6cd5\u3002\u6240\u4ee5\u901a\u5e38\u6211\u4eec\u4f1a\u5c06\u5bc6\u7801\u54c8\u5e0c\u8f6c\u4e3a\u5b57\u7b26\u4e32\u8fdb\u884c\u5b58\u50a8\u3002<\/p><\/div>\n<\/div>\n<p>\u6b64\u65f6\u6211\u4eec\u4fdd\u5b58\u7684\u5bc6\u7801\u53ef\u80fd\u5f62\u5982\uff1a<\/p>\n<p><code>ISMvKXpXpadDiUoOSoAfww==<\/code><\/p>\n<p>\u73b0\u5728\u8fd9\u4e2a\u5bc6\u7801\u770b\u8d77\u6765\u663e\u7136\u6bd4\u660e\u6587\u8981\u5b89\u5168\u591a\u4e86\u3002\u4f46\u5f88\u53ef\u60dc\uff0c\u5728\u9ed1\u5ba2\u770b\u6765\uff0c\u8fd9\u6837\u7684\u5bc6\u7801\u6050\u6015\u5e76\u6ca1\u6709\u5b89\u5168\u592a\u591a\uff0c\u56e0\u4e3a\u6709\u4e00\u62db\u53eb\u505a<strong>\u5f69\u8679\u8868\u653b\u51fb<\/strong>\u3002\u7b80\u5355\u6765\u8bf4\uff0c\u9ed1\u5ba2\u53ef\u4ee5\u63d0\u524d\u751f\u6210\u4e00\u5f20\u5de8\u5927\u7684\u5f69\u8679\u8868\uff0c\u91cc\u9762\u5305\u542b\u4e86\u5e38\u89c1\u5bc6\u7801\u7684\u54c8\u5e0c\u503c\u3002\u7136\u540e\u9ed1\u5ba2\u53ea\u9700\u8981\u5c06\u6570\u636e\u5e93\u4e2d\u7684\u54c8\u5e0c\u503c\u4e0e\u5f69\u8679\u8868\u4e2d\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u5bf9\uff0c\u5c31\u53ef\u4ee5\u5f88\u5feb\u5730\u627e\u5230\u5bc6\u7801\u3002<\/p>\n<p>\u6bd4\u5982\u4e0a\u9762\u7684\u5bc6\u7801\uff0c\u5bf9\u5e94\u7684\u660e\u6587\u662f <code>admin<\/code>\u3002\u9ed1\u5ba2\u53ea\u9700\u8981\u5728\u5f69\u8679\u8868\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u54c8\u5e0c\u503c\uff0c\u5c31\u53ef\u4ee5\u8f7b\u677e\u7834\u89e3\u5bc6\u7801\u4e86\u3002\u53ef\u4e0d\u8981\u5c0f\u770b\u8fd9\u4e2a\u5f69\u8679\u8868\uff0c\u5b83\u901a\u5e38\u5305\u542b\u5de8\u91cf\u7684\u5e38\u89c1\u5bc6\u7801\uff0c\u751a\u81f3\u662f\u6240\u6709\u53ef\u80fd\u7684\u5bc6\u7801\u7ec4\u5408\u3002\u6240\u4ee5\uff0c\u9664\u975e\u4f60\u7684\u5bc6\u7801\u6bd4\u8f83\u590d\u6742\uff08\u6bd4\u5982\u5305\u542b\u5927\u5c0f\u5199\u3001\u6570\u5b57\u53ca\u7b26\u53f7\uff09\uff0c\u5426\u5219\u53ef\u80fd\u5c31\u4f1a\u88ab\u5f69\u8679\u8868\u8f7b\u6613\u7834\u89e3\u3002<\/p>\n<p>\u4e0d\u4ec5\u5982\u6b64\uff0cMD5 \u548c SHA1 \u7b97\u6cd5\u672c\u8eab\u4e5f\u662f\u4e0d\u5b89\u5168\u7684\u3002\u5b83\u4eec\u5df2\u7ecf\u88ab\u8bc1\u660e\u662f\u53ef\u4ee5\u88ab\u78b0\u649e\u7684\u3002\u6240\u8c13\u78b0\u649e\uff0c\u5c31\u662f\u4e24\u4e2a\u4e0d\u540c\u7684\u8f93\u5165\u53ef\u4ee5\u751f\u6210\u76f8\u540c\u7684\u54c8\u5e0c\u503c\u3002\u8fd9\u6837\u7684\u8bdd\uff0c\u9ed1\u5ba2\u5c31\u53ef\u4ee5\u901a\u8fc7\u78b0\u649e\u6765\u7834\u89e3\u5bc6\u7801\u4e86\u3002\u4ee5\u4e0a\u8ff0\u4f8b\u5b50\u6765\u8bf4\uff0c\u867d\u7136\u9ed1\u5ba2\u53ef\u80fd\u65e0\u6cd5\u901a\u8fc7\u5f69\u8679\u8868\u5f97\u77e5\u6211\u4eec\u7684\u660e\u6587\u662f <code>admin<\/code>\uff0c\u4f46\u662f\u4ed6\u901a\u8fc7\u8ba1\u7b97\u53d1\u73b0\uff0c<code>qwerty<\/code> \u540c\u6837\u53ef\u4ee5\u751f\u6210\u76f8\u540c\u7684\u54c8\u5e0c\u503c\uff0c\u90a3\u4e48\u4ed6\u5c31\u53ef\u4ee5\u7528 <code>qwerty<\/code> \u6765\u767b\u5f55\u4e86\u3002\u6bd5\u7adf\u670d\u52a1\u5668\u7aef\u7684\u6821\u9a8c\u53ea\u4f1a\u6bd4\u5bf9\u54c8\u5e0c\u503c\uff0c\u800c\u4e0d\u4f1a\u6bd4\u5bf9\u660e\u6587\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-sha256-\u52a0\u76d0\">\n\u4f7f\u7528 SHA256 \u52a0\u76d0\n<a href=\"#%e4%bd%bf%e7%94%a8-sha256-%e5%8a%a0%e7%9b%90\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u90a3\u4e48\uff0c\u6211\u4eec\u53ea\u597d\u8fdb\u4e00\u6b65\u5347\u7ea7\u6211\u4eec\u7684\u7b97\u6cd5\u4e86\u3002\u8fd9\u6b21\u6211\u4eec\u4f7f\u7528\u80fd\u591f\u9632\u6b62\u78b0\u649e\u7684 SHA256\uff08\u5b83\u662f SHA-2 \u7cfb\u5217\u4e2d\u7684\u4e00\u79cd\uff0c\u5176\u4ed6\u5e38\u89c1\u7684\u8fd8\u6709 SHA-384\u3001SHA-512 \u7b49\uff09\u7b97\u6cd5\uff0c\u5e76\u4e14\u52a0\u5165\u4e00\u4e2a\u968f\u673a\u7684\u76d0\u503c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">User<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"c1\">\/\/ \u81ea\u589e\u4e3b\u952e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Username<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">PasswordHash<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"c1\">\/\/ \u5bc6\u7801\u54c8\u5e0c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Salt<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"c1\">\/\/ \u76d0\u503c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\uff0c\u6211\u4eec\u4fee\u6539\u4e00\u4e0b <code>PasswordHelper<\/code> \u7c7b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">PasswordHelper<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">HashPassword<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">salt<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">passwordBytes<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Encoding<\/span><span class=\"p\">.<\/span><span class=\"n\">UTF8<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">combinedBytes<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[<\/span><span class=\"n\">passwordBytes<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span> <span class=\"p\">+<\/span> <span class=\"n\">salt<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Array<\/span><span class=\"p\">.<\/span><span class=\"n\">Copy<\/span><span class=\"p\">(<\/span><span class=\"n\">passwordBytes<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">combinedBytes<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">passwordBytes<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Array<\/span><span class=\"p\">.<\/span><span class=\"n\">Copy<\/span><span class=\"p\">(<\/span><span class=\"n\">salt<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">combinedBytes<\/span><span class=\"p\">,<\/span> <span class=\"n\">passwordBytes<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">,<\/span> <span class=\"n\">salt<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">hash<\/span> <span class=\"p\">=<\/span> <span class=\"n\">SHA256<\/span><span class=\"p\">.<\/span><span class=\"n\">HashData<\/span><span class=\"p\">(<\/span><span class=\"n\">combinedBytes<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">.<\/span><span class=\"n\">ToBase64String<\/span><span class=\"p\">(<\/span><span class=\"n\">hash<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">VerifyPassword<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">passwordHash<\/span><span class=\"p\">,<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">salt<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">HashPassword<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"n\">salt<\/span><span class=\"p\">)<\/span> <span class=\"p\">==<\/span> <span class=\"n\">passwordHash<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">GenerateSalt<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">RandomNumberGenerator<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"m\">16<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u4e00\u822c 16 \u5b57\u8282\uff08256 \u4f4d\uff09\u7684\u76d0\u503c\u5373\u53ef<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\"><p>\u5728\u8f83\u65b0\u7248\u672c\u7684 .NET \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5f88\u591a\u4fbf\u5229\u7684\u9759\u6001\u65b9\u6cd5\uff0c\u6bd4\u5982 <code>SHA256.HashData<\/code>\uff0c<code>RandomNumberGenerator.GetBytes<\/code> \u7b49\uff0c\u800c\u4e0d\u9700\u8981\u6211\u4eec\u5148\u521b\u5efa\u5b9e\u4f8b\u3002<\/p>\n<p>\u5728\u4ee5\u524d\uff0c\u5927\u5bb6\u53ef\u80fd\u4f1a\u89c1\u8fc7\u4f7f\u7528 <code>RNGCryptoServiceProvider<\/code> \u6765\u751f\u6210\u968f\u673a\u6570\u7684\u65b9\u6cd5\u3002\u4f46\u662f\u8be5\u65b9\u6cd5\u73b0\u5728\u5df2\u7ecf\u8fc7\u65f6\u3002<\/p><\/div>\n<\/div>\n<p>\u5728\u8fd9\u4e2a\u65b9\u6cd5\u4e2d\uff0c\u6211\u4eec\u5c06\u5bc6\u7801\u548c\u76d0\u503c\u5408\u5e76\u540e\u518d\u8fdb\u884c\u54c8\u5e0c\u3002\u8fd9\u6837\uff0c\u5373\u4f7f\u4e24\u4e2a\u7528\u6237\u7684\u5bc6\u7801\u76f8\u540c\uff0c\u7531\u4e8e\u76d0\u503c\u4e0d\u540c\uff0c\u6700\u7ec8\u7684\u54c8\u5e0c\u503c\u4e5f\u4f1a\u4e0d\u540c\u3002\u8fd9\u6837\u5c31\u907f\u514d\u4e86\u78b0\u649e\u7684\u95ee\u9898\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u76d0\u503c\u4e5f\u662f\u9700\u8981\u5b58\u50a8\u5728\u6570\u636e\u5e93\u4e2d\u7684\u3002\u8fd9\u6837\uff0c\u5728\u8fdb\u884c\u5bc6\u7801\u6821\u9a8c\u65f6\uff0c\u4f1a\u6839\u636e\u7528\u6237\u7684 <code>Id<\/code> \u6216 <code>Username<\/code> \u4ece\u6570\u636e\u5e93\u4e2d\u53d6\u51fa\u76d0\u503c\u53ca\u52a0\u76d0\u54c8\u5e0c\u540e\u7684\u5bc6\u7801\uff0c\u7136\u540e\u518d\u5c06\u7528\u6237\u8f93\u5165\u7684\u5bc6\u7801\u4f7f\u7528\u76f8\u540c\u7684\u76d0\u503c\u8fdb\u884c\u54c8\u5e0c\uff0c\u6700\u540e\u4e0e\u6570\u636e\u5e93\u4e2d\u7684\u5bc6\u7801\u8fdb\u884c\u6bd4\u5bf9\uff0c\u4ece\u800c\u5224\u65ad\u5bc6\u7801\u662f\u5426\u6b63\u786e\u3002<\/p>\n<p>\u8fd9\u6837\u7684\u5bc6\u7801\u5b58\u50a8\u65b9\u5f0f\uff0c\u5373\u4f7f\u9ed1\u5ba2\u62ff\u5230\u4e86\u6570\u636e\u5e93\uff0c\u4e5f\u65e0\u6cd5\u76f4\u63a5\u7834\u89e3\u5bc6\u7801\u3002\u56e0\u4e3a\u5f69\u8679\u8868\u653b\u51fb\u73b0\u5728\u5df2\u7ecf\u4e0d\u518d\u6709\u6548\uff0c\u6bd5\u7adf\u6bcf\u4e2a\u7528\u6237\u90fd\u6709\u4e0d\u540c\u7684\u76d0\u503c\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-pbkdf2\">\n\u4f7f\u7528 PBKDF2\n<a href=\"#%e4%bd%bf%e7%94%a8-pbkdf2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>SHA256 \u52a0\u76d0\u7684\u65b9\u5f0f\u5df2\u7ecf\u76f8\u5f53\u5b89\u5168\u4e86\uff0c\u4f46\u662f\u6211\u4eec\u8fd8\u53ef\u4ee5\u8fdb\u4e00\u6b65\u63d0\u5347\u5b89\u5168\u6027\u3002\u56e0\u4e3a\u9ed1\u5ba2\u867d\u7136\u65e0\u6cd5\u4f7f\u7528\u5f69\u8679\u8868\uff0c\u4f46\u4ecd\u7136\u53ef\u4ee5\u5c1d\u8bd5\u66b4\u529b\u7834\u89e3\u5bc6\u7801\u3002\u7b80\u5355\u6765\u8bf4\uff0c\u9ed1\u5ba2\u53ef\u4ee5\u5c1d\u8bd5\u4f7f\u7528\u5404\u79cd\u5bc6\u7801\u7ec4\u5408\uff0c\u7136\u540e\u901a\u8fc7\u54c8\u5e0c\u540e\u7684\u5bc6\u7801\u4e0e\u6570\u636e\u5e93\u4e2d\u7684\u5bc6\u7801\u8fdb\u884c\u6bd4\u5bf9\uff0c\u4ece\u800c\u7834\u89e3\u5bc6\u7801\u3002<\/p>\n<p>\u6240\u4ee5\uff0c\u4e3a\u4e86\u63d0\u9ad8\u5bc6\u7801\u88ab\u66b4\u529b\u7834\u89e3\u7684\u96be\u5ea6\uff0c\u4e4b\u540e\u6211\u4eec\u8981\u8003\u8651\u7684\u65b9\u6848\u57fa\u672c\u4e0a\u5c31\u662f\u56f4\u7ed5\u7740\u63d0\u9ad8\u8ba1\u7b97\u7684\u901f\u5ea6\u6765\u5c55\u5f00\u3002\u9996\u5148\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u4f7f\u7528 PBKDF2 \u7b97\u6cd5\u3002\u8fd9\u4e2a\u7b97\u6cd5\u5728\u5f88\u591a\u7f16\u7a0b\u8bed\u8a00\u7684\u6807\u51c6\u5e93\u4e2d\u5747\u6709\u63d0\u4f9b\u3002\u5728 C# \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>Rfc2898DeriveBytes<\/code> \u7c7b\u6765\u5b9e\u73b0\u3002\u6211\u4eec\u53ea\u9700\u8981\u7a0d\u52a0\u4fee\u6539\u6211\u4eec\u7684 <code>PasswordHelper<\/code> \u7c7b\u5373\u53ef\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">PasswordHelper<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">HashPassword<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">salt<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">pbkdf2<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Rfc2898DeriveBytes<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"n\">salt<\/span><span class=\"p\">,<\/span> <span class=\"m\">10000<\/span><span class=\"p\">,<\/span> <span class=\"n\">HashAlgorithmName<\/span><span class=\"p\">.<\/span><span class=\"n\">SHA256<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u8fed\u4ee3 10000 \u6b21<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">.<\/span><span class=\"n\">ToBase64String<\/span><span class=\"p\">(<\/span><span class=\"n\">pbkdf2<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"m\">32<\/span><span class=\"p\">));<\/span> <span class=\"c1\">\/\/ 32 \u5b57\u8282\uff08256 \u4f4d\uff09\u7684\u54c8\u5e0c\u503c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5176\u4ed6\u65b9\u6cd5\u4e0d\u53d8<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\"><code>Rfc2898<\/code> \u662f <code>PBKDF2<\/code> \u7684\u4e00\u4e2a\u5b9e\u73b0\uff0c\u6240\u4ee5\u8fd9\u91cc\u53ef\u4ee5\u8bf4\u662f\u4e00\u56de\u4e8b\uff0c\u53ea\u662f\u540d\u5b57\u4e0d\u540c\u3002\u53e6\u5916\uff0c<code>Rfc2898DeriveBytes<\/code> \u7684\u6784\u9020\u51fd\u6570\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u7ed9\u5b9a\u4f7f\u7528\u7684\u54c8\u5e0c\u7b97\u6cd5\uff0c\u5426\u5219\u4e0d\u5305\u542b\u8fd9\u4e00\u4f20\u53c2\u7684\u6784\u9020\u51fd\u6570\u4f1a\u63d0\u793a\u5df2\u8fc7\u65f6\u3002<\/div>\n<\/div>\n<p>\u5728\u8fd9\u4e2a\u65b9\u6cd5\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528 <code>Rfc2898DeriveBytes<\/code> \u7c7b\u6765\u8fdb\u884c\u5bc6\u7801\u54c8\u5e0c\u3002\u6211\u4eec\u53ef\u4ee5\u6307\u5b9a\u8fed\u4ee3\u6b21\u6570\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u63d0\u9ad8\u8ba1\u7b97\u7684\u901f\u5ea6\u3002\u4e00\u822c\u6765\u8bf4\uff0c\u8fed\u4ee3\u6b21\u6570\u8d8a\u591a\uff0c\u8ba1\u7b97\u7684\u901f\u5ea6\u5c31\u8d8a\u6162\uff0c\u9ed1\u5ba2\u7834\u89e3\u5bc6\u7801\u7684\u96be\u5ea6\u5c31\u8d8a\u5927\u3002\u4f46\u662f\uff0c\u8fed\u4ee3\u6b21\u6570\u4e5f\u4e0d\u80fd\u592a\u591a\uff0c\u5426\u5219\u4f1a\u5f71\u54cd\u7528\u6237\u767b\u5f55\u7684\u901f\u5ea6\u3002\u4e00\u822c\u6765\u8bf4\uff0c<code>10000<\/code> \u6b21\u8fed\u4ee3\u662f\u4e00\u4e2a\u6bd4\u8f83\u5408\u9002\u7684\u503c\u3002<\/p>\n<p>\u6709\u4e86\u8fd9\u4e00\u7b97\u6cd5\u7684\u52a0\u6301\uff0c\u73b0\u5728\u9ed1\u5ba2\u60f3\u8981\u66b4\u529b\u7834\u89e3\uff0c\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\u5c31\u4f1a\u5927\u5927\u589e\u52a0\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-bcrypt-\u548c-argon2\">\n\u4f7f\u7528 BCrypt \u548c Argon2\n<a href=\"#%e4%bd%bf%e7%94%a8-bcrypt-%e5%92%8c-argon2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4f46\u53ef\u60dc\u7684\u662f\uff0c\u9053\u9ad8\u4e00\u5c3a\uff0c\u9b54\u9ad8\u4e00\u4e08\u3002PBKDF2 \u7b97\u6cd5\u867d\u7136\u63d0\u9ad8\u4e86\u9ed1\u5ba2\u66b4\u529b\u7834\u89e3\u5bc6\u7801\u7684\u96be\u5ea6\uff0c\u4f46\u662f\u4ecd\u7136\u6709\u4e00\u4e9b\u95ee\u9898\u3002\u6bd4\u5982\uff0c\u9ed1\u5ba2\u53ef\u4ee5\u4f7f\u7528 GPU \u6216 FPGA \u6765\u52a0\u901f\u8ba1\u7b97\uff0c\u4ece\u800c\u63d0\u9ad8\u66b4\u529b\u7834\u89e3\u7684\u901f\u5ea6\u3002\u6240\u4ee5\uff0c\u6211\u4eec\u8fd8\u6709\u66f4\u52a0\u91cd\u91cf\u7ea7\u7684\u9009\u624b\uff1aBCrypt \u53ca Argon2\u3002<\/p>\n<p>\u6211\u4eec\u5148\u6765\u770b BCrypt\u3002\u5728 C# \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <a class=\"link\" href=\"https:\/\/github.com\/BcryptNet\/bcrypt.net\" target=\"_blank\" rel=\"noopener\"\n><code>BCrypt.Net-Next<\/code><\/a> \u5e93\u6765\u5b9e\u73b0 BCrypt \u7b97\u6cd5\u3002\u6211\u4eec\u53ea\u9700\u8981\u7a0d\u52a0\u4fee\u6539\u6211\u4eec\u7684 <code>PasswordHelper<\/code> \u7c7b\u5373\u53ef\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">PasswordHelper<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">HashPassword<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">BCrypt<\/span><span class=\"p\">.<\/span><span class=\"n\">Net<\/span><span class=\"p\">.<\/span><span class=\"n\">BCrypt<\/span><span class=\"p\">.<\/span><span class=\"n\">HashPassword<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"m\">12<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ 12 \u4e3a\u5de5\u4f5c\u56e0\u5b50<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">VerifyPassword<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">passwordHash<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">BCrypt<\/span><span class=\"p\">.<\/span><span class=\"n\">Net<\/span><span class=\"p\">.<\/span><span class=\"n\">BCrypt<\/span><span class=\"p\">.<\/span><span class=\"n\">Verify<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">,<\/span> <span class=\"n\">passwordHash<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5e76\u4e14\u6211\u4eec\u7684 <code>User<\/code> \u7c7b\u4e5f\u53ef\u4ee5\u53bb\u6389 <code>Salt<\/code> \u5c5e\u6027\u4e86\u3002\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462\uff1f\u56e0\u4e3a BCrypt \u7b97\u6cd5\u672c\u8eab\u5c31\u5305\u542b\u4e86\u76d0\u503c\uff0c\u76f8\u5f53\u4e8e\u66ff\u6211\u4eec\u4ee3\u52b3\u4e86\u3002\u8fd9\u6837\uff0c\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u518d\u81ea\u5df1\u751f\u6210\u76d0\u503c\uff0c\u4e5f\u4e0d\u9700\u8981\u4e13\u95e8\u53bb\u5b58\u50a8\u76d0\u503c\u4e86\u3002<\/p>\n<p>\u6211\u4eec\u770b\u4e00\u4e2a BCrypt \u54c8\u5e0c\u540e\u7684\u5bc6\u7801\uff1a<\/p>\n<p><code>$2a$11$lraBT1\/lH3RiFXjQbywREutDElnBFaolPOEsDAvo1sjK2iRjwCAUi<\/code><\/p>\n<p>\u8fd9\u6bb5\u6587\u672c\u4e2d\uff0c<code>$2a$<\/code> \u8868\u793a\u4f7f\u7528\u7684\u662f BCrypt \u7b97\u6cd5\uff0c<code>11<\/code> \u8868\u793a\u5de5\u4f5c\u56e0\u5b50\uff0c\u800c\u540e\u9762\u7684\u5185\u5bb9\u5219\u662f\u7531\u76d0\u503c\u548c\u54c8\u5e0c\u540e\u7684\u5bc6\u7801\u7ec4\u6210\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8fd9\u6bb5\u6587\u672c\u4e2d\u5305\u542b\u4e86\u5168\u90e8\u7528\u6765\u9a8c\u8bc1\u5bc6\u7801\u7684\u4fe1\u606f\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5c06\u5176\u5b58\u50a8\u5728\u6570\u636e\u5e93\u4e2d\u5373\u53ef\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5de5\u4f5c\u56e0\u5b50\u662f\u7528\u6765\u63a7\u5236\u8ba1\u7b97\u7684\u901f\u5ea6\u7684\uff0c\u5b83\u662f $2$ \u7684\u5e42\u8fd0\u7b97\u3002\u6bd4\u5982\uff0c\u4e0a\u9762\u7684\u5bc6\u7801\u5c31\u5bf9\u5e94\u4e86 $2^{11}=2048$ \u6b21\u8ba1\u7b97\u3002\u5de5\u4f5c\u56e0\u5b50\u8d8a\u5927\uff0c\u8ba1\u7b97\u7684\u901f\u5ea6\u5c31\u8d8a\u6162\uff0c\u9ed1\u5ba2\u7834\u89e3\u5bc6\u7801\u7684\u96be\u5ea6\u5c31\u8d8a\u5927\u3002\u901a\u5e38 $10$ \u5230 $12$ \u662f\u4e00\u4e2a\u6bd4\u8f83\u5408\u9002\u7684\u8303\u56f4\u3002<\/div>\n<\/div>\n<p>\u4f46\u9ed1\u5ba2\u4f9d\u65e7\u4e0d\u7518\u5fc3\uff0c\u8fd8\u662f\u6253\u7b97\u501f\u52a9\u5176\u5f3a\u5927\u7684\u786c\u4ef6\u6765\u5c1d\u8bd5\u7834\u89e3\u3002\u8fd9\u6837\uff0c\u6211\u4eec\u5c31\u8981\u8bf7\u51fa\u6211\u4eec\u7684\u6740\u624b\u950f\uff1aArgon2 \u7b97\u6cd5\u4e86\u3002<\/p>\n<p>\u4e0e BCrypt \u4e00\u6837\uff0cArgon2 \u540c\u6837\u6ca1\u6709 .NET \u6807\u51c6\u5e93\u7684\u5b9e\u73b0\u3002\u6211\u4eec\u53ef\u4ee5\u9009\u62e9\u4e00\u4e9b\u7b2c\u4e09\u65b9\u7684\u5e93\uff0c\u6bd4\u5982 <a class=\"link\" href=\"https:\/\/github.com\/kmaragon\/Konscious.Security.Cryptography\" target=\"_blank\" rel=\"noopener\"\n><code>Konscious.Security.Cryptography<\/code><\/a>\u3002<\/p>\n<p>\u8fd9\u91cc\uff0c\u6211\u4eec\u4e0d\u6f14\u793a\u5b9e\u9645\u5728 C# \u4e2d\u8be5\u5982\u4f55\u4f7f\u7528 Argon2 \u7b97\u6cd5\uff0c\u56e0\u4e3a\u5b83\u4e0e BCrypt \u5728\u5f00\u53d1\u4f53\u9a8c\u53ca\u6570\u636e\u6a21\u578b\u548c\u8868\u7684\u8bbe\u8ba1\u4e0a\u662f\u7c7b\u4f3c\u7684\u3002\u4f46\u662f\uff0cArgon2 \u7b97\u6cd5\u5728\u5b89\u5168\u6027\u4e0a\u8981\u6bd4 BCrypt \u66f4\u80dc\u4e00\u7b79\u3002\u5b83\u5f15\u5165\u4e86\u66f4\u591a\u9632\u6b62\u9ed1\u5ba2\u66b4\u529b\u7834\u89e3\u7684\u673a\u5236\uff0c\u6bd4\u5982\u5185\u5b58\u786c\u5316\u3001\u5e76\u884c\u8ba1\u7b97\u7b49\u3002\u5b83\u53ef\u4ee5\u8f7b\u6613\u8c03\u6574\u7834\u89e3\u7684\u65f6\u95f4\u3001\u5185\u5b58\u6210\u672c\u4ee5\u53ca\u5e76\u884c\u5ea6\u3002<\/p>\n<p>\u53e6\u5916\uff0cArgon2 \u8fd8\u63d0\u4f9b\u4e86\u4e09\u79cd\u53d8\u4f53\uff1aArgon2d\u3001Argon2i \u548c Argon2id\u3002\u5176\u4e2d\uff0cArgon2d \u9002\u7528\u4e8e\u5bf9\u6297\u65f6\u95f4\u653b\u51fb\uff0cArgon2i \u9002\u7528\u4e8e\u5bf9\u6297\u4fa7\u4fe1\u9053\u653b\u51fb\uff0c\u800c Argon2id \u5219\u662f\u4e24\u8005\u7684\u7ed3\u5408\u3002\u5177\u4f53\u6765\u8bf4\uff1a<\/p>\n<ul>\n<li>Argon2d \u66f4\u6ce8\u91cd\u9632\u6b62 GPU \u5e76\u884c\u8ba1\u7b97\u7684\u653b\u51fb\u3002<\/li>\n<li>Argon2i \u66f4\u6ce8\u91cd\u6297\u4fa7\u4fe1\u9053\u653b\u51fb\u3002<\/li>\n<li>Argon2id \u662f\u7efc\u5408\u4e86\u8fd9\u4e24\u79cd\u7279\u6027\uff0c\u9002\u5408\u4e00\u822c\u7528\u9014\u3002<\/li>\n<\/ul>\n<p>\u76f8\u4fe1\u6709\u4e86\u8fd9\u4e48\u201c\u53d8\u6001\u201d\u7684\u5bc6\u7801\u54c8\u5e0c\u7b97\u6cd5\uff0c\u81f3\u5c11\u73b0\u9636\u6bb5\u7684\u9ed1\u5ba2\u662f\u5f7b\u5e95\u675f\u624b\u65e0\u7b56\u4e86\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u4ece\u6700\u4e0d\u5b89\u5168\u7684\u660e\u6587\u5b58\u50a8\u5bc6\u7801\u5f00\u59cb\uff0c\u9010\u6b65\u8bb2\u89e3\u4e86\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981\u5bf9\u5bc6\u7801\u8fdb\u884c\u52a0\u76d0\u54c8\u5e0c\u3002\u6211\u4eec\u770b\u5230\u4e86\u660e\u6587\u5b58\u50a8\u5bc6\u7801\u7684\u5371\u9669\u6027\uff0c\u54c8\u5e0c\u540e\u7684\u5bc6\u7801\u53ef\u80fd\u88ab\u5f69\u8679\u8868\u653b\u51fb\u7684\u95ee\u9898\u3002\u4ee5\u53ca\u8001\u65e7\u7684\u54c8\u5e0c\u7b97\u6cd5\u53ef\u80fd\u5b58\u5728\u7684\u88ab\u78b0\u649e\u7684\u95ee\u9898\u3002\u7136\u540e\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86 SHA256 \u52a0\u76d0\u3001PBKDF2\u3001BCrypt \u548c Argon2 \u7b49\u7b97\u6cd5\uff0c\u4ee5\u53ca\u5b83\u4eec\u7684\u4f18\u7f3a\u70b9\u3002<\/p>\n<p>\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u5e94\u5f53\u6839\u636e\u81ea\u5df1\u7684\u9700\u6c42\u548c\u5b89\u5168\u6027\u8981\u6c42\u6765\u9009\u62e9\u9002\u5408\u7684\u5bc6\u7801\u54c8\u5e0c\u7b97\u6cd5\u3002\u5bf9\u4e8e\u4e00\u822c\u7684\u5c0f\u9879\u76ee\u6765\u8bf4\uff0cSHA256 \u52a0\u76d0\u5df2\u7ecf\u8db3\u591f\u5b89\u5168\u4e86\uff0c\u800c\u4e14\u5b83\u5bf9\u4e8e\u5ba2\u6237\u7aef\u53ca\u670d\u52a1\u7aef\u5f00\u9500\u7684\u8981\u6c42\u4e5f\u5f88\u4f4e\u3002\u4f46\u662f\uff0c\u5982\u679c\u6211\u4eec\u5bf9\u5b89\u5168\u6027\u8981\u6c42\u5f88\u9ad8\uff0c\u90a3\u4e48 BCrypt \u6216 Argon2 \u5c31\u662f\u4e0d\u4e8c\u4e4b\u9009\u4e86\u3002<\/p>"},{"title":"\u5982\u4f55\u5728 WPF \u4e2d\u9ad8\u6548\u5e03\u5c40\u591a\u884c\u591a\u5217\u7684\u63a7\u4ef6","link":"https:\/\/blog.coldwind.top\/posts\/grid-of-controls\/","pubDate":"Thu, 26 Dec 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/grid-of-controls\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/12\/26\/kgGyXcYIlnMNpSr.jpg\" alt=\"Featured image of post \u5982\u4f55\u5728 WPF \u4e2d\u9ad8\u6548\u5e03\u5c40\u591a\u884c\u591a\u5217\u7684\u63a7\u4ef6\" \/><p>\u8fd9\u6b21\u6211\u4eec\u6765\u63a2\u8ba8\u4e00\u4e2a WPF \u4e2d\u7684\u7b80\u5355\u800c\u53c8\u4e0d\u7b80\u5355\u7684\u5e03\u5c40\u95ee\u9898\uff1a\u5982\u4f55\u5b9e\u73b0\u4e0b\u56fe\u4e2d\u7684\u6548\u679c\uff1f<\/p>\n<figure><img src=\"https:\/\/s2.loli.net\/2024\/12\/25\/qlpQr1DJ4FBskKe.png\" width=\"400px\">\n<\/figure>\n<p>\u4e3a\u4ec0\u4e48\u8bf4\u8fd9\u4e2a\u95ee\u9898\u7b80\u5355\u800c\u53c8\u4e0d\u7b80\u5355\u5462\uff1f\u662f\u56e0\u4e3a\u5355\u7eaf\u53ea\u662f\u5b9e\u73b0\u8fd9\u4e2a\u6548\u679c\u7684\u8bdd\uff0c\u6211\u4eec\u5b8c\u5168\u53ef\u4ee5\u4f7f\u7528 <code>Grid<\/code> \u63a7\u4ef6\u6765\u5b9e\u73b0\u3002<del>\u751a\u81f3\u5982\u679c\u5b8c\u5168\u4e0d\u5728\u4e4e\u4f18\u96c5\u7684\u8bdd\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u7528 <code>Canvas<\/code> \u6765\u5b9e\u73b0<\/del>\uff08\u5f53\u7136\u8fd9\u51e0\u4e4e\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u90fd\u662f\u4e0d\u63a8\u8350\u7684\uff09\u3002\u4f46\u662f\uff0c\u5b9e\u9645\u8fd9\u6837\u5e72\u8fc7\u7684\u5f00\u53d1\u8005\u76f8\u4fe1\u90fd\u5f88\u6e05\u695a\uff0c\u4f7f\u7528 <code>Grid<\/code> \u7684\u5b9e\u73b0\u65b9\u5f0f\u51e0\u4e4e\u53ef\u4ee5\u8bf4\u662f\u6beb\u65e0\u7075\u6d3b\u6027\u7684\u3002\u5f88\u5feb\u5c31\u4f1a\u88ab\u540e\u7eed\u7684\u754c\u9762\u5fae\u8c03\u7684\u9700\u6c42\u6574\u5f97\u7126\u5934\u70c2\u989d\u3002<\/p>\n<p>\u90a3\u4e48\u6211\u4eec\u4eca\u5929\u5c31\u6765\u770b\u4e00\u770b\uff0c\u8fd9\u6837\u7684\u9700\u6c42\u901a\u5e38\u6709\u54ea\u4e9b\u505a\u6cd5\u5427\u3002\u5e0c\u671b\u8fd9\u7bc7\u6587\u7ae0\u4e2d\u63d0\u5230\u7684\u67d0\u4e9b\u65b9\u5f0f\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\u3002<\/p>\n<h2 id=\"\u6700\u4f20\u7edf\u7684\u65b9\u5f0fgrid\">\n\u6700\u4f20\u7edf\u7684\u65b9\u5f0f\uff1aGrid\n<a href=\"#%e6%9c%80%e4%bc%a0%e7%bb%9f%e7%9a%84%e6%96%b9%e5%bc%8fgrid\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u4ecb\u7ecd\u540e\u9762\u7684\u66f4\u597d\u7684\u65b9\u5f0f\u4e4b\u524d\uff0c\u6211\u4eec\u6709\u5fc5\u8981\u5148\u6765\u770b\u4e00\u770b\u6700\u4f20\u7edf\u7684\u65b9\u5f0f\uff1a\u4f7f\u7528 <code>Grid<\/code> \u63a7\u4ef6\u3002\u8fd9\u6837\u624d\u80fd\u66f4\u597d\u5730\u5206\u6790\u8fd9\u79cd\u65b9\u5f0f\u7684\u5c40\u9650\u6027\uff0c\u4ee5\u53ca\u601d\u8003\u6539\u8fdb\u7684\u65b9\u5411\u3002<\/p>\n<p>\u8fd9\u6837\u7684\u65b9\u5f0f\u76f8\u4fe1\u6240\u6709\u5177\u5907\u57fa\u672c WPF \u57fa\u7840\u7684\u5f00\u53d1\u8005\u90fd\u76f8\u5f53\u719f\u6089\uff1a<\/p>\n<ol>\n<li>\u5728 XAML \u4e2d\u5b9a\u4e49\u4e00\u4e2a <code>Grid<\/code> \u63a7\u4ef6<\/li>\n<li>\u5728 <code>Grid<\/code> \u4e2d\u5b9a\u4e49\u591a\u4e2a <code>RowDefinition<\/code> \u548c <code>ColumnDefinition<\/code><\/li>\n<li>\u5728 <code>Grid<\/code> \u4e2d\u5b9a\u4e49\u591a\u4e2a\u63a7\u4ef6\uff0c\u5e76\u901a\u8fc7 <code>Grid.Row<\/code> \u548c <code>Grid.Column<\/code> \u6765\u6307\u5b9a\u63a7\u4ef6\u7684\u4f4d\u7f6e<\/li>\n<li>\uff08\u53ef\u9009\uff09\u901a\u8fc7 <code>Grid.RowSpan<\/code> \u548c <code>Grid.ColumnSpan<\/code> \u6765\u6307\u5b9a\u63a7\u4ef6\u7684\u8de8\u884c\u548c\u8de8\u5217<\/li>\n<\/ol>\n<p>\u597d\uff0c\u7136\u540e\u6211\u4eec\u5c31\u5f00\u59cb\u5199 XAML \u5427\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Grid&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Grid.RowDefinitions&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;RowDefinition<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;Auto&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;RowDefinition<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;Auto&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;RowDefinition<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;Auto&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;RowDefinition<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;Auto&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Grid.RowDefinitions&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Grid.ColumnDefinitions&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ColumnDefinition<\/span> <span class=\"na\">Width=<\/span><span class=\"s\">&#34;Auto&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ColumnDefinition<\/span> <span class=\"na\">Width=<\/span><span class=\"s\">&#34;Auto&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Grid.ColumnDefinitions&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Grid.Row=<\/span><span class=\"s\">&#34;0&#34;<\/span> <span class=\"na\">Grid.Column=<\/span><span class=\"s\">&#34;0&#34;<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"na\">Grid.Row=<\/span><span class=\"s\">&#34;0&#34;<\/span> <span class=\"na\">Grid.Column=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Grid.Row=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"na\">Grid.Column=<\/span><span class=\"s\">&#34;0&#34;<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"na\">Grid.Row=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"na\">Grid.Column=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- ... --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u597d\u7684\uff0c\u9a6c\u4e0a\u75db\u82e6\u9762\u5177\u5c31\u6234\u4e0a\u4e86\uff1a\u4e3a\u6bcf\u4e2a\u63a7\u4ef6\u5199 <code>Grid.Row<\/code> \u548c <code>Grid.Column<\/code>\uff0c\u7b80\u76f4\u5c31\u662f\u9876\u7ea7\u6298\u78e8\u3002\u5982\u679c\u4f60\u641e\u4e86\u5341\u51e0\u884c\uff0c\u7ed3\u679c\u88ab\u544a\u77e5\u9700\u8981\u5220\u6389\u524d\u9762\u67d0\u4e00\u884c\uff0c\u6216\u8005\u5728\u524d\u9762\u6dfb\u52a0\u4e00\u884c\uff0c\u90a3\u5c31\u66f4\u662f\u6b32\u54ed\u65e0\u6cea\u4e86\u3002<\/p>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u53ef\u80fd\u4f1a\u6709\u806a\u660e\u7684\u540c\u5b66\u60f3\u5230\u4e00\u4e9b\u7b80\u5316\u8fd9\u4e00\u6b65\u9aa4\u7684\u65b9\u5f0f\uff0c\u6bd4\u5982\u4f7f\u7528 <code>Style<\/code> \u6765\u7edf\u4e00\u6307\u5b9a\u4e0a\u9762\u7684 <code>TextBox<\/code> \u63a7\u4ef6\u7684 <code>Grid.Column<\/code>\uff0c\u5e76\u7701\u7565 <code>Label<\/code> \u7684 <code>Grid.Column=&quot;0&quot;<\/code>\u3002\u4f46\u8fd9\u6837\u4f9d\u65e7\u5b58\u5728\u76f8\u5f53\u591a\u7684\u5c40\u9650\u6027\uff0c\u6bd5\u7adf\u5b83\u6700\u6015\u7684\u5c31\u662f\u4f8b\u5916\u60c5\u51b5\u4e86\u3002<\/div>\n<\/div>\n<p>\u6240\u4ee5\uff0c\u6211\u4eec\u663e\u7136\u662f\u4e0d\u80fd\u6ee1\u8db3\u4e8e\u4f7f\u7528\u8fd9\u6837\u7684\u65b9\u5f0f\u7684\u3002\u90a3\u7a76\u7adf\u6709\u4ec0\u4e48\u66f4\u597d\u7684\u65b9\u5f0f\u5462\uff1f<\/p>\n<h2 id=\"\u5916\u5c42\u4f7f\u7528-uniformgrid\">\n\u5916\u5c42\u4f7f\u7528 UniformGrid\n<a href=\"#%e5%a4%96%e5%b1%82%e4%bd%bf%e7%94%a8-uniformgrid\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8bf4\u8d77\u201c\u81ea\u52a8\u5316\u5e03\u5c40\u201d\uff0c\u76f8\u4fe1\u5f88\u591a\u4eba\u5728\u4f7f\u7528 <code>Grid<\/code> \u65f6\u90fd\u5782\u6d8e\u8fc7 <code>UniformGrid<\/code> \u7684\u529f\u80fd\uff0c\u56e0\u4e3a\u5b83\u53ef\u4ee5\u8ba9\u6240\u6709\u5b50\u63a7\u4ef6\u4f9d\u6b21\u586b\u5145\u5230\u6bcf\u4e2a\u5355\u5143\u683c\u4e2d\u3002\u6240\u4ee5\uff0c\u6211\u4eec\u6216\u8bb8\u53ef\u4ee5\u501f\u52a9\u5b83\u7684\u8fd9\u4e00\u6548\u679c\u3002\u6bd4\u5982\u6211\u4eec\u60f3\u8981\u4e00\u4e2a\u4e24\u5217\u7684\u7f51\u683c\uff0c\u53ef\u4ee5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;UniformGrid<\/span> <span class=\"na\">Columns=<\/span><span class=\"s\">&#34;2&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- ... --&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u8fd9\u6837\u7684\u5c40\u9650\u6027\u5728\u4e8e\uff0c\u6240\u6709\u5b50\u63a7\u4ef6\u7684\u5927\u5c0f\uff08\u6216\u8005\u5b83\u4eec\u6240\u5904\u7684\u5355\u5143\u683c\uff09\u90fd\u662f\u5b8c\u5168\u7b49\u5927\u7684\u3002\u8fd9\u53ef\u80fd\u4f1a\u5931\u53bb\u7075\u6d3b\u6027\uff0c\u5e76\u4e14\u770b\u8d77\u6765\u6709\u4e9b\u5446\u677f\u3002\u90a3\u4e48\u6211\u4eec\u8fd8\u53ef\u4ee5\u90e8\u5206\u501f\u52a9 <code>UniformGrid<\/code> \u7684\u529f\u80fd\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;UniformGrid<\/span> <span class=\"na\">Columns=<\/span><span class=\"s\">&#34;1&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;UniformGrid.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Style<\/span> <span class=\"na\">TargetType=<\/span><span class=\"s\">&#34;StackPanel&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Setter<\/span> <span class=\"na\">Property=<\/span><span class=\"s\">&#34;Orientation&#34;<\/span> <span class=\"na\">Value=<\/span><span class=\"s\">&#34;Horizontal&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Style&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Style<\/span> <span class=\"na\">TargetType=<\/span><span class=\"s\">&#34;Label&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Setter<\/span> <span class=\"na\">Property=<\/span><span class=\"s\">&#34;Width&#34;<\/span> <span class=\"na\">Value=<\/span><span class=\"s\">&#34;50&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Style&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/UniformGrid.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- ... --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/UniformGrid&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u6211\u4eec\u5c06\u6bcf\u4e00\u884c\u7684\u5185\u5bb9\u653e\u5728\u4e86\u4e00\u4e2a <code>StackPanel<\/code> \u4e2d\uff0c\u4ece\u800c\u8ba9 <code>Label<\/code> \u548c <code>TextBox<\/code> \u51fa\u73b0\u5728\u540c\u4e00\u884c\uff08\u6216\u8005\u8bf4 <code>UniformGrid<\/code> \u7684\u540c\u4e00\u4e2a\u5355\u5143\u683c\u4e2d\uff09\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u518d\u4e3a\u6bcf\u4e2a\u63a7\u4ef6\u6307\u5b9a <code>Grid.Row<\/code> \u548c <code>Grid.Column<\/code> \u4e86\u3002<\/p>\n<p>\u4e3a\u4e86\u66f4\u52a0\u7b80\u5316\u4ee3\u7801\uff0c\u6211\u4eec\u8fd8\u58f0\u660e\u4e86\u4e24\u4e2a <code>Style<\/code>\uff0c\u5206\u522b\u7528\u4e8e\u8bbe\u7f6e <code>StackPanel<\/code> \u7684 <code>Orientation<\/code> \u548c <code>Label<\/code> \u7684 <code>Width<\/code>\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 <code>StackPanel<\/code> \u4e2d\u76f4\u63a5\u653e\u7f6e <code>Label<\/code> \u548c <code>TextBox<\/code>\uff0c\u800c\u4e0d\u9700\u8981\u518d\u4e3a <code>Label<\/code> \u8bbe\u7f6e\u5bbd\u5ea6\u4e86\u3002<\/p>\n<p>\u4f46\u662f\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u660e\u663e\u7684\u5c40\u9650\u6027\uff1a\u884c\u9ad8\u662f\u4e00\u81f4\u7684\u3002\u5982\u679c\u6211\u4eec\u9700\u8981\u4e0d\u540c\u884c\u7684\u9ad8\u5ea6\u4e0d\u4e00\u81f4\uff0c\u90a3\u4e48\u8fd9\u79cd\u65b9\u5f0f\u5c31\u65e0\u6cd5\u6ee1\u8db3\u9700\u6c42\u4e86\u3002<\/p>\n<h2 id=\"\u5916\u5c42\u4f7f\u7528-stackpanel\">\n\u5916\u5c42\u4f7f\u7528 StackPanel\n<a href=\"#%e5%a4%96%e5%b1%82%e4%bd%bf%e7%94%a8-stackpanel\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e3a\u4e86\u7a81\u7834\u4e0a\u4e00\u4e2a\u65b9\u5f0f\u7684\u5c40\u9650\u6027\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u4f7f\u7528 <code>StackPanel<\/code> \u6765\u66ff\u4ee3 <code>UniformGrid<\/code>\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u4e3a\u6bcf\u4e00\u884c\u7684 <code>StackPanel<\/code> \u8bbe\u7f6e\u4e0d\u540c\u7684\u9ad8\u5ea6\u4e86\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel<\/span> <span class=\"na\">Orientation=<\/span><span class=\"s\">&#34;Vertical&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;StackPanel.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- Styles --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/StackPanel.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;StackPanel<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;40&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;StackPanel<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;50&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- ... --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u5f88\u5feb\uff0c\u6211\u4eec\u53c8\u4f1a\u88ab\u522b\u7684\u95ee\u9898\u6240\u6298\u78e8\uff1a\u5982\u4f55\u9ad8\u6548\u5730\u8bbe\u7f6e\u884c\u95f4\u8ddd\uff1f<\/p>\n<p>\u800c\u4e14\u53ef\u80fd\u8fd8\u6709\u53e6\u5916\u4e00\u4e2a\u5c0f\u6298\u78e8\uff1a\u56e0\u4e3a\u5185\u5916\u90fd\u4f7f\u7528\u4e86 <code>StackPanel<\/code>\uff0c\u6240\u4ee5\u5199\u7684 <code>Style<\/code> \u53ef\u80fd\u4f1a\u88ab\u5b83\u4eec\u5171\u540c\u4f7f\u7528\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u9488\u5bf9\u8fd9\u4e00\u95ee\u9898\uff0c\u53ef\u80fd\u6709\u540c\u5b66\u4f1a\u5c06\u5185\u90e8\u7684 <code>StackPanel<\/code> \u66ff\u6362\u4e3a <code>WrapPanel<\/code>\uff0c\u4f46\u8fd9\u6837\u5e76\u4e0d\u662f\u4e00\u4e2a\u597d\u4e3b\u610f\uff0c\u56e0\u4e3a <code>WrapPanel<\/code> \u4f1a\u8ba9\u6bcf\u4e00\u884c\u7684\u63a7\u4ef6\u90fd\u5c3d\u53ef\u80fd\u5730\u9760\u5de6\u5bf9\u9f50\uff0c\u5e76\u4e14\u5728\u5bbd\u5ea6\u4e0d\u591f\u65f6\u4f1a\u81ea\u52a8\u6362\u884c\uff01\u6216\u8bb8\u73b0\u5728\u770b\u7740\u8fd8\u597d\uff0c\u4f46\u8c03\u6574\u4e86\u7a97\u53e3\u6216\u7236\u63a7\u4ef6\u7684\u5c3a\u5bf8\uff0c\u751a\u81f3\u4fee\u6539\u4e86\u5206\u8fa8\u7387\u53ca\u7f29\u653e\u540e\uff0c\u90fd\u6709\u53ef\u80fd\u8ba9\u4f60\u7684\u754c\u9762\u53d8\u5f97\u4e00\u56e2\u7cdf\u3002<\/div>\n<\/div>\n<p>\u6b64\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u8bf7\u4e2a\u201c\u5916\u63f4\u201d\u3002\u5176\u5b9e\u5728 Win UI 3\u3001Avalonia UI \u7b49\u6846\u67b6\u4e2d\uff0c<code>StackPanel<\/code> \u5929\u751f\u5c31\u6bd4 WPF \u591a\u4e86\u4e00\u4e2a\u5c5e\u6027\uff1a<code>Spacing<\/code>\u3002\u8fd9\u4e2a\u5c5e\u6027\u53ef\u4ee5\u8ba9\u6211\u4eec\u5f88\u65b9\u4fbf\u5730\u8bbe\u7f6e\u884c\u95f4\u8ddd\u3002\u4f46\u662f\u5728 WPF \u4e2d\uff0c\u6211\u4eec\u5c31\u6ca1\u6709\u8fd9\u4e48\u5e78\u8fd0\u4e86\u3002\u4e0d\u8fc7\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u81ea\u5b9a\u4e49\u63a7\u4ef6\u6765\u5b9e\u73b0\u8fd9\u4e00\u529f\u80fd\u3002<\/p>\n<p>\u4ee3\u7801\u4e5f\u4e0d\u7528\u6211\u4eec\u81ea\u5df1\u5199\uff0c\u7f51\u4e0a\u53ef\u4ee5\u627e\u5230\u4e00\u4e9b\u5f00\u6e90\u5b9e\u73b0\u3002\u6bd4\u5982\u8fd9\u91cc\u6211\u8d34\u4e24\u4e2a\u4f9b\u5927\u5bb6\u53c2\u8003\uff1a<\/p>\n<ul>\n<li><a class=\"link\" href=\"https:\/\/github.com\/Kinnara\/ModernWpf\/blob\/master\/ModernWpf\/Controls\/SimpleStackPanel.cs\" target=\"_blank\" rel=\"noopener\"\n>Kinnara\/ModernWpf - SimpleStackPanel<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/github.com\/OrgEleCho\/EleCho.WpfSuite\/blob\/master\/EleCho.WpfSuite.Layouts\/Layouts\/StackPanel.cs\" target=\"_blank\" rel=\"noopener\"\n>OrgEleCho\/WpfSuite - StackPanel<\/a><\/li>\n<\/ul>\n<p>\u5047\u5982\u6211\u4eec\u642c\u8fd0\u5230\u4e86 <code>local<\/code> \u547d\u540d\u7a7a\u95f4\u4e0b\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u53ef\u4ee5\u8fd9\u6837\u4f7f\u7528\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;local:StackPanel<\/span> <span class=\"na\">Spacing=<\/span><span class=\"s\">&#34;10&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;local:StackPanel.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Style<\/span> <span class=\"na\">TargetType=<\/span><span class=\"s\">&#34;StackPanel&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Setter<\/span> <span class=\"na\">Property=<\/span><span class=\"s\">&#34;Orientation&#34;<\/span> <span class=\"na\">Value=<\/span><span class=\"s\">&#34;Horizontal&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Style&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/local:StackPanel.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- ... --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/local:StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u770b\u8d77\u6765\u5c31\u65b9\u4fbf\u591a\u4e86\u3002\u6b64\u5916\uff0c\u6211\u4eec\u8fd8\u6709\u4e00\u4e9b\u5c0f\u6280\u5de7\uff0c\u6765\u8fdb\u4e00\u6b65\u63d0\u9ad8\u5e03\u5c40\u7684\u6548\u7387\uff1a<\/p>\n<ol>\n<li>\u4e3a <code>Label<\/code> \u8bbe\u7f6e\u4e00\u4e2a\u56fa\u5b9a\u7684\u5bbd\u5ea6\uff0c\u8fd9\u6837\u53ef\u4ee5\u8ba9\u6240\u6709\u7684 <code>Label<\/code> \u5bf9\u9f50<\/li>\n<li>\u4e3a <code>Label<\/code> \u8bbe\u7f6e <code>VerticalAlignment<\/code> \u6216 <code>VerticalContentAlignment<\/code> \u4e3a <code>Center<\/code>\uff0c\u8fd9\u6837\u53ef\u4ee5\u8ba9 <code>Label<\/code> \u548c <code>TextBox<\/code> \u5782\u76f4\u5c45\u4e2d\u5bf9\u9f50<\/li>\n<li>\u4e3a <code>TextBox<\/code> \u7b49\u63a7\u4ef6\uff08\u8fd8\u6bd4\u5982 <code>CheckBox<\/code>\u3001<code>ComboBox<\/code> \u7b49\uff09\u8bbe\u7f6e\u56fa\u5b9a\u7684\u5bbd\u5ea6\uff0c\u8fd9\u6837\u53ef\u4ee5\u8ba9\u6240\u6709\u7684 <code>TextBox<\/code> \u5bf9\u9f50<\/li>\n<\/ol>\n<h2 id=\"\u4f7f\u7528\u66f4\u9ad8\u7ea7\u7684-grid\">\n\u4f7f\u7528\u66f4\u9ad8\u7ea7\u7684 Grid\n<a href=\"#%e4%bd%bf%e7%94%a8%e6%9b%b4%e9%ab%98%e7%ba%a7%e7%9a%84-grid\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e0a\u9762\u7684\u65b9\u5f0f\u5176\u5b9e\u5df2\u7ecf\u76f8\u5f53\u7075\u6d3b\u4e86\uff0c\u5c24\u5176\u662f\u5bf9\u4e8e\u53ef\u80fd\u9700\u8981\u589e\u5220\u3001\u8c03\u6362\u987a\u5e8f\u4e4b\u7c7b\u7684\u60c5\u5f62\u3002\u4f46\u662f\u53ef\u80fd\u4ecd\u7136\u4f1a\u89c9\u5f97\u4e0d\u591f\u723d\uff0c\u56e0\u4e3a\u91cc\u9762\u591a\u51fa\u4e86\u4e00\u5c42 <code>StackPanel<\/code>\uff0c\u8fd9\u5199\u8d77\u6765\u5c31\u8fd8\u662f\u4f1a\u89c9\u5f97\u4e0d\u592a\u723d\u3002<\/p>\n<p>\u6240\u4ee5\uff0c\u6709\u6ca1\u6709\u529e\u6cd5\u8ba9 <code>Grid<\/code> \u66f4\u52a0\u667a\u80fd\u4e00\u70b9\uff0c\u6bd4\u5982\u53ef\u4ee5\u50cf\u662f <code>WrapPanel<\/code> \u6216\u8005 <code>UniformGrid<\/code> \u90a3\u6837\uff0c\u81ea\u52a8\u586b\u5145\u63a7\u4ef6\u5462\uff1f<\/p>\n<p>\u7b54\u6848\u5f53\u7136\u662f\u6709\u7684\u3002\u8fd9\u91cc\u7ed9\u5927\u5bb6\u63a8\u8350\u4e00\u4e2a NuGet \u5305\uff1a<code>WpfAutoGrid<\/code>\u3002\u8fd9\u4e2a <code>AutoGrid<\/code> \u5c31\u6b63\u662f\u6211\u4eec\u68a6\u5bd0\u4ee5\u6c42\u7684\u63a7\u4ef6\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">NuGet \u4e0a\u6709\u597d\u591a\u4e2a\u53eb\u8fd9\u4e2a\u540d\u5b57\u7684\u5305\u3002\u8fd9\u91cc\u6211\u8d34\u4e00\u4e2a\u81ea\u5df1\u8bd5\u8fc7\u7684\uff1a<a class=\"link\" href=\"https:\/\/github.com\/budul100\/WpfAutoGrid.Core\" target=\"_blank\" rel=\"noopener\"\n><code>WpfAutoGrid.Core<\/code><\/a><\/div>\n<\/div>\n<p>\u5b83\u7684\u4f7f\u7528\u4e5f\u975e\u5e38\u7b80\u5355\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;local:AutoGrid<\/span> <span class=\"na\">Columns=<\/span><span class=\"s\">&#34;100,150&#34;<\/span> <span class=\"na\">RowCount=<\/span><span class=\"s\">&#34;8&#34;<\/span> <span class=\"na\">RowHeight=<\/span><span class=\"s\">&#34;30&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- ... --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/local:AutoGrid&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u8fde\u5185\u90e8\u7684 <code>StackPanel<\/code> \u90fd\u4e0d\u9700\u8981\u4e86\uff0c\u76f4\u63a5\u5c06 <code>Label<\/code> \u548c <code>TextBox<\/code> \u653e\u5728 <code>AutoGrid<\/code> \u4e2d\u5373\u53ef\u3002\u6b64\u5916\uff0c\u5b83\u63d0\u4f9b\u4e86\u5f88\u591a\u5b9e\u7528\u7684\u5c5e\u6027\uff0c\u6bd4\u5982\u4e0a\u9762\u5b9e\u7528\u7684 <code>Columns<\/code>\u3001<code>RowCount<\/code>\u3001<code>RowHeight<\/code>\uff0c\u8fd8\u6709 <code>ColumnSpacing<\/code>\u3001<code>RowSpacing<\/code> \u7b49\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c<code>AutoGrid<\/code> \u8fd8\u80fd\u6b63\u786e\u54cd\u5e94\u5b50\u63a7\u4ef6 <code>ColumnSpan<\/code> \u7b49\u5c5e\u6027\uff0c\u53ef\u4ee5\u8ba9\u6211\u4eec\u66f4\u52a0\u7075\u6d3b\u5730\u5e03\u5c40\u63a7\u4ef6\u3002<\/p>\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u8fd9\u91cc\u6211\u518d\u8d34\u4e00\u4e2a\u6211\u81ea\u5df1\u5199\u7684 <code>GridAssist<\/code>\u3002\u5b83\u662f\u4e00\u4e2a\u9644\u52a0\u5c5e\u6027\uff0c\u53ef\u4ee5\u76f4\u63a5\u7528\u4e8e\u539f\u751f\u7684 <code>Grid<\/code> \u63a7\u4ef6\u3002\u4f7f\u7528\u8fd9\u4e2a\u9644\u52a0\u5c5e\u6027\uff0c\u5c31\u80fd\u591f\u81ea\u52a8\u4e3a\u5b50\u63a7\u4ef6\u6dfb\u52a0 <code>Grid.Row<\/code> \u548c <code>Grid.Column<\/code> \u5c5e\u6027\u3002<\/p>\n<p><a class=\"link\" href=\"https:\/\/gist.github.com\/BYJRK\/66aefb80c838634e0642ffed4f58e076\" target=\"_blank\" rel=\"noopener\"\n>BYJRK\/GridAssist<\/a><\/p>\n<p>\u4f7f\u7528\u65b9\u5f0f\u4e5f\u975e\u5e38\u7b80\u5355\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Grid<\/span> <span class=\"na\">local:GridAssist.AutoRowColumn=<\/span><span class=\"s\">&#34;_,2&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Label<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- ... --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u9644\u52a0\u5c5e\u6027\u7684 <code>AutoRowColumn<\/code> \u586b\u5199\u7684 <code>_,2<\/code> \u610f\u601d\u662f\uff0c\u884c\u6570\u81ea\u52a8\u589e\u52a0\uff0c\u5217\u6570\u56fa\u5b9a\u4e3a 2\uff08\u8fd8\u53ef\u4ee5\u5199 <code>_,2,Auto<\/code>\uff0c\u4ece\u800c\u5c06\u5217\u5bbd\u8bbe\u7f6e\u4e3a <code>Auto<\/code>\uff09\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u4e3a\u6bcf\u4e2a\u63a7\u4ef6\u6307\u5b9a <code>Grid.Row<\/code> \u548c <code>Grid.Column<\/code> \u4e86\u3002\u7136\u540e\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5c06\u5b50\u63a7\u4ef6\u6309\u7167\u4ece\u4e0a\u5230\u4e0b\uff0c\u4ece\u5de6\u5230\u53f3\u7684\u987a\u5e8f\u653e\u7f6e\u5373\u53ef\uff0c\u4e0d\u9700\u8981\u518d\u5f15\u5165\u4e00\u5c42 <code>StackPanel<\/code> \u4e86\u3002\u6b64\u5916\uff0c\u5b83\u4e5f\u662f\u53ef\u4ee5\u6b63\u786e\u54cd\u5e94 <code>Grid.ColumnSpan<\/code> \u7684\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 WPF \u4e2d\uff0c\u5e03\u5c40\u662f\u4e00\u4e2a\u975e\u5e38\u91cd\u8981\u7684\u95ee\u9898\u3002\u800c\u5bf9\u4e8e\u591a\u884c\u591a\u5217\u7684\u63a7\u4ef6\u5e03\u5c40\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>Grid<\/code>\u3001<code>UniformGrid<\/code>\u3001<code>StackPanel<\/code>\u3001<code>AutoGrid<\/code> \u7b49\u63a7\u4ef6\u6216\u8005\u9644\u52a0\u5c5e\u6027\u6765\u5b9e\u73b0\u3002\u6bcf\u4e00\u79cd\u65b9\u5f0f\u90fd\u6709\u5b83\u7684\u4f18\u52bf\u548c\u5c40\u9650\u6027\uff0c\u6211\u4eec\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u6765\u9009\u62e9\u6700\u9002\u5408\u7684\u65b9\u5f0f\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u5bf9\u4e8e\u4e0a\u9762\u63d0\u5230\u7684\u51e0\u79cd\u81ea\u5b9a\u4e49\u63a7\u4ef6\u6216\u9644\u52a0\u5c5e\u6027\uff0c\u6211\u4eec\u5b8c\u5168\u53ef\u4ee5\u76f4\u63a5\u5c06\u4ee3\u7801\u590d\u5236\u5230\u81ea\u5df1\u7684\u9879\u76ee\u4e2d\uff0c\u7136\u540e\u6839\u636e\u5b9e\u9645\u9700\u6c42\u8fdb\u884c\u4fee\u6539\u3002\u8fd9\u6837\u53ef\u4ee5\u66f4\u597d\u5730\u9002\u5e94\u81ea\u5df1\u7684\u9879\u76ee\uff0c\u4e5f\u53ef\u4ee5\u66f4\u597d\u5730\u7406\u89e3\u8fd9\u4e9b\u63a7\u4ef6\u6216\u5c5e\u6027\u7684\u5b9e\u73b0\u539f\u7406\uff0c\u8fd8\u53ef\u4ee5\u7701\u53bb\u5f15\u5165\u7b2c\u4e09\u65b9\u5e93\u7684\u9ebb\u70e6\u3002<\/p>"},{"title":"WPF \u503c\u8f6c\u6362\u5668\uff08ValueConverter\uff09\u7684\u4e00\u4e9b\u5b9e\u7528\u6280\u5de7","link":"https:\/\/blog.coldwind.top\/posts\/valueconverter-tips-and-tricks\/","pubDate":"Wed, 18 Dec 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/valueconverter-tips-and-tricks\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/12\/18\/dRbx2KJsHOmaPG7.webp\" alt=\"Featured image of post WPF \u503c\u8f6c\u6362\u5668\uff08ValueConverter\uff09\u7684\u4e00\u4e9b\u5b9e\u7528\u6280\u5de7\" \/><p>\u672c\u7bc7\u6587\u7ae0\u5bf9\u5e94\u7684\u6559\u5b66\u89c6\u9891\u94fe\u63a5\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1ThkHYnEgi\" target=\"_blank\" rel=\"noopener\"\n>WPF\u4e2d\u503c\u8f6c\u6362\u5668\uff08ValueConverter\uff09\u7684\u4e00\u4e9b\u5b9e\u7528\u6280\u5de7<\/a><\/p>\n<p>\u5728 WPF \u4e2d\uff0c\u503c\u8f6c\u6362\u5668\uff08<code>ValueConverter<\/code>\uff09\u662f\u4e00\u4e2a\u975e\u5e38\u91cd\u8981\u7684\u6982\u5ff5\u3002\u5b83\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5728\u7ed1\u5b9a\u6570\u636e\u65f6\uff0c\u5c06\u6570\u636e\u8f6c\u6362\u6210\u6211\u4eec\u9700\u8981\u7684\u683c\u5f0f\u3002\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u503c\u8f6c\u6362\u5668\u7684\u5b9e\u7528\u6280\u5de7\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-wpf-\u5185\u7f6e\u7684\u503c\u8f6c\u6362\u5668\">\n\u4f7f\u7528 WPF \u5185\u7f6e\u7684\u503c\u8f6c\u6362\u5668\n<a href=\"#%e4%bd%bf%e7%94%a8-wpf-%e5%86%85%e7%bd%ae%e7%9a%84%e5%80%bc%e8%bd%ac%e6%8d%a2%e5%99%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>WPF \u5185\u7f6e\u4e86\u51e0\u4e2a\u5e38\u7528\u7684\u503c\u8f6c\u6362\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>BooleanToVisibilityConverter<\/code> \u5c06\u5e03\u5c14\u503c\u8f6c\u6362\u6210 <code>Visibility<\/code> \u679a\u4e3e\u503c\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;BooleanToVisibilityConverter<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;BooleanToVisibilityConverter&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;CheckBox<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;checkBox&#34;<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Show Text&#34;<\/span> <span class=\"na\">IsChecked=<\/span><span class=\"s\">&#34;True&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span> <span class=\"na\">Visibility=<\/span><span class=\"s\">&#34;{Binding ElementName=checkBox, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u9057\u61be\u7684\u662f\uff0cWPF \u5185\u7f6e\u7684\u503c\u8f6c\u6362\u5668\u5e76\u4e0d\u662f\u5f88\u591a\uff0c\u57fa\u672c\u4e0a\u6211\u4eec\u80fd\u76f4\u63a5\u7528\u4e0a\u7684\u5c31\u662f\u4e0a\u9762\u63d0\u5230\u7684\u8fd9\u4e2a <code>BooleanToVisibilityConverter<\/code>\u3002\u5176\u4ed6\u867d\u7136\u6709\u4e00\u4e9b\u7167\u7406\u8bf4\u7528\u5f97\u4e0a\u7684\u503c\u8f6c\u6362\u5668\uff0c\u4f46\u5b83\u4eec\u5f88\u591a\u90fd\u662f <code>internal<\/code> \u7684\uff0c\u6211\u4eec\u65e0\u6cd5\u76f4\u63a5\u4f7f\u7528\u3002\u5373\u4fbf\u5982\u6b64\uff0c\u901a\u8fc7\u9605\u8bfb\u5b83\u4eec\u7684\u6e90\u4ee3\u7801\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5b66\u4e60\u4e00\u4e0b\u5b83\u4eec\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li><a class=\"link\" href=\"https:\/\/source.dot.net\/#Microsoft.VisualStudio.LanguageServices\/Utilities\/EnumBoolConverter.cs\" target=\"_blank\" rel=\"noopener\"\n><code>EnumBoolConverter<\/code><\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/source.dot.net\/#Microsoft.VisualStudio.LanguageServices\/Utilities\/BooleanReverseConverter.cs\" target=\"_blank\" rel=\"noopener\"\n><code>BooleanReverseConverter<\/code><\/a><\/li>\n<\/ul>\n<h2 id=\"\u5c06\u503c\u8f6c\u6362\u5668\u58f0\u660e\u4e3a\u5355\u4f8b\">\n\u5c06\u503c\u8f6c\u6362\u5668\u58f0\u660e\u4e3a\u5355\u4f8b\n<a href=\"#%e5%b0%86%e5%80%bc%e8%bd%ac%e6%8d%a2%e5%99%a8%e5%a3%b0%e6%98%8e%e4%b8%ba%e5%8d%95%e4%be%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4f7f\u7528\u503c\u8f6c\u6362\u5668\u6709\u4e9b\u662f\u5426\u4f1a\u8ba9\u4eba\u89c9\u5f97\u7e41\u7410\uff0c\u56e0\u4e3a\u901a\u5e38\u8fd9\u610f\u5473\u7740\u6211\u4eec\u9700\u8981\u5728\u67d0\u4e2a\u63a7\u4ef6\u7684 <code>Resources<\/code> \u4e2d\u58f0\u660e\u4e00\u4e2a\u503c\u8f6c\u6362\u5668\uff0c\u5e76\u5728\u9700\u8981\u7684\u5730\u65b9\u901a\u8fc7 <code>StaticResource<\/code> \u6765\u5f15\u7528\u5b83\u3002\u4f46\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u503c\u8f6c\u6362\u5668\u58f0\u660e\u4e3a\u5355\u4f8b\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728\u4efb\u4f55\u5730\u65b9\u76f4\u63a5\u4f7f\u7528\u5b83\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">BooleanToVisibilityConverter<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IValueConverter<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5355\u4f8b\u6a21\u5f0f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">BooleanToVisibilityConverter<\/span> <span class=\"n\">Instance<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">ConvertBack<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 XAML \u4e2d\u501f\u52a9 <code>x:Static<\/code> \u6765\u76f4\u63a5\u4f7f\u7528\u8fd9\u4e2a\u5355\u4f8b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;CheckBox<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;checkBox&#34;<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Show Text&#34;<\/span> <span class=\"na\">IsChecked=<\/span><span class=\"s\">&#34;True&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span> <span class=\"na\">Visibility=<\/span><span class=\"s\">&#34;{Binding ElementName=checkBox, Path=IsChecked, Converter={x:Static local:BooleanToVisibilityConverter.Instance}}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice warning\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"><\/i>Warning\n<\/div>\n<div class=\"notice-content\">\u8fd9\u6837\u786e\u5b9e\u53ef\u4ee5\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u7b80\u5316\u6211\u4eec\u7684\u4ee3\u7801\uff0c\u4f46\u4e5f\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u505a\u53ef\u80fd\u4f1a\u5bfc\u81f4\u503c\u8f6c\u6362\u5668\u7684\u72b6\u6001\u88ab\u5171\u4eab\uff0c\u4ece\u800c\u5f15\u53d1\u4e00\u4e9b\u95ee\u9898\u3002\u6240\u4ee5\u5728\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u65f6\uff0c\u4e00\u5b9a\u8981\u786e\u4fdd\u503c\u8f6c\u6362\u5668\u662f\u65e0\u72b6\u6001\u7684\u3002<\/div>\n<\/div>\n<h2 id=\"\u5c06\u503c\u8f6c\u6362\u5668\u58f0\u660e\u5728-appxaml-\u4e2d\">\n\u5c06\u503c\u8f6c\u6362\u5668\u58f0\u660e\u5728 App.xaml \u4e2d\n<a href=\"#%e5%b0%86%e5%80%bc%e8%bd%ac%e6%8d%a2%e5%99%a8%e5%a3%b0%e6%98%8e%e5%9c%a8-appxaml-%e4%b8%ad\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5982\u679c\u6211\u4eec\u6709\u4e00\u4e9b\u76f8\u5f53<strong>\u901a\u7528\u4e14\u65e0\u72b6\u6001<\/strong>\u7684\u503c\u8f6c\u6362\u5668\uff0c\u5c31\u6bd4\u5982 <code>BooleanToVisibilityConverter<\/code>\u3001<code>BoolReverseConverter<\/code>\u3001<code>NotNullConverter<\/code> \u7b49\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b83\u4eec\u58f0\u660e\u5728 <code>App.xaml<\/code> \u4e2d\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f\u4e2d\u76f4\u63a5\u4f7f\u7528\u8fd9\u4e9b\u503c\u8f6c\u6362\u5668\uff0c\u800c\u4e0d\u9700\u8981\u5728\u6bcf\u4e2a\u7528\u5230\u5b83\u4eec\u7684 <code>Window<\/code>\u3001<code>UserControl<\/code> \u7b49\u5730\u65b9\u90fd\u8fdb\u884c\u58f0\u660e\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Application<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Application.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;BooleanToVisibilityConverter<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;BooleanToVisibilityConverter&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;BoolReverseConverter<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;BoolReverseConverter&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;NotNullConverter<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;NotNullConverter&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Application.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Application&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u89c9\u5f97\u8fd9\u6837\u7684\u65b9\u5f0f\u4f1a\u201c\u6c61\u67d3\u201d<code>App.xaml<\/code>\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u65b0\u5efa\u4e00\u4e2a <code>ResourceDictionary<\/code>\uff0c\u5e76\u5c06\u8fd9\u4e9b\u503c\u8f6c\u6362\u5668\u58f0\u660e\u5728\u8fd9\u4e2a <code>ResourceDictionary<\/code> \u4e2d\uff0c\u7136\u540e\u5728 <code>App.xaml<\/code> \u4e2d\u5f15\u7528\u8fd9\u4e2a <code>ResourceDictionary<\/code>\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u65b0\u5efa\u4e00\u4e2a <code>CommonConverters.xaml<\/code>\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ResourceDictionary<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;BooleanToVisibilityConverter<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;BooleanToVisibilityConverter&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;BoolReverseConverter<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;BoolReverseConverter&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;NotNullConverter<\/span> <span class=\"na\">x:Key=<\/span><span class=\"s\">&#34;NotNullConverter&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/ResourceDictionary&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u5728 <code>App.xaml<\/code> \u4e2d\u5f15\u7528\u8fd9\u4e2a <code>ResourceDictionary<\/code>\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Application<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Application.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ResourceDictionary&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ResourceDictionary.MergedDictionaries&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ResourceDictionary<\/span> <span class=\"na\">Source=<\/span><span class=\"s\">&#34;CommonConverters.xaml&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ResourceDictionary.MergedDictionaries&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ResourceDictionary&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Application.Resources&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Application&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u4f7f\u7528-markupextension-\u7b80\u5316\u503c\u8f6c\u6362\u5668\u7684\u4f7f\u7528\">\n\u4f7f\u7528 <code>MarkupExtension<\/code> \u7b80\u5316\u503c\u8f6c\u6362\u5668\u7684\u4f7f\u7528\n<a href=\"#%e4%bd%bf%e7%94%a8-markupextension-%e7%ae%80%e5%8c%96%e5%80%bc%e8%bd%ac%e6%8d%a2%e5%99%a8%e7%9a%84%e4%bd%bf%e7%94%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>Markup<\/code> \u8bed\u6cd5\u4e5f\u5c31\u662f\u6211\u4eec\u7ecf\u5e38\u5728 XAML \u4e2d\u770b\u5230\u7684\u201c\u82b1\u62ec\u53f7\u201d\u8bed\u6cd5\uff0c\u4f8b\u5982\uff1a<\/p>\n<ul>\n<li><code>{Binding ...}<\/code><\/li>\n<li><code>{StaticResource ...}<\/code><\/li>\n<li><code>{x:Static ...}<\/code><\/li>\n<\/ul>\n<p>\u53ea\u8981\u6211\u4eec\u8ba9\u503c\u8f6c\u6362\u5668\u7ee7\u627f <code>MarkupExtension<\/code>\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 XAML \u4e2d\u76f4\u63a5\u4f7f\u7528 <code>Markup<\/code> \u8bed\u6cd5\u6765\u5f15\u7528\u8fd9\u4e2a\u503c\u8f6c\u6362\u5668\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">BooleanToVisibilityConverter<\/span> <span class=\"p\">:<\/span> <span class=\"n\">MarkupExtension<\/span><span class=\"p\">,<\/span> <span class=\"n\">IValueConverter<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">IsReversed<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">UseHidden<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"k\">is<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">b<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">b<\/span> <span class=\"p\">=<\/span> <span class=\"n\">IsReversed<\/span> <span class=\"p\">?<\/span> <span class=\"p\">!<\/span><span class=\"n\">b<\/span> <span class=\"p\">:<\/span> <span class=\"n\">b<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">b<\/span> <span class=\"p\">?<\/span> <span class=\"n\">Visibility<\/span><span class=\"p\">.<\/span><span class=\"n\">Visible<\/span> <span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"n\">UseHidden<\/span> <span class=\"p\">?<\/span> <span class=\"n\">Visibility<\/span><span class=\"p\">.<\/span><span class=\"n\">Hidden<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Visibility<\/span><span class=\"p\">.<\/span><span class=\"n\">Collapsed<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">ConvertBack<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"k\">is<\/span> <span class=\"n\">Visibility<\/span> <span class=\"n\">visibility<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">visibility<\/span> <span class=\"p\">==<\/span> <span class=\"n\">Visibility<\/span><span class=\"p\">.<\/span><span class=\"n\">Visible<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">override<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">ProvideValue<\/span><span class=\"p\">(<\/span><span class=\"n\">IServiceProvider<\/span> <span class=\"n\">serviceProvider<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0a\u9762\u662f\u4e00\u4e2a\u201c\u9ad8\u7ea7\u7248\u201d\u7684 <code>BooleanToVisibilityConverter<\/code>\uff0c\u5b83\u652f\u6301 <code>IsReversed<\/code> \u548c <code>UseHidden<\/code> \u4e24\u4e2a\u5c5e\u6027\uff0c\u4e5f\u5c31\u4e3a\u8fd9\u4e00\u503c\u8f6c\u6362\u5668\u63d0\u4f9b\u4e86\u5b9a\u5236\u6027\u3002\u6211\u4eec\u53ef\u4ee5\u5728 XAML \u4e2d\u8fd9\u6837\u4f7f\u7528\u5b83\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;CheckBox<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;checkBox&#34;<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Show Text&#34;<\/span> <span class=\"na\">IsChecked=<\/span><span class=\"s\">&#34;True&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span> <span class=\"na\">Visibility=<\/span><span class=\"s\">&#34;{Binding ElementName=checkBox, Path=IsChecked, Converter={local:BooleanToVisibilityConverter IsReversed=True, UseHidden=True}}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e00\u6280\u5de7\u5c24\u5176\u9002\u7528\u4e8e\u67d0\u4e2a\u5b9a\u5236\u529f\u80fd\u5f3a\u5927\uff0c\u4e14\u4f7f\u7528\u9891\u7387\u8f83\u9ad8\u7684\u503c\u8f6c\u6362\u5668\u3002\u4f46\u4e5f\u8981\u6ce8\u610f\uff0c\u8fd9\u6837\u58f0\u660e\u5c31\u4f1a\u5bfc\u81f4\u503c\u8f6c\u6362\u5668\u6bcf\u6b21\u90fd\u4f1a\u5b9e\u4f8b\u5316\u4e00\u4e2a\u65b0\u7684\u51fa\u6765\u3002\u5982\u679c\u4e00\u4e2a\u503c\u8f6c\u6362\u5668\u662f\u65e0\u72b6\u6001\u7684\uff0c\u90a3\u4e48\u6211\u4eec\u6700\u597d\u5c06\u5176\u58f0\u660e\u4e3a\u5355\u4f8b\uff0c\u6216\u8005\u5c06\u5176\u58f0\u660e\u5728 <code>App.xaml<\/code> \u4e2d\uff0c\u4ece\u800c\u907f\u514d\u91cd\u590d\u5b9e\u4f8b\u5316\u3002<\/p>\n<p>\u5982\u679c\u8fd8\u89c9\u5f97\u4e0d\u8fc7\u763e\uff0c\u6211\u4eec\u53ef\u4ee5\u4e3a\u503c\u8f6c\u6362\u5668\u5199\u4e00\u4e2a\u62bd\u8c61\u57fa\u7c7b\uff0c\u4ece\u800c\u8fdb\u4e00\u6b65\u7b80\u5316\u503c\u8f6c\u6362\u5668\u7684\u5b9e\u73b0\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">BaseValueConverter<\/span> <span class=\"p\">:<\/span> <span class=\"n\">MarkupExtension<\/span><span class=\"p\">,<\/span> <span class=\"n\">IValueConverter<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">override<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">ProvideValue<\/span><span class=\"p\">(<\/span><span class=\"n\">IServiceProvider<\/span> <span class=\"n\">serviceProvider<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">virtual<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">ConvertBack<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Binding<\/span><span class=\"p\">.<\/span><span class=\"n\">DoNothing<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53e6\u5916\u8fd8\u6709\u4e00\u79cd\u7248\u672c\uff0c\u5c31\u662f\u5e0c\u671b\u57fa\u7c7b\u8fd8\u987a\u4fbf\u63d0\u4f9b\u5355\u4f8b\u6a21\u5f0f\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">BaseValueConverter<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">:<\/span> <span class=\"n\">MarkupExtension<\/span><span class=\"p\">,<\/span> <span class=\"n\">IValueConverter<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">where<\/span> <span class=\"n\">T<\/span> <span class=\"p\">:<\/span> <span class=\"n\">class<\/span><span class=\"p\">,<\/span> <span class=\"k\">new<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">T<\/span> <span class=\"n\">Instance<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u4e86\u3002\u6bd4\u5982\u8bf4\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u4e00\u4e2a\u5355\u5411\u7684\u503c\u8f6c\u6362\u5668\uff0c\u5c06\u5b57\u7b26\u4e32\u8f6c\u6362\u6210\u5927\u5199\uff0c\u53ef\u4ee5\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">StringToUpperConverter<\/span> <span class=\"p\">:<\/span> <span class=\"n\">BaseValueConverter<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">StringToUpperConverter<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">override<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"k\">is<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">s<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">s<\/span><span class=\"p\">.<\/span><span class=\"n\">ToUpper<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Binding<\/span><span class=\"p\">.<\/span><span class=\"n\">DoNothing<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u662f\u4e0d\u662f\u77ac\u95f4\u53d8\u5f97\u7b80\u5355\u4e86\u5f88\u591a\u5462\uff1f<\/p>\n<h2 id=\"\u8fd4\u56de-donothing-\u4e0e-unsetvalue\">\n\u8fd4\u56de DoNothing \u4e0e UnsetValue\n<a href=\"#%e8%bf%94%e5%9b%9e-donothing-%e4%b8%8e-unsetvalue\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 WPF \u4e2d\uff0c\u6709\u4e24\u4e2a\u7279\u6b8a\u7684\u8fd4\u56de\u7c7b\u578b\uff0c\u5206\u522b\u662f <code>Binding.DoNothing<\/code> \u548c <code>DependencyProperty.UnsetValue<\/code>\u3002\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u8ba9\u503c\u8f6c\u6362\u5668\u7684\u65b9\u6cd5\u8fd4\u56de\u8fd9\u4e24\u4e2a\u503c\u662f\u975e\u5e38\u6709\u7528\u7684\u3002<\/p>\n<p>\u8fd9\u4e24\u4e2a\u90fd\u8868\u793a\u201c\u4e0d\u505a\u4efb\u4f55\u4e8b\u60c5\u201d\uff0c\u4f46\u5b83\u4eec\u7684\u4f7f\u7528\u573a\u666f\u662f\u4e0d\u540c\u7684\u3002\u5177\u4f53\u6765\u8bf4\uff0c<code>Binding.DoNothing<\/code> \u5355\u7eaf\u610f\u5473\u7740\u201c\u4e0d\u505a\u4efb\u4f55\u4e8b\u60c5\u201d\uff0c\u4e0d\u53bb\u901a\u77e5\u4efb\u4f55\u7ed1\u5b9a\u6e90\u6216\u76ee\u6807\uff0c\u4e5f\u4e0d\u4f1a\u66f4\u65b0\u754c\u9762\uff1b\u800c <code>DependencyProperty.UnsetValue<\/code> \u5219\u6697\u793a\u7ed1\u5b9a\u662f\u5931\u8d25\u7684\uff0c\u6216\u8005\u503c\u662f\u65e0\u6548\u7684\u3002\u6b64\u65f6\uff0c\u5b83\u4f1a\u89e6\u53d1 <code>Binding<\/code> \u7684 <code>FallbackValue<\/code>\uff0c\u4e5f\u5c31\u662f\u4fd7\u79f0\u7684\u201c\u7f3a\u7701\u503c\u201d\u3002<\/p>\n<p>\u6bd4\u5982\u6211\u4eec\u6709\u4e00\u4e2a\u53ef\u4ee5\u8ba9\u7528\u6237\u8f93\u5165\u6587\u4ef6\u8def\u5f84\u7684\u6587\u672c\u6846\uff0c\u5e76\u4e14\u6211\u4eec\u4f1a\u8ba9\u53e6\u4e00\u4e2a <code>TextBlock<\/code> \u5c55\u793a\u8fd9\u4e2a\u6587\u4ef6\u7684\u540d\u79f0\u3002\u4f46\u662f\u5982\u679c\u7528\u6237\u8f93\u5165\u7684\u8def\u5f84\u662f\u65e0\u6548\u7684\uff0c\u6211\u4eec\u5c31\u4e0d\u5e0c\u671b\u5c55\u793a\u8fd9\u4e2a\u6587\u4ef6\u7684\u540d\u79f0\uff0c\u800c\u662f\u5c55\u793a\u4e00\u4e2a\u7f3a\u7701\u503c\uff0c\u8fd9\u65f6\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528 <code>DependencyProperty.UnsetValue<\/code>\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">FilePathToFileNameConverter<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IValueConverter<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"k\">is<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">path<\/span> <span class=\"p\">&amp;&amp;<\/span><span class=\"n\">n<\/span> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">Exists<\/span><span class=\"p\">(<\/span><span class=\"n\">path<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">GetFileName<\/span><span class=\"p\">(<\/span><span class=\"n\">path<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">DependencyProperty<\/span><span class=\"p\">.<\/span><span class=\"n\">UnsetValue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u5728 XAML \u4e2d\u8fd9\u6837\u4f7f\u7528\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;textBox&#34;<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;C:\\Users\\Public\\Documents\\file.txt&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{Binding ElementName=textBox, Path=Text, Converter={local:FilePathToFileNameConverter}, FallbackValue=&#39;Invalid File Path&#39;}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\uff0c\u5f53\u7528\u6237\u8f93\u5165\u7684\u6587\u4ef6\u8def\u5f84\u65e0\u6548\u65f6\uff0c<code>TextBlock<\/code> \u5c31\u4f1a\u5c55\u793a\u201cInvalid File Path\u201d\u3002<\/p>\n<p>\u7c7b\u4f3c\u5730\uff0c\u5982\u679c\u6211\u4eec\u5e0c\u671b\u7528\u6237\u5728\u8f93\u5165\u65e0\u6548\u7684\u6587\u4ef6\u8def\u5f84\u65f6\uff0c\u4e0d\u505a\u4efb\u4f55\u4e8b\u60c5\uff08\u6bd4\u5982\u4fdd\u7559\u4e0a\u6b21\u6709\u6548\u7684\u6587\u4ef6\u540d\u57ce\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u8fd4\u56de <code>Binding.DoNothing<\/code>\u3002\u7136\u540e\u5c31\u53ef\u4ee5\u5b9e\u73b0\u76f8\u5e94\u7684\u6548\u679c\u4e86\u3002<\/p>\n<p>\u8fd9\u4e24\u4e2a\u7279\u6b8a\u7684\u8fd4\u56de\u503c\u770b\u4f3c\u4e0d\u8d77\u773c\uff0c\u4f46\u662f\u5982\u679c\u4e0a\u8ff0\u529f\u80fd\u8ba9\u6211\u4eec\u5728 ViewModel \u4e2d\u53bb\u5b9e\u73b0\uff0c\u5c31\u4f1a\u53d8\u5f97\u975e\u5e38\u7e41\u7410\u3002\u6240\u4ee5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u503c\u8f6c\u6362\u5668\u5c31\u663e\u5f97\u975e\u5e38\u6709\u7528\u4e86\u3002<\/p>\n<h2 id=\"\u501f\u52a9-cultureinfo-\u5b9e\u73b0\u591a\u8bed\u8a00\u652f\u6301\">\n\u501f\u52a9 CultureInfo \u5b9e\u73b0\u591a\u8bed\u8a00\u652f\u6301\n<a href=\"#%e5%80%9f%e5%8a%a9-cultureinfo-%e5%ae%9e%e7%8e%b0%e5%a4%9a%e8%af%ad%e8%a8%80%e6%94%af%e6%8c%81\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u503c\u8f6c\u6362\u5668\u4e2d\u7684\u4e24\u4e2a\u65b9\u6cd5\u90fd\u6709\u4e00\u4e2a <code>CultureInfo<\/code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u8fd9\u4e2a\u53c2\u6570\u6765\u5b9e\u73b0\u591a\u8bed\u8a00\u652f\u6301\u3002\u6bd4\u5982\u6211\u4eec\u6709\u4e00\u4e2a\u503c\u8f6c\u6362\u5668\uff0c\u5c06\u6570\u5b57\u8f6c\u6362\u6210\u5404\u56fd\u8bed\u8a00\u7684\u6570\u5b57\u3002\u6b64\u65f6\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u503c\u8f6c\u6362\u5668\u4e2d\u6839\u636e <code>CultureInfo<\/code> \u6240\u5305\u542b\u7684\u5730\u533a\u7801\u6765\u9009\u62e9\u5408\u9002\u7684\u8bed\u8a00\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">NumberToLocalizedNumberConverter<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IValueConverter<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"k\">is<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">number<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">switch<\/span> <span class=\"p\">(<\/span><span class=\"n\">culture<\/span><span class=\"p\">.<\/span><span class=\"n\">TwoLetterISOLanguageName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">case<\/span> <span class=\"s\">&#34;zh&#34;<\/span><span class=\"p\">:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">number<\/span> <span class=\"k\">switch<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">0<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;\u96f6&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">1<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;\u4e00&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">2<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;\u4e8c&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">3<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;\u4e09&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">4<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;\u56db&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">5<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;\u4e94&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">case<\/span> <span class=\"s\">&#34;en&#34;<\/span><span class=\"p\">:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">number<\/span> <span class=\"k\">switch<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">0<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;Zero&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">1<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;One&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">2<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;Two&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">3<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;Three&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">4<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;Four&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">5<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"s\">&#34;Five&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">default<\/span><span class=\"p\">:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">number<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Binding<\/span><span class=\"p\">.<\/span><span class=\"n\">DoNothing<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u5728 XAML \u4e2d\u8fd9\u6837\u4f7f\u7528\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{Binding Number, Converter={local:NumberToLocalizedNumberConverter}, ConverterCulture=zh-CN}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6216\u8005\u6211\u4eec\u4e5f\u53ef\u4ee5\u5728\u7a0b\u5e8f\u4e2d\u52a8\u6001\u5730\u8bbe\u7f6e <code>CultureInfo<\/code>\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">culture<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">CultureInfo<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;zh-CN&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">CurrentThread<\/span><span class=\"p\">.<\/span><span class=\"n\">CurrentCulture<\/span> <span class=\"p\">=<\/span> <span class=\"n\">culture<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">CurrentThread<\/span><span class=\"p\">.<\/span><span class=\"n\">CurrentUICulture<\/span> <span class=\"p\">=<\/span> <span class=\"n\">culture<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u662f\u8fd9\u6837\u8fd8\u4e0d\u591f\uff0c\u56e0\u4e3a\u503c\u8f6c\u6362\u5668\u7684\u8fd9\u4e00\u5165\u53c2\u662f\u4ece\u63a7\u4ef6\u7684 <code>Language<\/code> \u5c5e\u6027\u4e2d\u7ee7\u627f\u800c\u6765\u7684\u3002\u6240\u4ee5\u6211\u4eec\u8fd8\u9700\u8981\u4fee\u6539\u5168\u5c40\u7684 <code>Language<\/code> \u5c5e\u6027\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u60f3\u5728\u4e00\u4e2a <code>UserControl<\/code> \u4e2d\u4f7f\u7528\u4e2d\u6587\uff0c\u53ef\u4ee5\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;UserControl<\/span> <span class=\"na\">Language=<\/span><span class=\"s\">&#34;zh-CN&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- \u4e5f\u53ef\u4ee5\u8fd9\u6837\u5199 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;UserControl.Language&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;XmlLanguage&gt;<\/span>zh-CN<span class=\"nt\">&lt;\/XmlLanguage&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/UserControl.Language&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/UserControl&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6216\u8005\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u7528 <code>OverrideMetadata<\/code> \u7684\u65b9\u5f0f\u6765\u4fee\u6539\u5168\u5c40\u7684 <code>Language<\/code> \u5c5e\u6027\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">FrameworkElement<\/span><span class=\"p\">.<\/span><span class=\"n\">LanguageProperty<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">OverrideMetadata<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">FrameworkElement<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">FrameworkPropertyMetadata<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">XmlLanguage<\/span><span class=\"p\">.<\/span><span class=\"n\">GetLanguage<\/span><span class=\"p\">(<\/span><span class=\"n\">CultureInfo<\/span><span class=\"p\">.<\/span><span class=\"n\">CurrentCulture<\/span><span class=\"p\">.<\/span><span class=\"n\">IetfLanguageTag<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u5c31\u53ef\u4ee5\u8ba9\u503c\u8f6c\u6362\u5668\u83b7\u53d6\u5230\u5f53\u524d\u7684 <code>CultureInfo<\/code>\uff0c\u4ece\u800c\u5b9e\u73b0\u591a\u8bed\u8a00\u652f\u6301\u3002<\/p>\n<h2 id=\"\u4eff\u7167-avalonia-ui-\u5b9e\u73b0\u4e00\u4e2a-funcvalueconverter\">\n\u4eff\u7167 Avalonia UI \u5b9e\u73b0\u4e00\u4e2a FuncValueConverter\n<a href=\"#%e4%bb%bf%e7%85%a7-avalonia-ui-%e5%ae%9e%e7%8e%b0%e4%b8%80%e4%b8%aa-funcvalueconverter\" class=\"anchor\">&para;<\/a>\n<\/h2><p>Avalonia UI \u4e2d\u6709\u4e00\u4e2a\u6709\u8da3\u7684 <code>FuncValueConverter<\/code>\uff0c\u5b83\u5141\u8bb8\u6211\u4eec\u76f4\u63a5\u5728\u4ee3\u7801\u540e\u53f0\u7b80\u5355\u5730\u58f0\u660e\u4e00\u4e2a\u503c\u8f6c\u6362\u5668\uff0c\u800c\u4e0d\u9700\u8981\u989d\u5916\u5199\u4e00\u4e2a\u7c7b\u3002\u5b83\u5730\u6e90\u4ee3\u7801\u53ef\u4ee5\u5728 <a class=\"link\" href=\"https:\/\/github.com\/AvaloniaUI\/Avalonia\/blob\/38e839997d2c204548e6fad396c178780a010cb1\/src\/Avalonia.Base\/Data\/Converters\/FuncValueConverter.cs\" target=\"_blank\" rel=\"noopener\"\n>GitHub<\/a> \u4e0a\u770b\u5230\u3002\u6211\u4eec\u53ef\u4ee5\u4eff\u7167\u8fd9\u4e2a\u5b9e\u73b0\u4e00\u4e2a\u7c7b\u4f3c\u7684\u503c\u8f6c\u6362\u5668\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">sealed<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">FuncValueConverter<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TIn<\/span><span class=\"p\">,<\/span> <span class=\"n\">TOut<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IValueConverter<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Func<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TIn<\/span><span class=\"p\">,<\/span> <span class=\"n\">TOut<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_convert<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">FuncValueConverter<\/span><span class=\"p\">(<\/span><span class=\"n\">Func<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TIn<\/span><span class=\"p\">,<\/span> <span class=\"n\">TOut<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">convert<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_convert<\/span> <span class=\"p\">=<\/span> <span class=\"n\">convert<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"k\">is<\/span> <span class=\"n\">TIn<\/span> <span class=\"n\">t<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">_convert<\/span><span class=\"p\">(<\/span><span class=\"n\">t<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Binding<\/span><span class=\"p\">.<\/span><span class=\"n\">DoNothing<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">ConvertBack<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Binding<\/span><span class=\"p\">.<\/span><span class=\"n\">DoNothing<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5bf9\u4e8e <code>Convert<\/code> \u65b9\u6cd5\u7684\u5b9e\u73b0\uff0c\u8fd9\u91cc\u8fd8\u6709\u4e00\u79cd\u66f4\u597d\u7684\u65b9\u5f0f\u3002\u6211\u4eec\u90fd\u77e5\u9053\uff0c\u5728 XAML \u4e66\u5199\u7684\u5f88\u591a\u8d44\u6e90\uff0cWPF \u90fd\u4f1a\u5728\u5e95\u5c42\u5e2e\u6211\u4eec\u8fdb\u884c\u5408\u9002\u7684\u7c7b\u578b\u8f6c\u6362\u3002\u6bd4\u5982\u6211\u4eec\u5c06 <code>&quot;1&quot;<\/code> \u5b57\u7b26\u4e32\u8d4b\u503c\u7ed9\u4e00\u4e2a <code>int<\/code> \u7c7b\u578b\u7684\u5c5e\u6027\uff0cWPF \u4f1a\u81ea\u52a8\u5c06\u5176\u8f6c\u6362\u6210 <code>1<\/code>\uff1b\u6211\u4eec\u5c06 <code>&quot;Visible&quot;<\/code> \u5b57\u7b26\u4e32\u8d4b\u503c\u7ed9\u4e00\u4e2a <code>Visibility<\/code> \u679a\u4e3e\u7c7b\u578b\u7684\u5c5e\u6027\uff0cWPF \u4e5f\u4f1a\u8fdb\u884c\u76f8\u5e94\u7684\u8f6c\u6362\u3002\u5982\u679c\u6211\u4eec\u4e0d\u63d0\u4f9b\u8fd9\u4e2a\u529f\u80fd\uff0c\u90a3\u4e48\u6211\u4eec\u5199\u7684\u8fd9\u4e2a <code>FuncValueConverter<\/code> \u5c31\u4f1a\u53d8\u5f97\u4e0d\u591f\u7075\u6d3b\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9 .NET \u539f\u751f\u7684 <code>TypeDescriptor<\/code> \u7c7b\u6765\u5b9e\u73b0\u8fd9\u4e2a\u529f\u80fd\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">Convert<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">Type<\/span> <span class=\"n\">targetType<\/span><span class=\"p\">,<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">parameter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CultureInfo<\/span> <span class=\"n\">culture<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"k\">is<\/span> <span class=\"n\">not<\/span> <span class=\"n\">TIn<\/span> <span class=\"n\">t<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"k\">is<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"k\">default<\/span><span class=\"p\">(<\/span><span class=\"n\">TOut<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">TypeDescriptor<\/span><span class=\"p\">.<\/span><span class=\"n\">GetConverter<\/span><span class=\"p\">(<\/span><span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">TIn<\/span><span class=\"p\">)).<\/span><span class=\"n\">CanConvertFrom<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span><span class=\"p\">.<\/span><span class=\"n\">GetType<\/span><span class=\"p\">()))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">t<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">TIn<\/span><span class=\"p\">)<\/span><span class=\"n\">TypeDescriptor<\/span><span class=\"p\">.<\/span><span class=\"n\">GetConverter<\/span><span class=\"p\">(<\/span><span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">TIn<\/span><span class=\"p\">)).<\/span><span class=\"n\">ConvertFrom<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">else<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Binding<\/span><span class=\"p\">.<\/span><span class=\"n\">DoNothing<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">_convert<\/span><span class=\"p\">(<\/span><span class=\"n\">t<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u58f0\u660e\u5e76\u4f7f\u7528\u4e86\u3002\u6211\u4eec\u9700\u8981\u5c06\u5b83\u58f0\u660e\u4e3a\u9759\u6001\u5c5e\u6027\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span> <span class=\"p\">:<\/span> <span class=\"n\">ViewModelBase<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">FuncValueConverter<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">StringToIntConverter<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">Parse<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 XAML \u4e2d\u8fd9\u6837\u4f7f\u7528\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;textBox&#34;<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;123&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{Binding ElementName=textBox, Path=Text, Converter={x:Static local:MainViewModel.StringToIntConverter}}&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\uff0c\u6211\u4eec\u5c31\u80fd\u591f\u8f7b\u6613\u5730\u5728\u4ee3\u7801\u540e\u53f0\u58f0\u660e\u4e00\u4e2a\u503c\u8f6c\u6362\u5668\u4e86\u3002<\/p>\n<h2 id=\"\u5176\u4ed6\u7b2c\u4e09\u65b9\u5e93\">\n\u5176\u4ed6\u7b2c\u4e09\u65b9\u5e93\n<a href=\"#%e5%85%b6%e4%bb%96%e7%ac%ac%e4%b8%89%e6%96%b9%e5%ba%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9664\u4e86\u4e0a\u9762\u63d0\u5230\u7684\u8fd9\u4e9b\u65b9\u6cd5\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e9b\u7b2c\u4e09\u65b9\u5e93\u6765\u7b80\u5316\u503c\u8f6c\u6362\u5668\u53ca\u7ed1\u5b9a\u7684\u4f7f\u7528\u3002\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li><a class=\"link\" href=\"https:\/\/github.com\/thomasgalliker\/ValueConverters.NET\" target=\"_blank\" rel=\"noopener\"\n>ValueConverters.NET<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/github.com\/Alex141\/CalcBinding\" target=\"_blank\" rel=\"noopener\"\n>CalcBinding<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/github.com\/levitali\/CompiledBindings\" target=\"_blank\" rel=\"noopener\"\n>CompiledBindings<\/a><\/li>\n<\/ul>\n<p>\u8fd9\u4e9b\u5e93\u6709\u7684\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u5185\u7f6e\u503c\u8f6c\u6362\u5668\uff0c\u5305\u62ec\u7ec4\u5408\u591a\u79cd\u503c\u8f6c\u6362\u5668\u7684\u529f\u80fd\uff08\u4f8b\u5982\u5148\u5c06\u5b57\u7b26\u4e32\u6839\u636e <code>IsNullOrEmpty<\/code> \u8f6c\u4e3a <code>bool<\/code> \u7c7b\u578b\uff0c\u518d\u8f6c\u4e3a <code>Visibility<\/code> \u7c7b\u578b\uff09\uff0c\u6709\u7684\u63d0\u4f9b\u4e86\u66f4\u52a0\u5f3a\u5927\u7684\u7ed1\u5b9a\u529f\u80fd\uff0c\u4f8b\u5982\u53ef\u4ee5\u8c03\u7528\u51fd\u6570\uff0c\u8fdb\u884c\u6570\u5b66\u8fd0\u7b97\u7b49\u7b49\u3002\u5927\u5bb6\u6709\u5174\u8da3\u7684\u8bdd\u53ef\u4ee5\u53bb\u4e86\u89e3\u4e00\u4e0b\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u503c\u8f6c\u6362\u5668\u662f WPF \u4e2d\u975e\u5e38\u91cd\u8981\u7684\u4e00\u4e2a\u6982\u5ff5\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5c06\u6570\u636e\u8f6c\u6362\u6210\u6211\u4eec\u9700\u8981\u7684\u683c\u5f0f\u3002\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86\u4e00\u4e9b\u503c\u8f6c\u6362\u5668\u7684\u5b9e\u7528\u6280\u5de7\u3002\u5e0c\u671b\u8fd9\u4e9b\u6280\u5de7\u80fd\u591f\u5e2e\u52a9\u5927\u5bb6\u66f4\u597d\u5730\u4f7f\u7528\u503c\u8f6c\u6362\u5668\u3002<\/p>\n<p>\u53ea\u6709\u5145\u5206\u53d1\u6325 WPF \u4e2d\u5404\u4e2a\u529f\u80fd\u7684\u4f18\u52bf\uff0c\u6211\u4eec\u624d\u80fd\u66f4\u597d\u5730\u63d0\u9ad8\u6211\u4eec\u7684\u5f00\u53d1\u6548\u7387\uff0c\u5b9e\u73b0\u66f4\u52a0\u590d\u6742\u7684\u529f\u80fd\u3002\u5e0c\u671b\u5927\u5bb6\u80fd\u591f\u5728\u5b9e\u9645\u7684\u5f00\u53d1\u4e2d\u591a\u591a\u5c1d\u8bd5\uff0c\u591a\u591a\u5b9e\u8df5\u3002<\/p>"},{"title":"\u5982\u4f55\u5728 C# \u4e2d\u62f7\u8d1d\u4e00\u4e2a\u6587\u4ef6\u5939","link":"https:\/\/blog.coldwind.top\/posts\/how-to-copy-folder\/","pubDate":"Wed, 11 Dec 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/how-to-copy-folder\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/12\/11\/9swekVbJFzX3DfH.jpg\" alt=\"Featured image of post \u5982\u4f55\u5728 C# \u4e2d\u62f7\u8d1d\u4e00\u4e2a\u6587\u4ef6\u5939\" \/><p>\u62f7\u8d1d\u6587\u4ef6\u5939\u542c\u8d77\u6765\u662f\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684\u4efb\u52a1\uff0c\u4f46\u662f\u5728 C# \u4e2d\u5b9e\u73b0\u8d77\u6765\u5374\u5e76\u4e0d\u662f\u90a3\u4e48\u5bb9\u6613\uff0c\u56e0\u4e3a .NET \u5e76\u6ca1\u6709\u63d0\u4f9b\u5185\u7f6e\u7684\u65b9\u6cd5\uff0c\u6240\u4ee5\u901a\u5e38\u6211\u4eec\u53ea\u80fd\u81ea\u5df1\u6765\u5b9e\u73b0\u3002<\/p>\n<p>\u672c\u6587\u63d0\u4f9b\u4e86\u4e09\u79cd\u62f7\u8d1d\u6587\u4ef6\u5939\u7684\u65b9\u5f0f\u4f9b\u5927\u5bb6\u53c2\u8003\u3002<\/p>\n<h2 id=\"\u65b9\u6cd5\u4e00\u4f7f\u7528\u9012\u5f52\">\n\u65b9\u6cd5\u4e00\uff1a\u4f7f\u7528\u9012\u5f52\n<a href=\"#%e6%96%b9%e6%b3%95%e4%b8%80%e4%bd%bf%e7%94%a8%e9%80%92%e5%bd%92\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4f7f\u7528\u9012\u5f52\u662f\u4e00\u4e2a\u975e\u5e38\u76f4\u89c2\u7684\u65b9\u6cd5\uff0c\u540c\u65f6\u4e5f\u662f <a class=\"link\" href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/how-to-copy-directories\" target=\"_blank\" rel=\"noopener\"\n>Microsoft Learn<\/a> \u7ed9\u51fa\u7684\u793a\u4f8b\u3002\u5176\u539f\u7248\u7684\u4ee3\u7801\u6709\u4e9b\u5197\u4f59\u548c\u4e0d\u5fc5\u8981\u7684\u5185\u5b58\u5f00\u9500\uff0c\u6240\u4ee5\u8fd9\u91cc\u8d34\u4e00\u4e2a\u76f8\u5bf9\u7b80\u7ec3\u4e14\u9ad8\u6548\u7684\u7248\u672c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">void<\/span> <span class=\"n\">CopyDirectory<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">sourceFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">targetFolderPath<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Directory<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateDirectory<\/span><span class=\"p\">(<\/span><span class=\"n\">targetFolderPath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">filePath<\/span> <span class=\"k\">in<\/span> <span class=\"n\">Directory<\/span><span class=\"p\">.<\/span><span class=\"n\">GetFiles<\/span><span class=\"p\">(<\/span><span class=\"n\">sourceFolderPath<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">fileName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">GetFileName<\/span><span class=\"p\">(<\/span><span class=\"n\">filePath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">destinationPath<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">Combine<\/span><span class=\"p\">(<\/span><span class=\"n\">targetFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">fileName<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">Copy<\/span><span class=\"p\">(<\/span><span class=\"n\">filePath<\/span><span class=\"p\">,<\/span> <span class=\"n\">destinationPath<\/span><span class=\"p\">,<\/span> <span class=\"kc\">true<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">directoryPath<\/span> <span class=\"k\">in<\/span> <span class=\"n\">Directory<\/span><span class=\"p\">.<\/span><span class=\"n\">GetDirectories<\/span><span class=\"p\">(<\/span><span class=\"n\">sourceFolderPath<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">directoryName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">GetFileName<\/span><span class=\"p\">(<\/span><span class=\"n\">directoryPath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">destinationPath<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">Combine<\/span><span class=\"p\">(<\/span><span class=\"n\">targetFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">directoryName<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">CopyDirectory<\/span><span class=\"p\">(<\/span><span class=\"n\">directoryPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">destinationPath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7b80\u5355\u6765\u8bf4\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u9012\u5f52\u5730\u62f7\u8d1d\u6e90\u6587\u4ef6\u5939\u4e0b\u7684\u6240\u6709\u6587\u4ef6\u548c\u5b50\u6587\u4ef6\u5939\u5230\u76ee\u6807\u6587\u4ef6\u5939\u4e2d\u3002\u5bf9\u4e8e\u5b50\u6587\u4ef6\u5939\uff0c\u4f1a\u9012\u5f52\u8c03\u7528\u8be5\u65b9\u6cd5\u8fdb\u884c\u62f7\u8d1d\u3002<\/p>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\"><code>Directory.CreateDirectory<\/code> \u662f\u4e00\u4e2a\u76f8\u5f53\u7075\u6d3b\u7684\u65b9\u6cd5\u3002\u5982\u679c\u76ee\u6807\u6587\u4ef6\u5939\u4e0d\u5b58\u5728\uff0c\u5b83\u4f1a\u81ea\u52a8\u521b\u5efa\uff1b\u5982\u679c\u76ee\u6807\u6587\u4ef6\u5939\u5df2\u7ecf\u5b58\u5728\uff0c\u5b83\u4f1a\u5ffd\u7565\u8fd9\u4e2a\u64cd\u4f5c\u3002\u540c\u65f6\uff0c\u5b83\u8fd8\u4f1a\u6cbf\u9014\u521b\u5efa\u6240\u6709\u4e0d\u5b58\u5728\u7684\u6587\u4ef6\u5939\uff08\u7c7b\u4f3c <code>mkdir<\/code> \u7684 <code>-p<\/code> \u53c2\u6570\uff09\u3002<\/div>\n<\/div>\n<h2 id=\"\u65b9\u6cd5\u4e8c\u4e0d\u4f7f\u7528\u9012\u5f52\">\n\u65b9\u6cd5\u4e8c\uff1a\u4e0d\u4f7f\u7528\u9012\u5f52\n<a href=\"#%e6%96%b9%e6%b3%95%e4%ba%8c%e4%b8%8d%e4%bd%bf%e7%94%a8%e9%80%92%e5%bd%92\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5982\u679c\u4e0d\u5e0c\u671b\u4f7f\u7528\u9012\u5f52\uff0c\u90a3\u4e48\u4e5f\u53ef\u4ee5\u901a\u8fc7\u76f8\u5bf9\u8def\u5f84\u7684\u65b9\u5f0f\u6765\u5b9e\u73b0\u3002\u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u9012\u5f52\u641c\u7d22\u6e90\u6587\u4ef6\u5939\u4e0b\u7684\u6240\u6709\u6587\u4ef6\uff0c\u901a\u8fc7\u8ba1\u7b97\u5b83\u4e0e\u6e90\u6587\u4ef6\u5939\u7684\u76f8\u5bf9\u8def\u5f84\u6765\u5f97\u5230\u5b83\u7684\u76ee\u6807\u8def\u5f84\uff0c\u8fdb\u800c\u751f\u6210\u76ee\u6807\u8def\u5f84\u6240\u5728\u7684\u6587\u4ef6\u5939\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">void<\/span> <span class=\"n\">CopyDirectory<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">sourceFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">targetFolderPath<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Directory<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateDirectory<\/span><span class=\"p\">(<\/span><span class=\"n\">targetFolderPath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">filePath<\/span> <span class=\"k\">in<\/span> <span class=\"n\">Directory<\/span><span class=\"p\">.<\/span><span class=\"n\">GetFiles<\/span><span class=\"p\">(<\/span><span class=\"n\">sourceFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;*.*&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">SearchOption<\/span><span class=\"p\">.<\/span><span class=\"n\">AllDirectories<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">relativePath<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">GetRelativePath<\/span><span class=\"p\">(<\/span><span class=\"n\">sourceFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">filePath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">targetFilePath<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">Combine<\/span><span class=\"p\">(<\/span><span class=\"n\">targetFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">relativePath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">subTargetFolderPath<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">GetDirectoryName<\/span><span class=\"p\">(<\/span><span class=\"n\">targetFilePath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">subTargetFolderPath<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Directory<\/span><span class=\"p\">.<\/span><span class=\"n\">CreateDirectory<\/span><span class=\"p\">(<\/span><span class=\"n\">subTargetFolderPath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">Copy<\/span><span class=\"p\">(<\/span><span class=\"n\">filePath<\/span><span class=\"p\">,<\/span> <span class=\"n\">targetFilePath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\"><code>Path.GetDirectoryName<\/code> \u65b9\u6cd5\u6709\u53ef\u80fd\u8fd4\u56de\u7a7a\u3002\u8fd9\u4e00\u60c5\u51b5\u901a\u5e38\u53d1\u751f\u5728\u6587\u4ef6\u4f4d\u4e8e\u6839\u76ee\u5f55\u7684\u60c5\u51b5\uff08\u4f8b\u5982 Windows \u7684 <code>C:\\<\/code>\uff0c\u6216 Unix \u7684 <code>\/<\/code>\uff09\u3002<\/div>\n<\/div>\n<h2 id=\"\u4f7f\u7528-visualbasic-\u7684\u5185\u7f6e\u65b9\u6cd5\">\n\u4f7f\u7528 VisualBasic \u7684\u5185\u7f6e\u65b9\u6cd5\n<a href=\"#%e4%bd%bf%e7%94%a8-visualbasic-%e7%9a%84%e5%86%85%e7%bd%ae%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5176\u5b9e .NET \u4e5f\u4e0d\u662f\u5b8c\u5168\u6ca1\u6709\u63d0\u4f9b\u5185\u7f6e\u7684\u65b9\u6cd5\u3002\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 VisualBasic \u7684 <code>Microsoft.VisualBasic.Devices<\/code> \u547d\u540d\u7a7a\u95f4\u4e0b\u7684 <code>Computer<\/code> \u7c7b\u4e0a\u7684 <code>FileSystem<\/code> \u6210\u5458\u7684\u65b9\u6cd5\u6765\u5b9e\u73b0\u62f7\u8d1d\u6587\u4ef6\u5939\u7684\u529f\u80fd\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Microsoft.VisualBasic.Devices<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Microsoft.VisualBasic.FileIO<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">void<\/span> <span class=\"n\">CopyDirectory<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">sourceFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">targetFolderPath<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">fs<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Computer<\/span><span class=\"p\">().<\/span><span class=\"n\">FileSystem<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">fs<\/span><span class=\"p\">.<\/span><span class=\"n\">CopyDirectory<\/span><span class=\"p\">(<\/span><span class=\"n\">sourceFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">targetFolderPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">UIOption<\/span><span class=\"p\">.<\/span><span class=\"n\">OnlyErrorDialogs<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53ef\u80fd\u6709\u8bfb\u8005\u60f3\u8bf4\uff0c\u4f5c\u8005\u4f60\u600e\u4e48\u4e0d\u65e9\u70b9\u62ff\u51fa\u8fd9\u4e2a\u65b9\u6cd5\u5462\uff1f\u8fd9\u65b9\u6cd5\u591a\u4e48\u5730\u7b80\u5355\u6613\u7528\u554a\uff01<\/p>\n<p>\u5b9e\u9645\u4e0a\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u4e5f\u662f\u6709\u663e\u8457\u7f3a\u70b9\u7684\uff1a<strong>\u9700\u8981\u4f7f\u7528 WinForms \u76f8\u5173\u7684\u5e93<\/strong>\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u4f60\u7684\u9879\u76ee\u9700\u8981 <code>TargetFramework<\/code> \u5305\u542b <code>-windows<\/code>\uff0c\u5e76\u4e14\u8fd8\u8981 <code>UseWindowsForms<\/code>\u3002<\/p>\n<p>\u5982\u679c\u4f60\u5728\u5f00\u53d1 WPF \u6216 WinForms \u7a0b\u5e8f\uff0c\u90a3\u4e48\u8fd9\u901a\u5e38\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\u3002\u4f46\u5982\u679c\u4f60\u662f\u5728\u5f00\u53d1\u63a7\u5236\u53f0\u7a0b\u5e8f\u3001ASP.NET \u7a0b\u5e8f\uff0c\u53c8\u6216\u8005 Avalonia UI \u7b49\u8de8\u5e73\u53f0\u6846\u67b6\uff0c\u90a3\u4e48\u8fd9\u4e2a\u65b9\u6cd5\u663e\u7136\u5c31\u6709\u4e9b unacceptable \u4e86\u3002<\/p>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u5176\u5b9e <code>VisualBasic<\/code> \u8fd8\u63d0\u4f9b\u4e86\u4e00\u4e9b\u522b\u7684\u5b9e\u7528\u529f\u80fd\uff0c\u6bd4\u5982\u5c06\u6587\u4ef6\u79fb\u81f3\u56de\u6536\u7ad9\uff0c\u5c31\u53ef\u4ee5\u7528 <code>FileSystem.DeleteFile<\/code> \u65b9\u6cd5\uff0c\u5e76\u6dfb\u52a0 <code>RecycleOption.SendToRecycleBin<\/code> \u53c2\u6570\u6765\u5b9e\u73b0\u3002\u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u5c06\u6587\u4ef6\u79fb\u81f3\u56de\u6536\u7ad9\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u5220\u9664\u3002<\/div>\n<\/div>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u672c\u6587\u4ecb\u7ecd\u4e86\u4e09\u79cd\u62f7\u8d1d\u6587\u4ef6\u5939\u7684\u65b9\u6cd5\uff0c\u5206\u522b\u662f\u4f7f\u7528\u9012\u5f52\u3001\u4e0d\u4f7f\u7528\u9012\u5f52\u3001\u4ee5\u53ca\u4f7f\u7528 VisualBasic \u7684\u5185\u7f6e\u65b9\u6cd5\u3002\u8fd9\u4e09\u79cd\u65b9\u6cd5\u5404\u6709\u4f18\u52a3\uff0c\u8bfb\u8005\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u9700\u6c42\u6765\u9009\u62e9\u9002\u5408\u7684\u65b9\u6cd5\u3002<\/p>\n<div class=\"notice warning\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"><\/i>Warning\n<\/div>\n<div class=\"notice-content\">\u5728\u62f7\u8d1d\u6587\u4ef6\u5939\u65f6\uff0c\u4e00\u5b9a\u8981\u6ce8\u610f\u6587\u4ef6\u5939\u7684\u6743\u9650\u95ee\u9898\u3002\u5982\u679c\u6e90\u6587\u4ef6\u5939\u6216\u76ee\u6807\u6587\u4ef6\u5939\u7684\u6743\u9650\u4e0d\u8db3\uff0c\u90a3\u4e48\u62f7\u8d1d\u64cd\u4f5c\u53ef\u80fd\u4f1a\u5931\u8d25\u3002<\/div>\n<\/div>"},{"title":"\u5e38\u89c1\u56fe\u7247\u76f8\u5173\u7684\u6570\u636e\u7c7b\u578b\u4e4b\u95f4\u7684\u8f6c\u6362","link":"https:\/\/blog.coldwind.top\/posts\/image-datatypes-conversion\/","pubDate":"Tue, 19 Nov 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/image-datatypes-conversion\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/11\/19\/bqvEn9ipfu7DPem.jpg\" alt=\"Featured image of post \u5e38\u89c1\u56fe\u7247\u76f8\u5173\u7684\u6570\u636e\u7c7b\u578b\u4e4b\u95f4\u7684\u8f6c\u6362\" \/><p>\u6211\u4eec\u5728\u505a .NET \u5f00\u53d1\u65f6\uff0c\u7ecf\u5e38\u8981\u548c\u5404\u79cd\u56fe\u7247\u7684\u6570\u636e\u7c7b\u578b\u6253\u4ea4\u9053\u3002<strong>\u8fd9\u91cc\u6307\u7684\u201c\u7c7b\u578b\u201d\u5e76\u4e0d\u662f\u56fe\u7247\u7684\u6587\u4ef6\u7c7b\u578b\uff0c\u6bd4\u5982 jpg\u3001png\u3001bmp \u7b49\uff0c\u800c\u662f\u56fe\u7247\u6570\u636e\u5728\u5185\u5b58\u4e2d\u7684\u8868\u793a\u65b9\u5f0f<\/strong>\u3002\u8fd9\u4e9b\u7c7b\u578b\u4e4b\u95f4\u7684\u8f6c\u6362\uff0c\u6709\u65f6\u5019\u4f1a\u8ba9\u4eba\u611f\u5230\u56f0\u60d1\u3002\u672c\u6587\u603b\u7ed3\u4e86\u5e38\u89c1\u7684\u56fe\u7247\u6570\u636e\u7c7b\u578b\u4e4b\u95f4\u7684\u8f6c\u6362\u65b9\u6cd5\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u5927\u5bb6\u7406\u6e05\u601d\u8def\u3002<\/p>\n<p>\u5e38\u89c1\u7684\u56fe\u7247\u6570\u636e\u7c7b\u578b\u6709\uff1a<\/p>\n<ul>\n<li><code>byte[]<\/code> \u5b57\u8282\u6570\u7ec4\uff1a\u53ef\u80fd\u6709\u4e24\u79cd\u60c5\u51b5\uff1a\n<ul>\n<li>\u5c06\u56fe\u7247\u6587\u4ef6\u8bfb\u53d6\u5230\u5185\u5b58\u540e\u5f97\u5230\u7684\u5b57\u8282\u6570\u7ec4\uff0c\u5305\u62ec\u56fe\u7247\u6587\u4ef6\u7684\u6587\u4ef6\u5934\u7b49<\/li>\n<li>\u56fe\u7247\u7684\u50cf\u7d20\u6570\u636e\uff0c\u6bd4\u5982 RGB \u6570\u636e<\/li>\n<\/ul>\n<\/li>\n<li><code>Stream<\/code>\uff1a\u6570\u636e\u6d41\uff0c\u6bd4\u5982 <code>MemoryStream<\/code>\u3001<code>FileStream<\/code> \u7b49\uff0c\u4e00\u822c\u548c\u5b57\u8282\u6570\u7ec4\u53ef\u4ee5\u8f7b\u6613\u5730\u76f8\u4e92\u8f6c\u6362<\/li>\n<li><code>Bitmap<\/code>\uff1aWinForms \u4e2d\u7684\u56fe\u7247\u6570\u636e\u7c7b\u578b\uff08\u57fa\u4e8e GDI+\uff09\uff0c\u547d\u540d\u7a7a\u95f4\u662f <code>System.Drawing<\/code><\/li>\n<li><code>BitmapImage<\/code>\uff1aWPF \u4e2d\u7684\u56fe\u7247\u6570\u636e\u7c7b\u578b\uff0c\u547d\u540d\u7a7a\u95f4\u662f <code>System.Windows.Media.Imaging<\/code>\uff0c\u5e38\u7528\u4e8e <code>Image<\/code> \u63a7\u4ef6\u7684 <code>Source<\/code> \u5c5e\u6027\uff08\u662f <code>ImageSource<\/code> \u7c7b\u578b\uff09<\/li>\n<li><code>BitmapSource<\/code>\uff1aWPF \u4e2d\u7684\u56fe\u7247\u6570\u636e\u7c7b\u578b\uff0c\u547d\u540d\u7a7a\u95f4\u662f <code>System.Windows.Media<\/code>\uff0c\u662f <code>BitmapImage<\/code> \u7684\u57fa\u7c7b<\/li>\n<li>\u5176\u4ed6\u4e00\u4e9b\u6765\u81ea\u7b2c\u4e09\u65b9\u5e93\u7684\u56fe\u7247\u7c7b\u578b<\/li>\n<\/ul>\n<h2 id=\"\u5c06\u56fe\u7247\u6587\u4ef6\u8def\u5f84\u8f6c\u4e3a-bitmapimage\">\n\u5c06\u56fe\u7247\u6587\u4ef6\u8def\u5f84\u8f6c\u4e3a BitmapImage\n<a href=\"#%e5%b0%86%e5%9b%be%e7%89%87%e6%96%87%e4%bb%b6%e8%b7%af%e5%be%84%e8%bd%ac%e4%b8%ba-bitmapimage\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5982\u679c\u6211\u4eec\u77e5\u9053\u56fe\u7247\u7684\u94fe\u63a5\uff08\u53ef\u4ee5\u662f\u672c\u5730\u94fe\u63a5\u6216\u7f51\u5740\uff09\uff0c\u5e76\u4e14\u60f3\u8ba9 <code>Image<\/code> \u63a7\u4ef6\u663e\u793a\u8fd9\u4e2a\u56fe\u7247\uff0c\u6700\u7b80\u5355\u7684\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">image<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">image<\/span><span class=\"p\">.<\/span><span class=\"n\">Source<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BitmapImage<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Uri<\/span><span class=\"p\">(<\/span><span class=\"s\">@&#34;path\\to\\image.jpg&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">UriKind<\/span><span class=\"p\">.<\/span><span class=\"n\">RelativeOrAbsolute<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0a\u8ff0\u65b9\u5f0f\u751a\u81f3\u90fd\u4e0d\u9700\u8981\u6307\u5b9a\u56fe\u7247\u7684\u683c\u5f0f\uff0c\u56e0\u4e3a <code>BitmapImage<\/code> \u548c <code>BitmapDecoder<\/code> \u90fd\u4f1a\u81ea\u52a8\u8fdb\u884c\u5904\u7406\u3002<strong>\u5bf9\u4e8e\u5927\u591a\u6570\u5e38\u89c1\u7684\u56fe\u7247\u683c\u5f0f\uff08\u5982 JPG\u3001PNG\u3001BMP\u3001GIF\u3001TIFF\u3001WebP\u3001HEIC\u3001AVIF \u7b49\uff09\uff0c\u8fd9\u51e0\u79cd\u65b9\u5f0f\u90fd\u80fd\u6b63\u5e38\u5de5\u4f5c<\/strong>\u3002\u4f46\u5982\u679c\u662f\u4e00\u4e9b\u4e0d\u592a\u5e38\u89c1\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u5219\u53ef\u80fd\u9700\u8981\u501f\u52a9\u4e00\u4e9b\u7b2c\u4e09\u65b9\u5e93\u624d\u884c\u4e86\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u5982\u679c\u6211\u4eec\u5e76\u6ca1\u6709\u56fe\u7247\u7684\u8def\u5f84\uff0c\u53ea\u6709\u5b83\u88ab\u8bfb\u8fdb\u5185\u5b58\u540e\u7684\u6570\u636e\u7c7b\u578b\uff0c\u90a3\u4e48\u5c31\u9700\u8981\u4e0b\u9762\u7684\u51e0\u79cd\u65b9\u5f0f\u4e86\u3002<\/p>\n<h2 id=\"bitmap-\u8f6c\u4e3a-bitmapimage\">\nBitmap \u8f6c\u4e3a BitmapImage\n<a href=\"#bitmap-%e8%bd%ac%e4%b8%ba-bitmapimage\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>System.Drawing.Bitmap<\/code> \u548c <code>System.Windows.Media.Imaging.BitmapImage<\/code> \u662f\u4e24\u4e2a\u5e38\u89c1\u7684\u56fe\u7247\u6570\u636e\u7c7b\u578b\u3002\u524d\u8005\u662f WinForms \u4e2d\u7684\u7c7b\u578b\uff08GDI+\uff09\uff0c\u540e\u8005\u662f WPF \u7684\u7c7b\u578b\u3002\u5b83\u4eec\u4e4b\u95f4\u7684\u8f6c\u6362\u65b9\u6cd5\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Drawing<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Windows.Media.Imaging<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"n\">BitmapImage<\/span> <span class=\"n\">ConvertBitmapToBitmapImage<\/span><span class=\"p\">(<\/span><span class=\"n\">Bitmap<\/span> <span class=\"n\">bitmap<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">stream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmap<\/span><span class=\"p\">.<\/span><span class=\"n\">Save<\/span><span class=\"p\">(<\/span><span class=\"n\">stream<\/span><span class=\"p\">,<\/span> <span class=\"n\">ImageFormat<\/span><span class=\"p\">.<\/span><span class=\"n\">Png<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">stream<\/span><span class=\"p\">.<\/span><span class=\"n\">Position<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">bitmapImage<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BitmapImage<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">BeginInit<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">CacheOption<\/span> <span class=\"p\">=<\/span> <span class=\"n\">BitmapCacheOption<\/span><span class=\"p\">.<\/span><span class=\"n\">OnLoad<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">StreamSource<\/span> <span class=\"p\">=<\/span> <span class=\"n\">stream<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">EndInit<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">Freeze<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \uff08\u53ef\u9009\uff09\u51bb\u7ed3\u56fe\u7247\uff0c\u63d0\u9ad8\u6027\u80fd\u548c\u7ebf\u7a0b\u5b89\u5168\u6027<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">bitmapImage<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u5b57\u8282\u6570\u7ec4\u8f6c\u4e3a-imagesource\">\n\u5b57\u8282\u6570\u7ec4\u8f6c\u4e3a ImageSource\n<a href=\"#%e5%ad%97%e8%8a%82%e6%95%b0%e7%bb%84%e8%bd%ac%e4%b8%ba-imagesource\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u91cc\u6709\u4e24\u79cd\u60c5\u51b5\u3002\u5982\u679c\u5b57\u8282\u6570\u7ec4\u53ea\u662f\u8bfb\u8fdb\u5185\u5b58\u7684\u56fe\u7247\u6587\u4ef6\u6570\u636e\uff0c\u6bd4\u5982\u4e00\u4e2a\u672c\u5730\u7684 JPG\u3001PNG\u3001BMP \u7b49\u683c\u5f0f\u7684\u6587\u4ef6\uff0c\u90a3\u4e48\u975e\u5e38\u7b80\u5355\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.IO<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Windows.Media.Imaging<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"n\">ImageSource<\/span> <span class=\"n\">ConvertByteArrayToImageSource<\/span><span class=\"p\">(<\/span><span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">bytes<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">stream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">(<\/span><span class=\"n\">bytes<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">bitmapImage<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BitmapImage<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">BeginInit<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">CacheOption<\/span> <span class=\"p\">=<\/span> <span class=\"n\">BitmapCacheOption<\/span><span class=\"p\">.<\/span><span class=\"n\">OnLoad<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">StreamSource<\/span> <span class=\"p\">=<\/span> <span class=\"n\">stream<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">EndInit<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">Freeze<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">bitmapImage<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd8\u6709\u4e00\u79cd\u66f4\u7b80\u5355\u7684\u65b9\u5f0f\uff0c\u76f4\u63a5\u4f7f\u7528 <code>BitmapDecoder<\/code> \u7c7b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Windows.Media.Imaging<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"n\">ImageSource<\/span> <span class=\"n\">ConvertByteArrayToImageSource<\/span><span class=\"p\">(<\/span><span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">bytes<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">stream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">(<\/span><span class=\"n\">bytes<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">BitmapDecoder<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Create<\/span><span class=\"p\">(<\/span><span class=\"n\">stream<\/span><span class=\"p\">,<\/span> <span class=\"n\">BitmapCreateOptions<\/span><span class=\"p\">.<\/span><span class=\"n\">PreservePixelFormat<\/span><span class=\"p\">,<\/span> <span class=\"n\">BitmapCacheOption<\/span><span class=\"p\">.<\/span><span class=\"n\">OnLoad<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Frames<\/span><span class=\"p\">[<\/span><span class=\"m\">0<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u5b57\u8282\u6570\u7ec4\u662f\u56fe\u7247\u7684\u50cf\u7d20\u6570\u636e\uff0c\u6bd4\u5982\u4ece\u5de6\u4e0a\u5230\u53f3\u4e0b\u7684\u9010\u884c RGB \u6570\u636e\uff0c\u90a3\u4e48\u4f1a\u9ebb\u70e6\u4e00\u4e9b\uff0c\u800c\u4e14\u6211\u4eec\u9700\u8981\u6709\u529e\u6cd5\u77e5\u9053\u56fe\u7247\u7684\u5bbd\u9ad8\u7b49\u4fe1\u606f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Windows.Media<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Windows.Media.Imaging<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"n\">ImageSource<\/span> <span class=\"n\">BgrByteArrayToImageSource<\/span><span class=\"p\">(<\/span><span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">array<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">width<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">height<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">channel<\/span> <span class=\"p\">=<\/span> <span class=\"m\">3<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int?<\/span> <span class=\"n\">stride<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">bmp<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">WriteableBitmap<\/span><span class=\"p\">(<\/span><span class=\"n\">width<\/span><span class=\"p\">,<\/span> <span class=\"n\">height<\/span><span class=\"p\">,<\/span> <span class=\"m\">96<\/span><span class=\"p\">,<\/span> <span class=\"m\">96<\/span><span class=\"p\">,<\/span> <span class=\"n\">PixelFormats<\/span><span class=\"p\">.<\/span><span class=\"n\">Bgr24<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">stride<\/span> <span class=\"p\">??=<\/span> <span class=\"p\">((<\/span><span class=\"n\">width<\/span> <span class=\"p\">*<\/span> <span class=\"n\">channel<\/span> <span class=\"p\">+<\/span> <span class=\"m\">3<\/span><span class=\"p\">)<\/span> <span class=\"p\">\/<\/span> <span class=\"m\">4<\/span><span class=\"p\">)<\/span> <span class=\"p\">*<\/span> <span class=\"m\">4<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bmp<\/span><span class=\"p\">.<\/span><span class=\"n\">WritePixels<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Int32Rect<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">width<\/span><span class=\"p\">,<\/span> <span class=\"n\">height<\/span><span class=\"p\">),<\/span> <span class=\"n\">array<\/span><span class=\"p\">,<\/span> <span class=\"n\">stride<\/span><span class=\"p\">.<\/span><span class=\"n\">Value<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bmp<\/span><span class=\"p\">.<\/span><span class=\"n\">Freeze<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">bmp<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"bitmapsource-\u8f6c\u4e3a-bitmapimage\">\nBitmapSource \u8f6c\u4e3a BitmapImage\n<a href=\"#bitmapsource-%e8%bd%ac%e4%b8%ba-bitmapimage\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u4e24\u4e2a\u7c7b\u5176\u5b9e\u662f\u6709\u7ee7\u627f\u5173\u7cfb\u7684\uff0c<code>BitmapImage<\/code> \u7ee7\u627f\u81ea <code>BitmapSource<\/code>\u3002\u4f46\u4e00\u822c\u6211\u4eec\u4ecd\u7136\u9700\u8981\u8fdb\u884c\u4e00\u4e2a\u201c\u8f6c\u6362\u201d\uff0c\u56e0\u4e3a\u901a\u5e38\u7684\u4f7f\u7528\u573a\u666f\u662f\uff0c\u6211\u4eec\u4ece WPF \u63d0\u4f9b\u7684\u526a\u8d34\u677f API \u4e2d\u83b7\u53d6\u5230\u4e00\u4e2a <code>BitmapSource<\/code>\uff0c\u4f46\u6211\u4eec\u7ecf\u8fc7\u7b80\u5355\u7684\u5904\u7406\uff0c\u5c06\u5b83\u8f6c\u4e3a <code>BitmapImage<\/code> \u4ece\u800c\u6dfb\u52a0\u7ed9 <code>Image<\/code> \u63a7\u4ef6\u3002\u8fd9\u65f6\u5019\u53ef\u4ee5\u8fd9\u6837\u8f6c\u6362\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Windows.Media.Imaging<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"n\">BitmapImage<\/span> <span class=\"n\">ConvertBitmapSourceToBitmapImage<\/span><span class=\"p\">(<\/span><span class=\"n\">BitmapSource<\/span> <span class=\"n\">bitmapSource<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">bitmapImage<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BitmapImage<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">stream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">BitmapEncoder<\/span> <span class=\"n\">encoder<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BmpBitmapEncoder<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u526a\u8d34\u677f\u4e2d\u7684\u56fe\u7247\u6570\u636e\u662f BMP \u683c\u5f0f\u7684\uff0c\u800c\u975e PNG \u683c\u5f0f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">encoder<\/span><span class=\"p\">.<\/span><span class=\"n\">Frames<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">BitmapFrame<\/span><span class=\"p\">.<\/span><span class=\"n\">Create<\/span><span class=\"p\">(<\/span><span class=\"n\">bitmapSource<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">encoder<\/span><span class=\"p\">.<\/span><span class=\"n\">Save<\/span><span class=\"p\">(<\/span><span class=\"n\">stream<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">stream<\/span><span class=\"p\">.<\/span><span class=\"n\">Position<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">BeginInit<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">CacheOption<\/span> <span class=\"p\">=<\/span> <span class=\"n\">BitmapCacheOption<\/span><span class=\"p\">.<\/span><span class=\"n\">OnLoad<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">StreamSource<\/span> <span class=\"p\">=<\/span> <span class=\"n\">stream<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">EndInit<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bitmapImage<\/span><span class=\"p\">.<\/span><span class=\"n\">Freeze<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">bitmapImage<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"emgucvimage-\u8f6c\u4e3a-bitmapimage\">\nEmgu.CV.Image \u8f6c\u4e3a BitmapImage\n<a href=\"#emgucvimage-%e8%bd%ac%e4%b8%ba-bitmapimage\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u524d\u9762\u6211\u4eec\u63d0\u5230\uff0c<code>BitmapImage<\/code> \u652f\u6301\u7edd\u5927\u591a\u6570\u5e38\u89c1\u7684\u56fe\u7247\u683c\u5f0f\u3002\u4f46\u5982\u679c\u73b0\u5728\u6211\u4eec\u6709\u4e00\u4e2a\u4e0d\u5e38\u89c1\u7684\u683c\u5f0f\uff0c\u6bd4\u5982 JP2\uff08JPEG 2000\uff09\u683c\u5f0f\uff0c\u90a3\u4e48 <code>BitmapImage<\/code> \u5c31\u65e0\u6cd5\u76f4\u63a5\u5904\u7406\u4e86\u3002\u8fd9\u65f6\u5019\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 Emgu.CV \u5e93\uff0c\u5b83\u662f OpenCV \u7684 .NET \u5c01\u88c5\uff0c\u652f\u6301\u66f4\u591a\u7684\u56fe\u7247\u683c\u5f0f\u3002\u4e0b\u9762\u7ed9\u51fa\u4e00\u79cd\u65b9\u5f0f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">filename<\/span> <span class=\"p\">=<\/span> <span class=\"s\">@&#34;path\\to\\image.jp2&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">mat<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Bgr<\/span><span class=\"p\">,<\/span> <span class=\"n\">Byte<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">filename<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">bytes<\/span> <span class=\"p\">=<\/span> <span class=\"n\">mat<\/span><span class=\"p\">.<\/span><span class=\"n\">ToJpegData<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">stream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">(<\/span><span class=\"n\">bytes<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">bitmap<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BitmapImage<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">bitmap<\/span><span class=\"p\">.<\/span><span class=\"n\">BeginInit<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">bitmap<\/span><span class=\"p\">.<\/span><span class=\"n\">CacheOption<\/span> <span class=\"p\">=<\/span> <span class=\"n\">BitmapCacheOption<\/span><span class=\"p\">.<\/span><span class=\"n\">OnLoad<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">bitmap<\/span><span class=\"p\">.<\/span><span class=\"n\">StreamSource<\/span> <span class=\"p\">=<\/span> <span class=\"n\">stream<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">bitmap<\/span><span class=\"p\">.<\/span><span class=\"n\">EndInit<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">bitmap<\/span><span class=\"p\">.<\/span><span class=\"n\">Freeze<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">control<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Image<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">control<\/span><span class=\"p\">.<\/span><span class=\"n\">Source<\/span> <span class=\"p\">=<\/span> <span class=\"n\">bitmap<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">control<\/span><span class=\"p\">.<\/span><span class=\"n\">Dump<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u770b\u4e86\u8fd9\u4e48\u591a\uff0c\u5927\u5bb6\u76f8\u4fe1\u5df2\u7ecf\u770b\u51fa\u89c4\u5f8b\u4e86\u5427\uff1f\u662f\u7684\uff0c\u5bf9\u4e8e\u5927\u591a\u6570\u60c5\u51b5\uff0c\u6211\u4eec\u90fd\u8981\u5148\u5c06\u6570\u636e\u8f6c\u4e3a\u6301\u6709\u5e38\u89c1\u56fe\u50cf\u7c7b\u578b\u7684 <code>Stream<\/code>\uff0c\u7136\u540e\u518d\u521b\u5efa <code>BitmapImage<\/code>\uff0c\u6700\u540e\u5c06\u5176\u8d4b\u7ed9 <code>Image<\/code> \u63a7\u4ef6\u3002\u8fd9\u6837\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u4fdd\u8bc1\u6211\u4eec\u7684\u4ee3\u7801\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\u90fd\u80fd\u6b63\u5e38\u5de5\u4f5c\u3002<\/p>"},{"title":"WPF \u4e2d\u7684 Name \u4e0e x:Name \u7a76\u7adf\u662f\u4ec0\u4e48\u533a\u522b\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/wpf-name-vs-xname\/","pubDate":"Thu, 10 Oct 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/wpf-name-vs-xname\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/10\/11\/jurJoLAN3aWBgZ6.png\" alt=\"Featured image of post WPF \u4e2d\u7684 Name \u4e0e x:Name \u7a76\u7adf\u662f\u4ec0\u4e48\u533a\u522b\uff1f\" \/><p>\u5728 WPF \u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u7ed9\u63a7\u4ef6\u6dfb\u52a0 <code>Name<\/code> \u6216 <code>x:Name<\/code> \u5c5e\u6027\u3002\u8fd9\u6837\u505a\u7684\u76ee\u7684\u901a\u5e38\u662f\u5e0c\u671b\u5728\u4ee3\u7801\u540e\u53f0\u80fd\u591f\u8bbf\u95ee\u8fd9\u4e2a\u63a7\u4ef6\uff0c\u6216\u8005\u6211\u4eec\u5728\u5199 <code>Binding<\/code> \u8868\u8fbe\u5f0f\u65f6\uff0c\u5e0c\u671b\u4f7f\u7528 <code>ElementName<\/code> \u7684\u65b9\u5f0f\u7ed1\u5b9a\u67d0\u4e2a\u63a7\u4ef6\u3002\u90a3\u4e48\u8fd9\u4e8c\u8005\u7a76\u7adf\u662f\u4ec0\u4e48\u533a\u522b\u5462\uff1f\u672c\u6587\u5c31\u6765\u7b80\u5355\u63a2\u8ba8\u4e00\u4e0b\u3002<\/p>\n<h2 id=\"\u672c\u8d28\u4e0d\u540c\u4f46\u5374\u53c8\u51e0\u4e4e\u76f8\u540c\">\n\u672c\u8d28\u4e0d\u540c\uff0c\u4f46\u5374\u53c8\u51e0\u4e4e\u76f8\u540c\n<a href=\"#%e6%9c%ac%e8%b4%a8%e4%b8%8d%e5%90%8c%e4%bd%86%e5%8d%b4%e5%8f%88%e5%87%a0%e4%b9%8e%e7%9b%b8%e5%90%8c\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u522b\u7684\u6682\u4e14\u4e0d\u8c08\uff0c\u6211\u4eec\u53ea\u5173\u6ce8 XML \u6587\u6863\u7684\u547d\u540d\u7a7a\u95f4\uff0c\u4e0d\u96be\u53d1\u73b0 <code>Name<\/code> \u548c <code>x:Name<\/code> \u7684\u533a\u522b\u5728\u4e8e\u524d\u8005\u6ca1\u6709\u547d\u540d\u7a7a\u95f4\uff0c\u800c\u540e\u8005\u6709\u4e00\u4e2a <code>x<\/code> \u547d\u540d\u7a7a\u95f4\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u901a\u5e38\u6211\u4eec\u7684\u4e00\u4e2a XAML \u6587\u4ef6\u7684\u6839\u5143\u7d20\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"na\">x:Class=<\/span><span class=\"s\">&#34;WpfApp1.MainWindow&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:x=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Title=<\/span><span class=\"s\">&#34;MainWindow&#34;<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;450&#34;<\/span> <span class=\"na\">Width=<\/span><span class=\"s\">&#34;800&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- \u7701\u7565\u5176\u4ed6\u5185\u5bb9 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u4e2d\uff0c<code>xmlns<\/code> \u662f\u9ed8\u8ba4\u7684\u547d\u540d\u7a7a\u95f4\uff0c\u800c <code>xmlns:x<\/code> \u662f <code>x<\/code> \u547d\u540d\u7a7a\u95f4\u3002\u6240\u4ee5\uff0c<code>x:Name<\/code> \u548c <code>Name<\/code> \u5206\u522b\u51fa\u81ea\u54ea\u4e2a\u547d\u540d\u7a7a\u95f4\uff0c\u5c31\u4e0d\u8a00\u800c\u55bb\u4e86\u3002<\/p>\n<p>\u4f46\u662f\uff0c\u867d\u7136\u5b83\u4eec\u4e24\u4e2a\u51fa\u8eab\u4e0d\u540c\uff0c\u4f46\u5728 WPF \u4e2d\uff0c\u5b83\u4eec\u7684\u4f5c\u7528\u51e0\u4e4e\u662f\u4e00\u6837\u7684\u3002\u5177\u4f53\u6765\u8bf4\uff0c<code>Name<\/code> \u662f <a class=\"link\" href=\"https:\/\/source.dot.net\/#PresentationFramework\/System\/Windows\/FrameworkElement.cs,3213\" target=\"_blank\" rel=\"noopener\"\n><code>FrameworkElement<\/code> \u7c7b<\/a>\uff08\u4ee5\u53ca <a class=\"link\" href=\"https:\/\/source.dot.net\/#PresentationFramework\/System\/Windows\/FrameworkContentElement.cs,834\" target=\"_blank\" rel=\"noopener\"\n><code>FrameworkContentElement<\/code> \u7c7b<\/a>\uff0c\u4e0b\u7565\uff09\u7684\u4e00\u4e2a\u4f9d\u8d56\u5c5e\u6027\uff0c\u5f62\u5982\uff08\u4e3a\u4fbf\u4e8e\u9605\u8bfb\uff0c\u4ee3\u7801\u7565\u6709\u5220\u6539\uff09\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"na\">[CommonDependencyProperty]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">DependencyProperty<\/span> <span class=\"n\">NameProperty<\/span> <span class=\"p\">=<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">DependencyProperty<\/span><span class=\"p\">.<\/span><span class=\"n\">Register<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;Name&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">FrameworkElement<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">FrameworkPropertyMetadata<\/span><span class=\"p\">(<\/span><span class=\"cm\">\/* ... *\/<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[Localizability(LocalizationCategory.NeverLocalize)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[MergableProperty(false)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[DesignerSerializationOptions(DesignerSerializationOptions.SerializeAsAttribute)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span> <span class=\"p\">{<\/span> <span class=\"k\">return<\/span> <span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">)<\/span> <span class=\"n\">GetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">NameProperty<\/span><span class=\"p\">);<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">set<\/span> <span class=\"p\">{<\/span> <span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">NameProperty<\/span><span class=\"p\">,<\/span> <span class=\"k\">value<\/span><span class=\"p\">);<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u800c\u8fdb\u4e00\u6b65\u89c2\u5bdf <a class=\"link\" href=\"https:\/\/source.dot.net\/#PresentationFramework\/System\/Windows\/Generated\/FrameworkElement.cs,30\" target=\"_blank\" rel=\"noopener\"\n><code>FrameworkElement<\/code> \u7c7b\u7684\u58f0\u660e<\/a>\uff0c\u6211\u4eec\u53ef\u4ee5\u53d1\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">namespace<\/span> <span class=\"nn\">System.Windows<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [RuntimeNamePropertyAttribute(&#34;Name&#34;)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">FrameworkElement<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u7684 <code>RuntimeNamePropertyAttribute<\/code> \u662f\u4e00\u4e2a\u7279\u6027\uff0c\u5b83\u544a\u8bc9 WPF \u8fd0\u884c\u65f6\uff0c<code>FrameworkElement<\/code> \u7c7b\u7684 <code>Name<\/code> \u5c5e\u6027\u5c06\u4f1a\u88ab\u8f6c\u4e3a <code>x:Name<\/code> \u5c5e\u6027\u3002\u6240\u4ee5\uff0c<code>Name<\/code> \u548c <code>x:Name<\/code> \u5728 WPF \u4e2d\u51e0\u4e4e\u662f\u4e00\u6837\u7684\u3002<\/p>\n<p>\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u8981\u8fd9\u6837\u8bbe\u8ba1\uff0c\u6211\u5e76\u6ca1\u6709\u627e\u5230\u5b98\u65b9\u7684\u7b54\u6848\u3002\u552f\u4e00\u5408\u7406\u7684\u731c\u6d4b\uff0c\u5c31\u662f\u60f3\u7ed9\u5f00\u53d1\u8005\u4e00\u4e2a\u8f83\u4e3a\u65b9\u4fbf\u7684\u65b9\u5f0f\u53bb\u7ed9\u63a7\u4ef6\u547d\u540d\u3002\u6bd5\u7adf\uff0c<code>Name<\/code> \u6bd4 <code>x:Name<\/code> \u770b\u8d77\u6765\u66f4\u7b80\u6d01\uff0c\u66f4\u52a0\u76f4\u89c2\uff08\u6bd5\u7adf\u8fd9\u770b\u8d77\u6765\u5c31\u662f\u5c5e\u4e8e\u63a7\u4ef6\u81ea\u5df1\u7684\u540d\u5b57\u4e00\u6837\uff09\uff0c\u800c\u4e14\u8fd8\u4e0d\u9700\u8981\u4f7f\u7528\u547d\u540d\u7a7a\u95f4\u3002<\/p>\n<h2 id=\"xname-\u672c\u8d28\u4e0a\u610f\u5473\u7740\u4ec0\u4e48\">\nx:Name \u672c\u8d28\u4e0a\u610f\u5473\u7740\u4ec0\u4e48\uff1f\n<a href=\"#xname-%e6%9c%ac%e8%b4%a8%e4%b8%8a%e6%84%8f%e5%91%b3%e7%9d%80%e4%bb%80%e4%b9%88\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u90a3\u4e48\uff0c\u65e2\u7136\u4e8c\u8005\u5e76\u6ca1\u6709\u591a\u5c11\u533a\u522b\uff0c\u6211\u4eec\u73b0\u5728\u5c31\u6765\u770b\u4e00\u770b <code>x:Name<\/code> \u5230\u5e95\u610f\u5473\u7740\u4ec0\u4e48\u3002\u5728 XAML \u4e2d\uff0c\u5f53\u6211\u4eec\u7ed9\u63a7\u4ef6\u6dfb\u52a0 <code>x:Name<\/code> \u5c5e\u6027\u65f6\uff0c\u5b9e\u9645\u4e0a\u662f\u5728\u544a\u8bc9 XAML \u89e3\u6790\u5668\uff0c\u8fd9\u4e2a\u63a7\u4ef6\u7684\u540d\u5b57\u662f\u4ec0\u4e48\u3002\u5e76\u4e14\u76f8\u4fe1\u5927\u5bb6\u90fd\u77e5\u9053\uff0c\u62e5\u6709\u4e86\u540d\u5b57\u7684\u63a7\u4ef6\uff0c\u5b83\u5c31\u4f1a\u53d8\u6210\u7c7b\u7684\u5b57\u6bb5\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4ee3\u7801\u540e\u53f0\u901a\u8fc7\u8fd9\u4e2a\u540d\u5b57\u6765\u8bbf\u95ee\u5b83\u3002<\/p>\n<p>\u5177\u4f53\u6765\u8bf4\uff0c\u4ee5 <code>Window<\/code> \u4e3a\u4f8b\uff0c\u6211\u4eec\u4f1a\u53d1\u73b0\u540e\u53f0\u4ee3\u7801\u662f\u4e00\u4e2a\u5206\u90e8\u7c7b\u3002\u5728\u6211\u4eec\u770b\u4e0d\u5230\u7684\u5730\u65b9\uff0cXAML \u89e3\u6790\u5668\u4f1a\u751f\u6210\u4e00\u4e2a\u7c7b\u3002\u8fd9\u4e2a\u7c7b\u4e2d\u5c31\u6709\u6211\u4eec\u6700\u719f\u6089\u7684\u5728\u6784\u9020\u51fd\u6570\u4e2d\u8c03\u7528\u7684 <code>InitializeComponent<\/code> \u65b9\u6cd5\uff0c\u4ee5\u53ca\u6211\u4eec\u5728 XAML \u4e2d\u6dfb\u52a0\u4e86 <code>Name<\/code> \u7684\u63a7\u4ef6\u6240\u5bf9\u5e94\u7684\u5b57\u6bb5\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u5728 XAML \u4e2d\u8fd9\u6837\u5199\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"na\">x:Class=<\/span><span class=\"s\">&#34;WpfApp1.MainWindow&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:x=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Title=<\/span><span class=\"s\">&#34;MainWindow&#34;<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;450&#34;<\/span> <span class=\"na\">Width=<\/span><span class=\"s\">&#34;800&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;button1&#34;<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Click Me&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">x:Name=<\/span><span class=\"s\">&#34;button2&#34;<\/span> <span class=\"na\">x:FieldModifier=<\/span><span class=\"s\">&#34;private&#34;<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Click Me&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u90a3\u4e48\uff0c\u6211\u4eec\u5c31\u80fd\u5728\u540e\u53f0\u751f\u6210\u7684\u4ee3\u7801\uff08\u6587\u4ef6\u540d\u7c7b\u4f3c <code>MainWindow.g.i.cs<\/code>\uff09\u4e2d\u627e\u5230\u8fd9\u6837\u7684\u5185\u5bb9\uff08\u6211\u4eec\u53ef\u4ee5\u5728\u540e\u53f0\u968f\u4fbf\u4e00\u4e2a\u5730\u65b9\u8bbf\u95ee\u8fd9\u4e2a\u5b57\u6bb5\uff0c\u7136\u540e\u7528 IDE \u7684\u8df3\u8f6c\u5230\u5b9a\u4e49\u7684\u65b9\u5f0f\u627e\u5230\u540e\u53f0\u751f\u6210\u7684\u4ee3\u7801\uff09\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainWindow<\/span> <span class=\"p\">:<\/span> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">internal<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"n\">Windows<\/span><span class=\"p\">.<\/span><span class=\"n\">Controls<\/span><span class=\"p\">.<\/span><span class=\"n\">Button<\/span> <span class=\"n\">button1<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"n\">Windows<\/span><span class=\"p\">.<\/span><span class=\"n\">Controls<\/span><span class=\"p\">.<\/span><span class=\"n\">Button<\/span> <span class=\"n\">button2<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6b64\u5916\uff0c\u5982\u679c XAML \u4e2d\u7684\u4e00\u4e2a\u63a7\u4ef6\u62e5\u6709\u4e86 <code>Name<\/code>\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e9b\u522b\u7684\u4e8b\u60c5\u3002\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a<\/p>\n<ol>\n<li>\u5728 <code>Binding<\/code> \u8868\u8fbe\u5f0f\u4e2d\u4f7f\u7528 <code>ElementName<\/code> \u6765\u7ed1\u5b9a\u8fd9\u4e2a\u63a7\u4ef6\uff1b<\/li>\n<li>\u5728 <code>Storyboard<\/code> \u4e2d\u4f7f\u7528 <code>TargetName<\/code> \u6765\u6307\u5b9a\u8fd9\u4e2a\u63a7\u4ef6\uff1b<\/li>\n<li>\u5728\u540e\u53f0\u4ee3\u7801\u4e2d\u4f7f\u7528 <code>FindName<\/code> \u65b9\u6cd5\u6765\u67e5\u627e\u8fd9\u4e2a\u63a7\u4ef6\u3002<\/li>\n<\/ol>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u672c\u6587\u7b80\u5355\u4ecb\u7ecd\u4e86 WPF \u4e2d\u7684 <code>Name<\/code> \u548c <code>x:Name<\/code> \u5c5e\u6027\u3002\u867d\u7136\u5b83\u4eec\u5728\u672c\u8d28\u4e0a\u6709\u4e00\u4e9b\u533a\u522b\uff0c\u4f46\u5728 WPF \u4e2d\uff0c\u5b83\u4eec\u7684\u4f5c\u7528\u51e0\u4e4e\u662f\u4e00\u6837\u7684\u3002<\/p>\n<p>\u56f4\u7ed5\u7740 <code>Name<\/code> \u8fd9\u4e2a\u6982\u5ff5\uff0c\u5176\u5b9e\u80fd\u804a\u7684\u8fd8\u6709\u5f88\u591a\u3002\u6bd4\u5982\uff1a<\/p>\n<ol>\n<li><code>NameScope<\/code> \u7684\u6982\u5ff5\uff1b<\/li>\n<li>\u5f53\u6301\u6709 <code>Name<\/code> \u7684\u63a7\u4ef6\u5728 <code>ControlTemplate<\/code> \u6216 <code>DataTemplate<\/code> \u4e2d\u65f6\u4f1a\u600e\u6837\uff1b<\/li>\n<li>\u4e0e\u4e4b\u76f8\u5173\u7684\u5176\u4ed6\u6765\u81ea <code>x<\/code> \u547d\u540d\u7a7a\u95f4\u7684\u5c5e\u6027\uff0c\u6bd4\u5982 <code>x:FieldModifier<\/code>\u3001<code>x:Reference<\/code> \u7b49\u3002<\/li>\n<\/ol>\n<p>\u8fd9\u4e9b\u5185\u5bb9\uff0c\u6211\u4eec\u4f1a\u5728\u4ee5\u540e\u7684\u6587\u7ae0\u4e2d\u7ee7\u7eed\u63a2\u8ba8\u3002<\/p>\n<h2 id=\"\u53c2\u8003\">\n\u53c2\u8003\n<a href=\"#%e5%8f%82%e8%80%83\" class=\"anchor\">&para;<\/a>\n<\/h2><ul>\n<li><a class=\"link\" href=\"https:\/\/stackoverflow.com\/questions\/589874\/in-wpf-what-are-the-differences-between-the-xname-and-name-attributes\" target=\"_blank\" rel=\"noopener\"\n>In WPF, what are the differences between the x:Name and Name attributes?<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/desktop\/xaml-services\/xname-directive\" target=\"_blank\" rel=\"noopener\"\n>x:Name Directive | Microsoft Learn<\/a><\/li>\n<\/ul>"},{"title":"\u5982\u4f55\u9ad8\u6548\u8bfb\u53d6 XML \u4e2d\u6240\u9700\u7684\u5185\u5bb9\uff08\u5176\u4e8c\uff09","link":"https:\/\/blog.coldwind.top\/posts\/xml-read-benchmarks-2\/","pubDate":"Fri, 27 Sep 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/xml-read-benchmarks-2\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/10\/11\/XEIhj5DuRS6Wa4n.png\" alt=\"Featured image of post \u5982\u4f55\u9ad8\u6548\u8bfb\u53d6 XML \u4e2d\u6240\u9700\u7684\u5185\u5bb9\uff08\u5176\u4e8c\uff09\" \/><p>\u6211\u4eec\u7ee7\u7eed<a class=\"link\" href=\"https:\/\/blog.coldwind.top\/posts\/xml-read-benchmarks\" >\u4e0a\u4e00\u6b21\u7684\u5185\u5bb9<\/a>\uff0c\u518d\u6765\u770b\u4e00\u770b\u5173\u4e8e XML \u5185\u5bb9\u8bfb\u53d6\u6709\u54ea\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u6027\u80fd\u5dee\u522b\u3002\u8fd9\u6b21\u6211\u4eec\u7528\u4e8e\u6f14\u793a\u7684 XML \u6587\u672c\u4f9d\u65e7\u662f\u6765\u81ea W3Schools \u7684<a class=\"link\" href=\"https:\/\/www.w3schools.com\/xml\/simple.xml\" target=\"_blank\" rel=\"noopener\"\n>\u4e00\u4e2a\u6837\u4f8b<\/a>\uff0c\u5927\u81f4\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"cp\">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;breakfast_menu&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;food&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;name&gt;<\/span>Belgian Waffles<span class=\"nt\">&lt;\/name&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;price&gt;<\/span>$5.95<span class=\"nt\">&lt;\/price&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;description&gt;<\/span>Two of our famous Belgian Waffles with plenty of real maple syrup<span class=\"nt\">&lt;\/description&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;calories&gt;<\/span>650<span class=\"nt\">&lt;\/calories&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/food&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- \u7701\u7565\u4e2d\u95f4\u7684\u4e09\u4e2a food --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;food&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;name&gt;<\/span>Homestyle Breakfast<span class=\"nt\">&lt;\/name&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;price&gt;<\/span>$6.95<span class=\"nt\">&lt;\/price&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;description&gt;<\/span>Two eggs, bacon or sausage, toast, and our ever-popular hash browns<span class=\"nt\">&lt;\/description&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;calories&gt;<\/span>950<span class=\"nt\">&lt;\/calories&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/food&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/breakfast_menu&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u8fd9\u6b21\u7684\u4efb\u52a1\u662f\uff1a\u83b7\u53d6\u6700\u540e\u4e00\u4e2a <code>food<\/code> \u7684 <code>calories<\/code> \u7684\u503c\uff08\u5373 <code>950<\/code>\uff09\u3002\u8fd9\u6b21\u6211\u4eec\u7684\u9009\u624b\u6709\uff1aLINQ to XML\u3001<code>XPath<\/code> \u4ee5\u53ca\u6b63\u5219\u8868\u8fbe\u5f0f\u3002\u5bf9\u4e8e <code>XPath<\/code>\uff0c\u6211\u4eec\u540c\u6837\u5728 <code>XDocument<\/code> \u4e0a\u8fdb\u884c\u64cd\u4f5c\uff08\u53ea\u9700\u8981\u5f15\u5165 <code>System.Xml.XPath<\/code> \u547d\u540d\u7a7a\u95f4\u5373\u53ef\uff09\u3002<\/p>\n<h2 id=\"linq-to-xml\">\nLINQ to XML\n<a href=\"#linq-to-xml\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6211\u4eec\u5148\u6765\u770b\u4e00\u770b LINQ to XML\uff08\u5373 <code>System.Xml.Linq<\/code> \u547d\u540d\u7a7a\u95f4\uff09\u8be5\u5982\u4f55\u5b9e\u73b0\u5427\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Elements<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">foods<\/span> <span class=\"p\">=<\/span> <span class=\"n\">doc<\/span><span class=\"p\">.<\/span><span class=\"n\">Root<\/span><span class=\"p\">.<\/span><span class=\"n\">Elements<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;food&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">lastFood<\/span> <span class=\"p\">=<\/span> <span class=\"n\">foods<\/span><span class=\"p\">.<\/span><span class=\"n\">Last<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"p\">)<\/span><span class=\"n\">lastFood<\/span><span class=\"p\">.<\/span><span class=\"n\">Element<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;calories&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u5b9e\uff0c\u8fd9\u91cc\u56e0\u4e3a\u6211\u4eec\u5f88\u6e05\u695a XML \u6587\u6863\u7684\u7ed3\u6784\uff0c\u6240\u4ee5\u4e0a\u9762\u7684\u5185\u5bb9\u53ef\u4ee5\u7b80\u5316\u4e3a\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Elements<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"p\">)<\/span><span class=\"n\">doc<\/span><span class=\"p\">.<\/span><span class=\"n\">Root<\/span><span class=\"p\">.<\/span><span class=\"n\">Elements<\/span><span class=\"p\">().<\/span><span class=\"n\">Last<\/span><span class=\"p\">().<\/span><span class=\"n\">Elements<\/span><span class=\"p\">().<\/span><span class=\"n\">Last<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u662f\u53ef\u4ee5\u63d0\u9ad8\u4e00\u70b9\u6027\u80fd\u7684\uff0c\u56e0\u4e3a\u6211\u4eec\u4e0d\u9700\u8981\u68c0\u67e5\u6bcf\u4e2a\u8282\u70b9\u7684\u540d\u5b57\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528 <code>Descendants<\/code> \u8fd9\u4e2a\u65b9\u6cd5\uff0c\u4ece\u800c\u51cf\u5c11\u4e00\u4e9b <code>Elements<\/code> \u7684\u8c03\u7528\u3002\u6700\u6781\u7aef\u7684\u60c5\u51b5\u4e0b\uff0c\u56e0\u4e3a\u6211\u4eec\u8981\u83b7\u53d6\u7684\u5143\u7d20\u6b63\u597d\u662f\u6700\u540e\u4e00\u4e2a\uff0c\u6240\u4ee5\u6211\u4eec\u751a\u81f3\u522b\u7684\u4ec0\u4e48\u90fd\u4e0d\u7528\u505a\uff0c\u76f4\u63a5\u8c03\u7528 <code>Descendants<\/code> \u5c31\u53ef\u4ee5\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Descendants<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"p\">)<\/span><span class=\"n\">doc<\/span><span class=\"p\">.<\/span><span class=\"n\">Root<\/span><span class=\"p\">.<\/span><span class=\"n\">Descendants<\/span><span class=\"p\">().<\/span><span class=\"n\">Last<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"xpath\">\nXPath\n<a href=\"#xpath\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u63a5\u4e0b\u6765\u6211\u4eec\u770b\u4e00\u770b\u4f7f\u7528 XPath \u8868\u8fbe\u5f0f\u8be5\u5982\u4f55\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">XPath<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"p\">)<\/span><span class=\"n\">doc<\/span><span class=\"p\">.<\/span><span class=\"n\">XPathSelectElement<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\/\/food[last()]\/calories&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u6211\u4eec\u501f\u52a9 XPath \u8868\u8fbe\u5f0f\u7684\u7279\u6b8a\u8bed\u6cd5\uff0c\u76f4\u63a5\u9009\u53d6\u4e86\u6700\u540e\u4e00\u4e2a <code>food<\/code> \u8282\u70b9\u7684 <code>calories<\/code> \u5b50\u8282\u70b9\u3002\u6216\u8005\uff0c\u56e0\u4e3a\u6211\u4eec\u77e5\u9053\u603b\u5171\u4e94\u4e2a <code>food<\/code> \u8282\u70b9\uff0c\u6240\u4ee5\u6211\u4eec\u4e5f\u53ef\u4ee5\u5c06\u4e0a\u9762\u7684 <code>last()<\/code> \u66ff\u6362\u4e3a <code>5<\/code>\u3002\u8fd9\u6837\u786e\u5b9e\u4f1a\u6362\u6765\u4e00\u70b9\u70b9\u63d0\u5347\uff0c\u4f46\u662f\u975e\u5e38\u4e0d\u660e\u663e\uff0c\u800c\u4e14\u6709\u800d\u8d56\u7684\u5acc\u7591\uff0c\u6240\u4ee5\u6211\u4eec\u5c31\u4e0d\u8fd9\u4e48\u505a\u4e86\u3002<\/p>\n<p>\u4e0a\u9762\u7684\u65b9\u5f0f\u5176\u5b9e\u6548\u7387\u5e76\u4e0d\u662f\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a <code>\/\/food<\/code> \u4f1a\u641c\u7d22\u6574\u4e2a XML \u6587\u6863\uff0c\u5bfb\u627e\u6240\u6709\u540d\u79f0\u4e3a <code>food<\/code> \u7684\u8282\u70b9\u3002\u5982\u679c\u6211\u4eec\u80fd\u591f\u5c06 XPath \u8868\u8fbe\u5f0f\u5199\u5f97\u66f4\u52a0\u7cbe\u786e\uff0c\u662f\u80fd\u591f\u63d0\u5347\u4e00\u4e9b\u6027\u80fd\u7684\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">XPathOptimized<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"p\">)<\/span><span class=\"n\">doc<\/span><span class=\"p\">.<\/span><span class=\"n\">XPathSelectElement<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\/breakfast_menu\/food[last()]\/calories&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\uff0c\u6211\u4eec\u5c31\u53ea\u9700\u8981\u641c\u7d22 <code>breakfast_menu<\/code> \u8282\u70b9\u4e0b\u7684 <code>food<\/code> \u8282\u70b9\uff0c\u800c\u4e0d\u662f\u6574\u4e2a\u6587\u6863\u4e86\u3002\u8fd9\u4e2a\u4e0d\u7ecf\u610f\u7684\u5c0f\u6539\u52a8\uff0c\u5c31\u80fd\u591f\u5e26\u6765\u663e\u8457\u7684\u6027\u80fd\u63d0\u5347\uff08\u7ea6 4~5 \u500d\uff01\uff09\u3002<\/p>\n<h2 id=\"\u6b63\u5219\u8868\u8fbe\u5f0f\">\n\u6b63\u5219\u8868\u8fbe\u5f0f\n<a href=\"#%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\uff0c\u6211\u4eec\u518d\u6765\u770b\u4e00\u770b\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u5b9e\u73b0\u3002\u8fd9\u4e2a\u5b9e\u73b0\u65b9\u5f0f\u5c31\u975e\u5e38\u7b80\u5355\u7c97\u66b4\u4e86\u3002\u6211\u4eec\u53ea\u9700\u8981\u5339\u914d <code>calories<\/code> \u8282\u70b9\uff0c\u5e76\u62ff\u5230\u6700\u540e\u4e00\u4e2a\u7684\u503c\u5373\u53ef\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Regex<\/span> <span class=\"n\">regex<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">(<\/span><span class=\"s\">@&#34;&lt;calories&gt;(\\d+)&lt;\/calories&gt;&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">matches<\/span> <span class=\"p\">=<\/span> <span class=\"n\">regex<\/span><span class=\"p\">.<\/span><span class=\"n\">Matches<\/span><span class=\"p\">(<\/span><span class=\"n\">xml<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">Parse<\/span><span class=\"p\">(<\/span><span class=\"n\">matches<\/span><span class=\"p\">[^<\/span><span class=\"m\">1<\/span><span class=\"p\">].<\/span><span class=\"n\">Groups<\/span><span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">].<\/span><span class=\"n\">Value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u5176\u5b9e\u6211\u4eec\u4ecd\u7136\u6709\u76f8\u5f53\u5927\u7684\u4f18\u5316\u7a7a\u95f4\u3002\u56e0\u4e3a\u6211\u4eec\u8fd9\u91cc\u9700\u8981\u7684\u662f\u6700\u540e\u4e00\u4e2a <code>calories<\/code> \u8282\u70b9\uff0c\u6240\u4ee5\u6211\u4eec\u4e0d\u9700\u8981\u5339\u914d\u5168\u90e8\u7684 <code>calories<\/code> \u8282\u70b9\uff0c\u53ea\u9700\u8981\u5339\u914d\u5230\u6700\u540e\u4e00\u4e2a\u5373\u53ef\u3002\u5b9e\u73b0\u8fd9\u4e00\u64cd\u4f5c\u7684\u65b9\u5f0f\uff0c\u9664\u4e86\u4fee\u6539\u8868\u8fbe\u5f0f\u672c\u8eab\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u501f\u52a9 <code>RegexOptions.RightToLeft<\/code> \u8fd9\u4e2a\u9009\u9879\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Regex<\/span> <span class=\"n\">regex<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">(<\/span><span class=\"s\">@&#34;&lt;calories&gt;(\\d+)&lt;\/calories&gt;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">RegexOptions<\/span><span class=\"p\">.<\/span><span class=\"n\">RightToLeft<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">RegexOptimized<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">match<\/span> <span class=\"p\">=<\/span> <span class=\"n\">regex<\/span><span class=\"p\">.<\/span><span class=\"n\">Match<\/span><span class=\"p\">(<\/span><span class=\"n\">xml<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">Parse<\/span><span class=\"p\">(<\/span><span class=\"n\">match<\/span><span class=\"p\">.<\/span><span class=\"n\">Groups<\/span><span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">].<\/span><span class=\"n\">Value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u901a\u8fc7\u8fd9\u6837\u7684\u4e00\u4e2a\u7b80\u5355\u64cd\u4f5c\uff0c\u6211\u4eec\u518d\u6b21\u53ef\u4ee5\u6362\u6765\u7ea6 4~5 \u500d\u7684\u6027\u80fd\u63d0\u5347\u3002<\/p>\n<h2 id=\"\u6027\u80fd\u5bf9\u6bd4\">\n\u6027\u80fd\u5bf9\u6bd4\n<a href=\"#%e6%80%a7%e8%83%bd%e5%af%b9%e6%af%94\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u73b0\u5728\uff0c\u6211\u4eec\u53ef\u4ee5\u6765\u770b\u4e00\u770b\u6bd4\u8d5b\u7684\u7ed3\u679c\u4e86\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>Method<\/th>\n<th style=\"text-align: right\">Mean<\/th>\n<th style=\"text-align: right\">Error<\/th>\n<th style=\"text-align: right\">StdDev<\/th>\n<th style=\"text-align: right\">Gen0<\/th>\n<th style=\"text-align: right\">Gen1<\/th>\n<th style=\"text-align: right\">Allocated<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Elements<\/td>\n<td style=\"text-align: right\">101.3 ns<\/td>\n<td style=\"text-align: right\">10.07 ns<\/td>\n<td style=\"text-align: right\">0.55 ns<\/td>\n<td style=\"text-align: right\">0.0101<\/td>\n<td style=\"text-align: right\">0.0001<\/td>\n<td style=\"text-align: right\">128 B<\/td>\n<\/tr>\n<tr>\n<td>Descendants<\/td>\n<td style=\"text-align: right\">243.4 ns<\/td>\n<td style=\"text-align: right\">26.84 ns<\/td>\n<td style=\"text-align: right\">1.47 ns<\/td>\n<td style=\"text-align: right\">0.0062<\/td>\n<td style=\"text-align: right\">0.0005<\/td>\n<td style=\"text-align: right\">80 B<\/td>\n<\/tr>\n<tr>\n<td>RegexMatch<\/td>\n<td style=\"text-align: right\">605.7 ns<\/td>\n<td style=\"text-align: right\">158.79 ns<\/td>\n<td style=\"text-align: right\">8.70 ns<\/td>\n<td style=\"text-align: right\">0.1278<\/td>\n<td style=\"text-align: right\">0.0010<\/td>\n<td style=\"text-align: right\">1608 B<\/td>\n<\/tr>\n<tr>\n<td>RegexMatchOptimized<\/td>\n<td style=\"text-align: right\">128.1 ns<\/td>\n<td style=\"text-align: right\">59.86 ns<\/td>\n<td style=\"text-align: right\">3.28 ns<\/td>\n<td style=\"text-align: right\">0.0305<\/td>\n<td style=\"text-align: right\">0.0002<\/td>\n<td style=\"text-align: right\">384 B<\/td>\n<\/tr>\n<tr>\n<td>XPathOptimized<\/td>\n<td style=\"text-align: right\">1,297.4 ns<\/td>\n<td style=\"text-align: right\">927.55 ns<\/td>\n<td style=\"text-align: right\">50.84 ns<\/td>\n<td style=\"text-align: right\">0.3681<\/td>\n<td style=\"text-align: right\">0.0038<\/td>\n<td style=\"text-align: right\">4624 B<\/td>\n<\/tr>\n<tr>\n<td>XPath<\/td>\n<td style=\"text-align: right\">5,099.2 ns<\/td>\n<td style=\"text-align: right\">1,591.05 ns<\/td>\n<td style=\"text-align: right\">87.21 ns<\/td>\n<td style=\"text-align: right\">0.8087<\/td>\n<td style=\"text-align: right\">0.0076<\/td>\n<td style=\"text-align: right\">10208 B<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0d\u77e5\u9053\u8fd9\u6837\u7684\u7ed3\u679c\u6709\u6ca1\u6709\u51fa\u4e4e\u5927\u5bb6\u7684\u610f\u6599\u5462\uff1f\u4e0d\u96be\u53d1\u73b0\uff0c\u770b\u4f3c\u4e0d\u8d77\u773c\u7684 LINQ to SQL \u65b9\u6cd5\uff0c\u5c45\u7136\u80fd\u8f7b\u6613\u51fb\u8d25\u4e86\u4f18\u5316\u8fc7\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u4ee5\u53ca XPath\uff0c\u5c24\u5176\u662f XPath \u7684\u901f\u5ea6\u5c45\u7136\u4f1a\u8fd9\u4e48\u6162\uff0c\u8fdb\u5165\u4e86\u5fae\u79d2\u7ea7\u522b\u3002<\/p>\n<p>\u53e6\u4e00\u65b9\u9762\uff0c\u5728\u4e0a\u4e00\u6b21\u6bd4\u8d5b\u4e2d\u80dc\u51fa\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\uff0c\u8fd9\u6b21\u5c45\u7136\u4e5f\u4e0d\u654c LINQ to XML\uff0c\u5c24\u5176\u662f\u5982\u679c\u4e0d\u4f18\u5316\uff0c\u90a3\u4e48\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u6027\u80fd\u8fd8\u8981\u518d\u5dee\u4e0a\u4e0d\u5c11\u3002<\/p>\n<p>\u6240\u4ee5\uff0c\u8fd9\u6b21\u7684\u8dd1\u5206\u518d\u6b21\u5411\u6211\u4eec\u8bc1\u660e\uff0c\u5bf9\u4e8e XML \u6587\u6863\u7684\u8bfb\u53d6\uff0cLINQ to XML \u662f\u6700\u597d\u7684\u9009\u62e9\uff0c\u53ef\u4ee5\u8bf4\u662f\u4e0d\u4ec5\u597d\u7528\uff0c\u800c\u4e14\u9ad8\u6548\u3002<\/p>\n<h2 id=\"one-more-thing\">\nOne More Thing\n<a href=\"#one-more-thing\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8bf4\u5230\u8dd1\u5206\uff0c\u8fd9\u79cd\u65f6\u5019\u600e\u4e48\u5c11\u5f97\u4e86 <code>Span<\/code> \u5462\uff1f<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Span<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">xml<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Xml<\/span><span class=\"p\">.<\/span><span class=\"n\">AsSpan<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">Parse<\/span><span class=\"p\">(<\/span><span class=\"n\">xml<\/span><span class=\"p\">.<\/span><span class=\"n\">Slice<\/span><span class=\"p\">(<\/span><span class=\"n\">xml<\/span><span class=\"p\">.<\/span><span class=\"n\">LastIndexOf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&lt;calories&gt;&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">+<\/span> <span class=\"m\">10<\/span><span class=\"p\">,<\/span> <span class=\"n\">xml<\/span><span class=\"p\">.<\/span><span class=\"n\">LastIndexOf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&lt;\/calories&gt;&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">-<\/span> <span class=\"p\">(<\/span><span class=\"n\">xml<\/span><span class=\"p\">.<\/span><span class=\"n\">LastIndexOf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&lt;calories&gt;&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">+<\/span> <span class=\"m\">10<\/span><span class=\"p\">)));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u81f3\u4e8e\u7ed3\u679c\u561b\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>Method<\/th>\n<th style=\"text-align: right\">Mean<\/th>\n<th style=\"text-align: right\">Error<\/th>\n<th style=\"text-align: right\">StdDev<\/th>\n<th style=\"text-align: right\">Ratio<\/th>\n<th style=\"text-align: right\">RatioSD<\/th>\n<th style=\"text-align: right\">Allocated<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Span<\/td>\n<td style=\"text-align: right\">22.30 ns<\/td>\n<td style=\"text-align: right\">0.435 ns<\/td>\n<td style=\"text-align: right\">0.024 ns<\/td>\n<td style=\"text-align: right\">0.22<\/td>\n<td style=\"text-align: right\">0.00<\/td>\n<td style=\"text-align: right\">-<\/td>\n<\/tr>\n<\/tbody>\n<\/table>"},{"title":"\u8981\u8ba4\u8bc6\u3001\u7406\u89e3\u3001\u91cd\u89c6\u4fe1\u606f\u5dee","link":"https:\/\/blog.coldwind.top\/posts\/notice-understand-info-asymmetry\/","pubDate":"Mon, 23 Sep 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/notice-understand-info-asymmetry\/","description":"<p>\u5728\u6211\u4eec\u7684\u5b66\u4e60\u4e0e\u751f\u6d3b\u4e2d\uff0c\u4fe1\u606f\u5dee\u53ef\u4ee5\u8bf4\u662f\u65e0\u5904\u4e0d\u5728\u3002\u6240\u8c13\u201c\u4fe1\u606f\u5dee\u201d\uff0c\u5176\u5b9e\u5c31\u662f\u56e0\u4e3a\u4e0d\u540c\u7684\u4eba\u7684\u89c1\u8bc6\u3001\u7ecf\u5386\u3001\u673a\u4f1a\u7b49\u7684\u4e0d\u540c\uff0c\u800c\u4ea7\u751f\u7684\u4e00\u79cd\u6240\u4e86\u89e3\u7684\u4fe1\u606f\u7684\u4e0d\u5e73\u7b49\u7684\u73b0\u8c61\u3002\u8fd9\u4e00\u73b0\u8c61\u5c06\u4f1a\u5bfc\u81f4\u638c\u63e1\u66f4\u591a\u4fe1\u606f\u7684\u4e00\u65b9\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u5177\u6709\u663e\u8457\u7684\u4f18\u52bf\u3002\u6709\u4e00\u4e2a\u7ecf\u5178\u7684\u5bd3\u8a00\u6545\u4e8b\uff0c\u201c\u62e7\u8fd9\u9897\u87ba\u4e1d\u503c 1 \u7f8e\u5143\uff0c\u800c\u77e5\u9053\u8981\u62e7\u8fd9\u9897\u87ba\u4e1d\u503c 999 \u7f8e\u5143\u201d\u3002\u8fd9\u5176\u5b9e\u5c31\u662f\u4fe1\u606f\u5dee\u3002<\/p>\n<h2 id=\"\u8ba4\u8bc6\u4fe1\u606f\u5dee\">\n\u8ba4\u8bc6\u4fe1\u606f\u5dee\n<a href=\"#%e8%ae%a4%e8%af%86%e4%bf%a1%e6%81%af%e5%b7%ae\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4fe1\u606f\u5dee\u662f\u5ba2\u89c2\u5b58\u5728\u4e14\u51e0\u4e4e\u4e0d\u53ef\u80fd\u6d88\u9664\u7684\u3002\u97e9\u6108\u5728\u300a\u5e08\u8bf4\u300b\u4e2d\u63d0\u5230\uff0c\u201c\u95fb\u9053\u6709\u5148\u540e\uff0c\u672f\u4e1a\u6709\u4e13\u653b\u201d\u3002\u6bcf\u4e2a\u4eba\u53bb\u5b66\u4e60\u5e76\u4e86\u89e3\u4e00\u6837\u4e8b\u7269\u7684\u65e9\u665a\u548c\u5feb\u6162\u90fd\u662f\u4e0d\u540c\u7684\u3002\u6709\u7684\u4eba\u53ef\u80fd\u662f\u76f8\u5173\u7ecf\u9a8c\u6bd4\u8f83\u4e30\u5bcc\uff0c\u6216\u4ece\u5c0f\u5c31\u5bf9\u67d0\u6837\u4e1c\u897f\u5145\u6ee1\u4e86\u5174\u8da3\u548c\u63a2\u7d22\u7684\u6b32\u671b\uff0c\u53c8\u6216\u8005\u8fd0\u6c14\u597d\uff0c\u65e9\u65e9\u5c31\u627e\u5230\u4e86\u70b9\u9192\u81ea\u5df1\u7684\u5b66\u4e60\u8d44\u6599\u3002\u4e5f\u56e0\u6b64\uff0c\u4ed6\u4eec\u65e9\u65e9\u5730\u638c\u63e1\u4e86\u66f4\u591a\u7684\u4fe1\u606f\uff0c\u5e76\u4e14\u57fa\u4e8e\u8fd9\u4e9b\u4fe1\u606f\uff0c\u53c8\u80fd\u591f\u5982\u540c\u6307\u6570\u7206\u70b8\u4e00\u6837\uff0c\u5feb\u901f\u63a5\u53d7\u66f4\u591a\u7684\u5185\u5bb9\u3002\u8fd9\u5c31\u662f\u4e00\u79cd\u4f18\u52bf\u3002<\/p>\n<p>\u6bd4\u5982\u6700\u8fd1\u5927\u706b\u7684\u6e38\u620f\u300a\u9ed1\u795e\u8bdd\u00b7\u609f\u7a7a\u300b\uff0c\u5c31\u4f1a\u51fa\u73b0\u4e00\u79cd\u5206\u6b67\uff1a\u4e00\u90e8\u5206\u4eba\u89c9\u5f97\uff0c\u8fd9\u6e38\u620f\u5e76\u4e0d\u96be\u554a\uff0c\u4e00\u4e9b\u6bd4\u8f83\u5389\u5bb3\u7684 BOSS \u7f51\u4e0a\u5f88\u5bb9\u6613\u627e\u5230\u653b\u7565\uff0c\u76f4\u63a5\u201c\u800d\u8d56\u76ae\u201d\u5c31\u80fd\u8fc7\u5173\uff1b\u800c\u4e5f\u6709\u4e00\u4e9b\u4e0d\u64c5\u957f\u52a8\u4f5c\u7c7b\u6e38\u620f\uff0c\u6216\u8005\u8bf4\u4e0d\u64c5\u957f\u5404\u79cd\u6e38\u620f\u3001\u53ea\u662f\u56e0\u4e3a\u6e38\u620f\u7684\u70ed\u5ea6\u548c\u5bf9\u4e8e\u5267\u60c5\u7684\u5174\u8da3\u6155\u540d\u800c\u6765\u7684\u73a9\u5bb6\u4eec\u5c31\u4f1a\u53eb\u82e6\u4e0d\u8fed\uff0c\u56e0\u4e3a\u6e38\u620f\u8fd8\u6ca1\u6709\u63d0\u4f9b\u96be\u5ea6\u9009\u62e9\u3002\u4e0d\u662f\u6240\u6709\u4eba\u90fd\u4f1a\u8d8a\u632b\u8d8a\u52c7\uff0c\u5c61\u6218\u5c61\u8d25\u672c\u8eab\u5c31\u5f88\u53ef\u80fd\u6d88\u78e8\u4eba\u7684\u610f\u5fd7\uff0c\u6700\u7ec8\u4ea7\u751f\u8d1f\u9762\u60c5\u611f\u3002\u4f46\u524d\u8005\u5c31\u4f1a\u89c9\u5f97\uff0c\u4f60\u4eec\u5c31\u662f\u83dc\u3001\u5c31\u662f\u61d2\uff0c\u660e\u660e\u7f51\u4e0a\u5927\u628a\u7684\u653b\u7565\uff0c\u4f60\u4eec\u90fd\u61d2\u5f97\u627e\u3002<\/p>\n<p>\u65e9\u4e9b\u5e74\u6df1\u5ea6\u5b66\u4e60\u5f88\u706b\u7684\u65f6\u5019\uff0c\u56fd\u5185\u6709\u4e00\u4e9b\u5356\u8bfe\u7684\u535a\u4e3b\uff0c\u4ed6\u4eec\u53ea\u662f\u628a\u65af\u5766\u798f\u5927\u5b66\u7684 CS231N \u7684\u8bfe\u4ef6\u62ff\u8fc7\u6765\u5c31\u80fd\u653e\u5728\u77e5\u4e4e\u5272\u5927\u628a\u7684\u97ed\u83dc\uff1b\u7535\u5546\u5e73\u53f0\u65f6\u5e38\u4f1a\u89c1\u5230\u7684\u201ci7 \u7ea7\u5904\u7406\u5668\u201d\u548c\u53ea\u8981\u4e5d\u5757\u4e5d\u7684 1T \u5bb9\u91cf\u7684 U \u76d8\uff0c\u8fd9\u79cd\u770b\u4f3c\u201c\u660e\u663e\u201d\u7684\u9a97\u5c40\u5374\u5c61\u5c61\u6709\u4eba\u4e2d\u62db\uff1b\u673a\u5708\u4eba\u5c3d\u7686\u77e5\u7684\u642d\u8f7d\u9a81\u9f99 680 \u7684\u7535\u5b50\u5783\u573e\uff0c\u5374\u6709\u53ef\u80fd\u88ab\u4eba\u4ee5 2000 \u5143\u7684\u4ef7\u683c\u4e70\u8d70\u2026\u2026\u8fd9\u6837\u7684\u4f8b\u5b50\u6570\u4e0d\u80dc\u6570\uff0c\u4f46\u5b83\u4eec\u4e5f\u7ec8\u7a76\u662f\u4e00\u76f4\u5e76\u5c06\u957f\u671f\u5b58\u5728\u7740\u3002\u8fd9\u4e9b\u90fd\u662f\u56e0\u4e3a\u4fe1\u606f\u5dee\u5bfc\u81f4\u7684\u3002<\/p>\n<h2 id=\"\u7406\u89e3\u4fe1\u606f\u5dee\">\n\u7406\u89e3\u4fe1\u606f\u5dee\n<a href=\"#%e7%90%86%e8%a7%a3%e4%bf%a1%e6%81%af%e5%b7%ae\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4f46\u662f\u6211\u4eec\u4ec5\u4ec5\u8ba4\u8bc6\u5230\u4fe1\u606f\u5dee\u7684\u5b58\u5728\u662f\u4e0d\u591f\u7684\u3002\u91cd\u8981\u7684\u662f\uff0c\u6211\u4eec\u8981\u7406\u89e3\u4fe1\u606f\u5dee\u3002\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u8bf4\u5462\uff1f\u8fd8\u662f\u4e0a\u9762\u63d0\u5230\u7684\u300a\u9ed1\u795e\u8bdd\u300b\u7684\u4f8b\u5b50\u3002\u6216\u8bb8\u4f60\u77e5\u9053\u67d0\u4e2a BOSS \u6709\u4e00\u4e2a\u5f88\u5077\u9e21\u5f88\u8f7b\u677e\u7684\u6253\u6cd5\uff0c\u4f46\u662f\u4f60\u6bd4\u90a3\u4e9b\u201c\u83dc\u9e1f\u201d\u591a\u77e5\u9053\u7684\uff0c\u5176\u5b9e\u8fdc\u4e0d\u4ec5\u4ec5\u662f\u201c\u6709\u8fd9\u4e2a\u6253\u6cd5\u201d\u3002\u5f88\u6709\u53ef\u80fd\u662f\uff0c\u4f60\u5728\u53d1\u73b0\u8fd9\u7bc7\u653b\u7565\u4e4b\u524d\uff0c\u5df2\u7ecf\u5728\u76f8\u5173\u7684\u793e\u533a\u548c\u8bba\u575b\u6c89\u6d78\u4e86\u6570\u4e2a\u5c0f\u65f6\u3002\u6216\u8bb8\u8fd9\u65f6\u5728\u4f60\u770b\u6765\uff0c\u53ea\u8981\u5728\u641c\u7d22\u5f15\u64ce\u91cc\u9762\u7b80\u5355\u6572\u51e0\u4e2a\u5b57\uff0c\u5c31\u80fd\u518d\u627e\u5230\u8fd9\u4e00\u7bc7\uff1b\u53ef\u8fd9\u5bf9\u4e8e\u4e00\u4e2a\u5b8c\u5168\u4e0d\u4e86\u89e3\u8fd9\u65b9\u9762\u4fe1\u606f\u7684\u4eba\u6765\u8bf4\uff0c\u6240\u6b20\u7f3a\u7684\u65f6\u95f4\uff0c\u53ef\u80fd\u662f\u5de8\u5927\u7684\u3002<\/p>\n<p>\u5728\u6bcf\u4e2a\u9886\u57df\u90fd\u662f\uff0c\u5c31\u6bd4\u5982\u6211\u548c\u6211\u7684\u7edd\u5927\u591a\u6570\u8bfb\u8005\u4eec\u6240\u5904\u7684 .NET \u8fd9\u4e00\u9886\u57df\u3002\u6216\u8bb8\u6709\u4e00\u4e2a\u77e5\u8bc6\u3001\u4e00\u4e2a\u6982\u5ff5\u3001\u4e00\u4e2a\u6280\u5de7\u5bf9\u4e8e\u4f60\u6765\u8bf4\u4eff\u4f5b\u5bb6\u5e38\u4fbf\u996d\uff0c\u76f8\u5e94\u7684\u535a\u5ba2\u6587\u7ae0\u3001\u89c6\u9891\u6559\u7a0b\u3001\u5b98\u65b9\u6587\u6863\u4f60\u53ef\u4ee5\u4fe1\u624b\u62c8\u6765\uff1b\u6216\u8bb8\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u8eab\u7ecf\u767e\u6218\u7684\u4f60\u4e00\u770b\u62a5\u9519\u4fe1\u606f\u5c31\u77e5\u9053\u662f\u56e0\u4e3a\u914d\u9519\u4e86\u73af\u5883\uff0c\u4f46\u662f\u5374\u53ef\u80fd\u8ba9\u65b0\u624b\u5728\u767e\u5ea6\u4e0a\u641c\u7d22\u4e86\u534a\u5929\uff0c\u6700\u540e\u627e\u5230\u4e86\u4e00\u7bc7\u673a\u7ffb\u7684 CSDN \u6587\u7ae0\u624d\u52c9\u5f3a\u89e3\u51b3\u95ee\u9898\uff1b\u4e00\u4e2a\u7b80\u5355\u7684\u63a5\u53e3\u3001\u4f9d\u8d56\u6ce8\u5165\uff0c\u5bf9\u4e8e\u4f60\u6765\u8bf4\u65e9\u5df2\u7ecf\u662f\u8f7b\u8f66\u719f\u8def\u3001\u8001\u751f\u5e38\u8c08\uff0c\u5374\u4f9d\u65e7\u80fd\u591f\u8f7b\u6613\u5730\u56f0\u60d1\u4e00\u4e2a\u975e CS \u79d1\u73ed\u51fa\u8eab\u7684\u65b0\u624b\u6570\u5e74\u3002\u5f88\u591a\u65f6\u5019\uff0c\u4eba\u548c\u4eba\u4e4b\u95f4\u7684\u5dee\u522b\u5e76\u4e0d\u662f\u667a\u5546\uff0c\u800c\u662f\u4fe1\u606f\u3002<\/p>\n<p>\u867d\u7136\u6211\u660e\u767d\u8fd9\u4e2a\u9053\u7406\uff0c\u4f46\u6211\u4e5f\u7ecf\u5e38\u4f1a\u4e0d\u7531\u81ea\u4e3b\u5730\u53bb\u4ea7\u751f\u4e0d\u597d\u7684\u60c5\u611f\u3002\u6bd4\u5982\u6211\u7ecf\u5e38\u4f1a\u5728\u5f39\u5e55\u6216\u8bc4\u8bba\u533a\u770b\u5230\u6709\u4eba\u95ee\u4e3b\u9898\u914d\u8272\u548c\u5b57\u4f53\u7528\u7684\u662f\u4ec0\u4e48\uff0c\u6216\u8005\u95ee\u4e00\u4e9b\u6211\u65e9\u5c31\u6709\u76f8\u5173\u89c6\u9891\u63a2\u8ba8\u8fc7\u7684\u5185\u5bb9\u3002\u660e\u660e\u6211\u5df2\u7ecf\u4e13\u95e8\u51fa\u4e86\u89c6\u9891\u3001\u5728\u5f88\u591a\u5904\u8bc4\u8bba\u7ed9\u51fa\u4e86\u89e3\u7b54\uff0c\u8fd8\u4e13\u95e8\u5199\u4e86\u7f6e\u9876\u4e13\u680f\u6765\u89e3\u7b54\u5e38\u89c1\u95ee\u9898\uff0c\u53ef\u5c31\u662f\u6709\u4eba\u4e0d\u77e5\u9053\u3002\u4f46\u662f\u6362\u4f4d\u601d\u8003\uff0c\u5f53\u6211\u6b63\u5728\u770b\u6cb9\u7ba1\u4e0a\u7684 Tim Corey\u3001Nick Chapsas\u3001Brian Launas \u8fd9\u4e9b\u5927\u4f6c\u7684\u89c6\u9891\u7684\u65f6\u5019\uff0c\u9664\u975e\u6211\u628a\u4ed6\u4eec\u7684\u6240\u6709\u89c6\u9891\u90fd\u5927\u81f4\u5237\u4e86\u4e00\u904d\uff0c\u5426\u5219\u6211\u4f9d\u65e7\u8981\u82b1\u65f6\u95f4\u53bb\u641c\u7d22\u3001\u53bb\u7814\u7a76\u3001\u53bb\u641e\u61c2\u3002\u6211\u4ecd\u8bb0\u5f97\uff0c\u7b2c\u4e00\u6b21\u770b Brian \u7684\u89c6\u9891\u65f6\uff0c\u4ed6\u9879\u76ee\u4e2d\u4f7f\u7528\u4e86 Prism \u6846\u67b6\uff0c\u4f46\u662f\u6211\u5e76\u4e0d\u77e5\u9053\u4ed6\u4e00\u76f4\u90fd\u662f\u8fd9\u6837\u505a\u7684\uff0c\u6240\u4ee5\u7b2c\u4e00\u6b21\u770b\u5230\u4ed6\u7684 MVVM \u6846\u67b6\u201c\u83ab\u540d\u5176\u5999\u201d\u5730\u81ea\u52a8\u5b9e\u73b0\u4e86\u4e00\u4e9b\u529f\u80fd\u65f6\u5b8c\u5168\u4e00\u8138\u61f5\u903c\u3002\u800c\u8fd9\u4e00\u70b9\uff0c\u5bf9\u4e8e\u4ed6\u7684\u5176\u4ed6\u89c2\u4f17\u800c\u8a00\uff0c\u7b80\u76f4\u53ef\u4ee5\u8bf4\u662f\u201c\u5e38\u8bc6\u201d\u2014\u2014\u662f\u7684\uff0c\u6bcf\u4e2a\u4eba\u90fd\u6709\u81ea\u5df1\u7684\u201c\u5e38\u8bc6\u201d\uff0c\u800c\u4e14\u6709\u53ef\u80fd\u548c\u522b\u4eba\u7684\u4ea4\u96c6\u5360\u6bd4\u5e76\u4e0d\u5927\u3002<\/p>\n<p>\u4e5f\u56e0\u6b64\uff0c\u6bcf\u6b21\u6211\u4ecb\u7ecd MVVM \u76f8\u5173\u7684\u5185\u5bb9\u65f6\uff0c\u6211\u4f1a\u5c3d\u91cf\u591a\u8bf4\u4e24\u53e5 MVVM \u793e\u533a\u5de5\u5177\u5305\u7684\u539f\u7406\uff0c\u4ece\u800c\u8ba9\u4e4b\u524d\u6ca1\u63a5\u89e6\u8fc7\u7684\u89c2\u4f17\u4e0d\u81f3\u4e8e\u641e\u4e0d\u6e05\u695a\u90a3\u4e9b\u770b\u4e0d\u5230\u7684\u5c5e\u6027\u662f\u54ea\u513f\u6765\u7684\uff1b\u770b\u5230\u95ee\u4e3b\u9898\u989c\u8272\u548c\u5b57\u4f53\u7684\u95ee\u9898\u65f6\uff0c\u6211\u4e5f\u65f6\u523b\u63d0\u9192\u81ea\u5df1\uff0c\u6211\u77e5\u9053\u6211\u5728\u5f88\u591a\u5730\u65b9\u63d0\u4f9b\u4e86\u56de\u7b54\uff0c\u4e5f\u4f9d\u65e7\u662f\u4e0d\u591f\u7684\u2014\u2014\u6211\u73b0\u5728\u5df2\u7ecf\u6709\u4e00\u767e\u591a\u671f\u89c6\u9891\u4e86\uff0c\u8fde\u6211\u81ea\u5df1\u6709\u65f6\u5019\u90fd\u641e\u4e0d\u6e05\u695a\u67d0\u4e2a\u77e5\u8bc6\u70b9\u6211\u5230\u5e95\u6709\u6ca1\u6709\u8bb2\u8fc7\u3002\u751a\u81f3\u56e0\u4e3a\u6211\u7528\u4e86\u5305\u542b\u8fde\u5b57\u7b26\u7684\u5b57\u4f53\uff0c\u5bfc\u81f4\u4ee3\u7801\u4e2d\u6709\u65f6\u5019\u4f1a\u51fa\u73b0\u8bf8\u5982\u201c\u2260\u201d\u7684\u7b26\u53f7\uff0c\u6211\u73b0\u5728\u90fd\u89c9\u5f97\u6709\u4e9b\u4e0d\u59a5\u3002\u8fd9\u91cc\u7ed9\u770b\u6211 MVVM \u5de5\u5177\u5305\u89c6\u9891\u5e76\u4e14\u56e0\u4e3a\u8fd9\u4e9b\u7b26\u53f7\u611f\u5230\u56f0\u60d1\u8fc7\u7684\u89c2\u4f17\u670b\u53cb\u4eec\u9053\u4e2a\u6b49\u3002<\/p>\n<h2 id=\"\u91cd\u89c6\u4fe1\u606f\u5dee\">\n\u91cd\u89c6\u4fe1\u606f\u5dee\n<a href=\"#%e9%87%8d%e8%a7%86%e4%bf%a1%e6%81%af%e5%b7%ae\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u524d\u9762\u6211\u4eec\u8bf4\u4e86\uff0c\u5bf9\u4e8e\u4fe1\u606f\u5dee\uff0c\u6211\u4eec\u8981\u8ba4\u8bc6\u3001\u8981\u7406\u89e3\uff0c\u4f46\u540c\u65f6\uff0c\u6211\u4eec\u8fd8\u8981\u91cd\u89c6\u3002\u4ec0\u4e48\u662f\u91cd\u89c6\u5462\uff1f\u6211\u4eec\u8981\u77e5\u9053\uff0c\u867d\u7136\u6211\u4eec\u53ef\u80fd\u6bd4\u5176\u4ed6\u4eba\u78b0\u5de7\u591a\u77e5\u9053\u4e86\u4e00\u4e9b\u77e5\u8bc6\uff0c\u4ece\u800c\u4f7f\u6211\u4eec\u5728\u67d0\u4e9b\u65f6\u5019\u5360\u636e\u4e86\u4f18\u52bf\uff0c\u4f46\u662f\u6211\u4eec\u4e5f\u8981\u65f6\u5e38\u53cd\u601d\u3002\u201c\u543e\u65e5\u4e09\u7701\u543e\u8eab\u201d\uff0c\u56e0\u4e3a\u4fe1\u606f\u5dee\u5ba2\u89c2\u5b58\u5728\uff0c\u522b\u4eba\u6709\u6b20\u7f3a\u7684\u4fe1\u606f\uff0c\u6211\u4eec\u6781\u6709\u53ef\u80fd\u4e5f\u6709\uff0c\u800c\u4e14\u53ef\u80fd\u8fd8\u6709\u4e0d\u5c11\u3002\u6240\u4ee5\uff0c\u8c01\u4e5f\u522b\u77a7\u4e0d\u8d77\u8c01\u3002\u6bcf\u4e2a\u4eba\u90fd\u6709\u81ea\u5df1\u7684\u76f2\u533a\uff0c\u90fd\u6709\u81ea\u5df1\u8fd8\u4e0d\u719f\u6089\u7684\u9886\u57df\u3002\u5728\u8fd9\u4e2a\u4fe1\u606f\u7206\u70b8\u7684\u65f6\u4ee3\uff0c\u6211\u4eec\u6c38\u8fdc\u90fd\u4e0d\u8981\u53ea\u6d3b\u5728\u81ea\u5df1\u7684\u8212\u9002\u533a\uff0c\u8981\u6562\u4e8e\u8df3\u51fa\u81ea\u5df1\u7684\u6210\u89c1\uff0c\u53bb\u4e86\u89e3\u3001\u53bb\u5b66\u4e60\u3001\u53bb\u63a5\u53d7\u65b0\u7684\u4e8b\u7269\u3002<\/p>\n<p>\u4eba\u600e\u6837\u624d\u80fd\u8fdb\u6b65\u5462\uff1f\u7a0b\u5e8f\u5458\u7684\u8fdb\u6b65\uff0c\u4e0d\u662f\u9760\u7740\u5199\u76f8\u540c\u7684\u4ee3\u7801\u5199 10000 \u904d\uff0c\u800c\u662f\u9760\u7740\u6bcf\u5929\u90fd\u80fd\u5199\u70b9\u4e4b\u524d\u4ece\u6765\u6ca1\u5199\u8fc7\u7684\u4ee3\u7801\uff0c\u601d\u8003\u4e00\u4e9b\u4ee5\u524d\u6ca1\u60f3\u8fc7\u6216\u6ca1\u76f8\u540c\u7684\u4e8b\u60c5\u3002\u6bcf\u5929\u90fd\u505a\u81ea\u5df1\u8ba4\u4e3a\u5bf9\u7684\u4e8b\u60c5\uff0c\u6216\u8bb8\u5e76\u6ca1\u6709\u8fdb\u6b65\uff1b\u6bcf\u5929\u610f\u8bc6\u5230\u66fe\u7ecf\u7684\u81ea\u5df1\u72af\u8fc7\u4e00\u4e9b\u9519\u8bef\uff0c\u8fd9\u624d\u662f\u5410\u6545\u7eb3\u65b0\u3002\u8981\u6562\u4e8e\u627f\u8ba4\u81ea\u5df1\u7684\u4e0d\u8db3\uff0c\u6b63\u89c6\u81ea\u5df1\u7684\u7f3a\u70b9\uff0c\u7b11\u5bf9\u522b\u4eba\u7684\u9119\u5937\u3002\u76f8\u4fe1\u5c06\u6765\u7684\u81ea\u5df1\uff0c\u56de\u8fc7\u5934\u6765\uff0c\u4f1a\u89c9\u5f97\u4e00\u8def\u8d70\u6765\uff0c\u6bcf\u4e00\u6b21\u201c\u96be\u53d7\u201d\u90fd\u662f\u503c\u5f97\u7684\u3002<\/p>\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u6211\u4eec\u8fd8\u6709\u53e6\u5916\u4e00\u4e2a\u5c42\u9762\u7684\u201c\u91cd\u89c6\u201d\u2014\u2014\u6211\u4eec\u8981\u8b66\u60d5\u522b\u4eba\u5229\u7528\u4fe1\u606f\u5dee\u6765\u6b3a\u9a97\u6216\u8499\u853d\u81ea\u5df1\u3002\u6709\u7684\u4eba\u638c\u63e1\u4e86\u4fe1\u606f\u5dee\uff0c\u6216\u8bb8\u53ea\u662f\u5984\u81ea\u5c0a\u5927\u3001\u76f2\u76ee\u81ea\u4fe1\u3001\u5145\u6ee1\u4e86\u4f18\u8d8a\u611f\uff1b\u4f46\u66f4\u6709\u4e00\u90e8\u5206\u4eba\uff0c\u4f1a\u7279\u610f\u501f\u52a9\u4fe1\u606f\u5dee\u6765\u6536\u201c\u667a\u5546\u7a0e\u201d\u3002\u8fd9\u6837\u7684\u4f8b\u5b50\u5728\u6211\u4eec\u7684\u751f\u6d3b\u4e2d\u53ef\u4ee5\u8bf4\u662f\u65e0\u5904\u4e0d\u5728\uff0c\u4e0d\u7ba1\u662f\u7f51\u5e97\u3001\u4e8c\u624b\u4ea4\u6613\u5e73\u53f0\u3001\u7f51\u8bfe\u5e73\u53f0\uff0c\u8fd8\u662f\u5404\u79cd\u4e2d\u4ecb\u3001\u62db\u8058\u5e73\u53f0\u7b49\u7b49\u3002\u6211\u4eec\u4e00\u5b9a\u8981\u64e6\u4eae\u81ea\u5df1\u7684\u773c\u775b\u3002<\/p>\n<h2 id=\"\u7ed3\u8bed\">\n\u7ed3\u8bed\n<a href=\"#%e7%bb%93%e8%af%ad\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\uff0c\u5e0c\u671b\u5927\u5bb6\u90fd\u80fd\u591f\u7406\u89e3\u4fe1\u606f\u5dee\uff0c\u8981\u65f6\u523b\u6000\u7740\u4e00\u79cd\u201c\u81ea\u5df1\u8fd8\u6709\u5f88\u591a\u4e0d\u77e5\u9053\u7684\u4e1c\u897f\u201d\u7684\u6001\u5ea6\uff0c\u52aa\u529b\u5b66\u4e60\uff0c\u5c3d\u529b\u51cf\u5c11\u6b64\u7c7b\u60c5\u5f62\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u6211\u4eec\u8fd8\u8981\u63d0\u9ad8\u8b66\u60d5\uff0c\u56e0\u4e3a\u53ef\u80fd\u4f1a\u6709\u4eba\u501f\u52a9\u4fe1\u606f\u5dee\u6765\u6b3a\u9a97\u6211\u4eec\u3002\u9762\u5bf9\u90a3\u4e9b\u5f53\u4e0b\u638c\u63e1\u4e86\u6bd4\u81ea\u5df1\u5c11\u7684\u4fe1\u606f\u7684\u4eba\uff0c\u4e0d\u8981\u55e4\u4e4b\u4ee5\u9f3b\uff0c\u800c\u662f\u53cb\u597d\u76f8\u5904\uff0c\u4f38\u51fa\u63f4\u624b\u3002\u6bd5\u7adf\uff0c\u628a\u81ea\u5df1\u638c\u63e1\u7684\u77e5\u8bc6\u6559\u4f1a\u7ed9\u522b\u4eba\uff0c\u4e0d\u6b63\u662f\u8df5\u884c\u4e86\u8d39\u66fc\u5b66\u4e60\u6cd5\u3001\u8bc1\u660e\u81ea\u5df1\u786e\u5b9e\u638c\u63e1\u4e86\u8fd9\u4e2a\u77e5\u8bc6\u5417\uff1f\u53ea\u6709\u6bcf\u4e2a\u4eba\u90fd\u8fd9\u6837\uff0c\u6211\u4eec\u624d\u80fd\u5efa\u8bbe\u4e00\u4e2a\u826f\u597d\u7684\u793e\u533a\u73af\u5883\u3002<\/p>"},{"title":"WPF \u8bbe\u8ba1\u65f6\u7279\u6027\u7684\u5b9e\u7528\u6280\u5de7","link":"https:\/\/blog.coldwind.top\/posts\/wpf-design-time-attributes\/","pubDate":"Sat, 07 Sep 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/wpf-design-time-attributes\/","description":"<blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV17kptetEQV\/\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<p>\u76f8\u4fe1\u65e0\u6570 WPF \u5f00\u53d1\u8005\u5728\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u90fd\u4f1a\u906d\u53d7\u8fc7\u5f88\u591a\u8fd9\u6837\u6216\u90a3\u6837\u7684\u75db\u82e6\uff0c\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li>\u5728\u8bbe\u8ba1 <code>TextBlock<\/code> \u63a7\u4ef6\u65f6\uff0c\u56e0\u4e3a\u65e0\u6cd5\u9884\u89c8\u5b57\u4f53\u3001\u5b57\u53f7\u3001\u989c\u8272\u7b49\u5c5e\u6027\uff0c\u5bfc\u81f4\u9700\u8981\u4e34\u65f6\u7ed9 <code>Text<\/code> \u5c5e\u6027\u8d4b\u4e00\u4e2a\u503c\uff0c\u67e5\u770b\u6548\u679c\u540e\u518d\u5220\u9664\uff1b<\/li>\n<li>\u6709\u4e00\u4e2a\u9ed8\u8ba4\u6298\u53e0\u7684 <code>Expander<\/code> \u63a7\u4ef6\uff0c\u4f46\u662f\u5728\u8bbe\u8ba1\u65f6\u65e0\u6cd5\u770b\u5230\u6298\u53e0\u540e\u7684\u6548\u679c\uff0c\u53ea\u80fd\u5728\u8fd0\u884c\u65f6\u67e5\u770b\uff0c\u6216\u8005\u4e34\u65f6\u4fee\u6539 <code>IsExpanded<\/code> \u5c5e\u6027\uff1b<\/li>\n<li><code>Window<\/code> \u7684 <code>DataContext<\/code> \u56e0\u4e3a\u5728\u540e\u53f0\u4ee3\u7801\u4e2d\u8d4b\u503c\uff0c\u5bfc\u81f4\u5728\u8bbe\u8ba1\u65f6\u65e0\u6cd5\u770b\u5230\u7ed1\u5b9a\u7684\u6570\u636e\uff0c\u4e5f\u65e0\u6cd5\u5728\u4e66\u5199\u7ed1\u5b9a\u65f6\u83b7\u5f97\u667a\u80fd\u63d0\u793a\u3002<\/li>\n<\/ul>\n<p>\u5982\u679c\u4f60\u6709\u8fc7\u8fd9\u6837\u7684\u56f0\u6270\uff0c\u90a3\u4e48\u8fd9\u7bc7\u6587\u7ae0\u4e00\u5b9a\u53ef\u4ee5\u5e2e\u52a9\u5230\u4f60\u3002\u672c\u6587\u5c06\u4ecb\u7ecd WPF \u4e2d\u8bbe\u8ba1\u65f6\u7279\u6027\u7684\u4f7f\u7528\u65b9\u6cd5\uff0c\u8ba9\u4f60\u5728\u8bbe\u8ba1\u65f6\u5c31\u80fd\u770b\u5230\u66f4\u591a\u7684\u6548\u679c\uff0c\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\u3002<\/p>\n<h2 id=\"\u57fa\u672c\u6982\u5ff5\">\n\u57fa\u672c\u6982\u5ff5\n<a href=\"#%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8bbe\u8ba1\u65f6\u7279\u6027\uff08Design-Time Attributes\uff09\u662f WPF \u4e2d\u7684\u4e00\u79cd\u7279\u6027\uff0c\u7528\u4e8e\u5728\u8bbe\u8ba1\u65f6\u4e3a\u63a7\u4ef6\u63d0\u4f9b\u66f4\u591a\u7684\u4fe1\u606f\uff0c\u4ee5\u4fbf\u5728\u8bbe\u8ba1\u65f6\u80fd\u591f\u66f4\u597d\u5730\u9884\u89c8\u63a7\u4ef6\u7684\u6548\u679c\u3002\u8fd9\u4e00\u529f\u80fd\u5176\u5b9e\u9ed8\u8ba4\u4e00\u76f4\u90fd\u662f\u5f00\u542f\u7684\uff0c\u53ea\u662f\u6211\u60f3\u53ef\u80fd\u5f88\u591a\u5f00\u53d1\u8005\u90fd\u6ca1\u6709\u6ce8\u610f\u8fc7\u3002\u6bd4\u5982\u6211\u4eec\u5728 WPF \u4e2d\u65b0\u5efa\u4e00\u4e2a <code>UserControl<\/code>\uff0c\u90a3\u4e48\u5c31\u4f1a\u5728 XAML \u7684\u5f00\u5934\u770b\u5230\u7c7b\u4f3c\u8fd9\u6837\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;UserControl<\/span> <span class=\"na\">x:Class=<\/span><span class=\"s\">&#34;WpfApp1.MyUserControl&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:x=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:mc=<\/span><span class=\"s\">&#34;http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:d=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/expression\/blend\/2008&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">mc:Ignorable=<\/span><span class=\"s\">&#34;d&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">d:DesignHeight=<\/span><span class=\"s\">&#34;450&#34;<\/span> <span class=\"na\">d:DesignWidth=<\/span><span class=\"s\">&#34;800&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/UserControl&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u5f00\u5934\uff0c\u6a21\u677f\u81ea\u52a8\u4e3a\u6211\u4eec\u6dfb\u52a0\u4e86\u5f88\u591a XML \u547d\u540d\u7a7a\u95f4\uff08<code>xmlns<\/code>\uff09\uff0c\u4f46\u662f\u5f88\u591a\u5f00\u53d1\u8005\u53ef\u80fd\u53ea\u4e86\u89e3 <code>xmlns<\/code> \u4e0e <code>xmlns:x<\/code> \u8fd9\u4e24\u4e2a\uff0c\u800c\u5f80\u5f80\u5ffd\u7565\u4e86\u53e6\u5916\u7684\u51e0\u4e2a\u3002\u4f46\u5176\u5b9e\u53e6\u5916\u7684\u51e0\u4e2a\uff08<code>xmlns:mc<\/code>\u3001<code>xmlns:d<\/code>\uff09\u5c31\u63d0\u4f9b\u4e86\u8bbe\u8ba1\u65f6\u7279\u6027\u7684\u652f\u6301\u3002\u6700\u5178\u578b\u7684\u4f8b\u5b50\u5c31\u6bd4\u5982\u4e0a\u9762\u7684<code>d:DesignHeight<\/code>\u548c<code>d:DesignWidth<\/code>\uff0c\u8fd9\u4e24\u4e2a\u5c5e\u6027\u5c31\u662f\u7528\u6765\u5728\u8bbe\u8ba1\u65f6\u6307\u5b9a\u63a7\u4ef6\u7684\u9ad8\u5ea6\u548c\u5bbd\u5ea6\u7684\u3002\u8fd9\u4e9b\u7279\u6027\u6700\u5927\u7684\u7279\u70b9\u5c31\u662f\uff0c\u5b83\u4eec\u53ea\u5728\u8bbe\u8ba1\u65f6\u8d77\u4f5c\u7528\uff0c\u4e0d\u4f1a\u5f71\u54cd\u8fd0\u884c\u65f6\u7684\u6548\u679c\u3002<\/p>\n<p>\u4e86\u89e3\u4e86\u8fd9\u4e9b\u57fa\u672c\u6982\u5ff5\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5f00\u59cb\u4ecb\u7ecd\u4e00\u4e9b\u5e38\u7528\u7684\u8bbe\u8ba1\u65f6\u7279\u6027\u4e86\u3002<\/p>\n<h2 id=\"\u5e38\u7528\u8bbe\u8ba1\u65f6\u7279\u6027\">\n\u5e38\u7528\u8bbe\u8ba1\u65f6\u7279\u6027\n<a href=\"#%e5%b8%b8%e7%94%a8%e8%ae%be%e8%ae%a1%e6%97%b6%e7%89%b9%e6%80%a7\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6bd4\u5982 <code>TextBlock<\/code> \u7684 <code>Text<\/code> \u5728\u8bbe\u8ba1\u65f6\u5e76\u6ca1\u6709\u5185\u5bb9\uff08\u6bd4\u5982\u662f <code>DynamicResource<\/code> \u4ece\u8fd0\u884c\u65f6\u52a0\u8f7d\u7684\u8bed\u8a00\u6587\u4ef6\u4e2d\u83b7\u53d6\uff0c\u6216\u7ed1\u5b9a\u4e86 <code>ViewModel<\/code> \u4e2d\u7684\u5c5e\u6027\uff0c\u4f46\u662f\u8bbe\u8ba1\u65f6\u8fd9\u4e2a\u5c5e\u6027\u6ca1\u6709\u503c\uff0c\u5374\u53c8\u60f3\u9884\u89c8\u5b57\u4f53\u6548\u679c\uff0c\u8fd9\u65f6\u5019\u5c31\u53ef\u4ee5\u4f7f\u7528 <code>d:Text<\/code> \u6765\u6307\u5b9a\u8bbe\u8ba1\u65f6\u7684\u6587\u672c\u5185\u5bb9\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{DynamicResource ResourceKey=HelloWorld}&#34;<\/span> <span class=\"na\">d:Text=<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u5728\u8bbe\u8ba1\u65f6\u5c31\u53ef\u4ee5\u770b\u5230 <code>Hello, World!<\/code> \u8fd9\u4e2a\u6587\u672c\u4e86\u3002<\/p>\n<p>\u5982\u679c <code>TextBlock<\/code> \u7684\u5185\u5bb9\u662f\u7528\u591a\u4e2a <code>Run<\/code> \u7ec4\u5408\u800c\u6210\uff0c\u90a3\u4e48\u6211\u4eec\u4e5f\u53ef\u4ee5\u7528\u8fd9\u6837\u7684\u65b9\u5f0f\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;TextBlock&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;d:TextBlock.Inlines&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Run<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;Hello, &#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Run<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;World!&#34;<\/span> <span class=\"na\">FontWeight=<\/span><span class=\"s\">&#34;Bold&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/d:TextBlock.Inlines&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/TextBlock&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c\">&lt;!-- \u6216\u8005\u4e5f\u53ef\u4ee5\u7528\u4e0b\u9762\u5c06\u8981\u4ecb\u7ecd\u7684\u865a\u62df\u63a7\u4ef6 --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;d:TextBlock&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Run<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;Hello, &#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;d:Run<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;World!&#34;<\/span> <span class=\"na\">FontWeight=<\/span><span class=\"s\">&#34;Bold&#34;<\/span><span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/d:TextBlock&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u4ed6\u7c7b\u4f3c\u7684\u4f8b\u5b50\u8fd8\u6bd4\u5982\uff1a<\/p>\n<ol>\n<li>\u6709\u4e00\u4e2a\u53ea\u5728\u7279\u6b8a\u60c5\u51b5\u4e0b\u624d\u4f1a\u5c55\u793a\u7684\u8fdb\u5ea6\u6761\uff0c\u5e0c\u671b\u67e5\u770b\u5b83\u7684\u6548\u679c\uff1a<code>d:Visibility=&quot;Visible&quot;<\/code><\/li>\n<li>\u6709\u4e00\u4e2a\u5e73\u65f6\u9ed8\u8ba4\u6298\u53e0\u7684\u9762\u677f\uff0c\u60f3\u67e5\u770b\u6548\u679c\uff1a<code>d:IsExpanded=&quot;True&quot;<\/code><\/li>\n<li>\u4e00\u4e2a\u7528\u6237\u63a7\u4ef6\uff0c\u60f3\u7ed9\u5b83\u4e00\u4e2a\u76f8\u5bf9\u5408\u7406\u7684\u9ed8\u8ba4\u5927\u5c0f\uff1a<code>d:DesignHeight=&quot;600&quot;<\/code> \u6216 <code>d:Height<\/code><\/li>\n<li>\u4e00\u4e2a\u4e0b\u62c9\u6846\uff0c\u60f3\u67e5\u770b\u9009\u4e2d\u9879\u7684\u9884\u89c8\u6548\u679c\uff1a<code>d:SelectedIndex=&quot;0&quot;<\/code><\/li>\n<li>\u4e00\u4e2a\u5bfc\u822a\u7528\u7684 <code>ContentControl<\/code>\uff0c\u6211\u4eec\u5e0c\u671b\u9884\u89c8\u5bfc\u822a\u5230\u67d0\u4e00\u9875\u7684\u6548\u679c\uff0c\u5c31\u53ef\u4ee5\u5199 <code>d:ContentControl.Content<\/code><\/li>\n<\/ol>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5173\u4e8e\u4e0a\u9762\u7684\u7b2c 5 \u4e2a\u4f8b\u5b50\uff0c\u4e3a\u4ec0\u4e48\u6211\u4eec\u76f4\u63a5\u5c06\u60f3\u8981\u5bfc\u822a\u7684\u5185\u5bb9\u4ee5\u4e0b\u9762\u8981\u63d0\u5230\u7684\u865a\u62df\u63a7\u4ef6\u7684\u65b9\u5f0f\u6dfb\u52a0\u5230 <code>ContentControl<\/code> \u4e4b\u4e2d\u5462\uff1f\u56e0\u4e3a\u901a\u5e38\u6765\u8bf4\uff0c\u6211\u4eec\u5199\u7684\u5bfc\u822a\u9875\u9762\u662f\u501f\u52a9 <code>UserControl<\/code> \u5b9e\u73b0\u7684\uff0c\u800c\u5b83\u7684\u547d\u540d\u7a7a\u95f4\u901a\u5e38\u4e3a <code>xmlns:local<\/code> \u7b49\u3002\u5bf9\u4e8e\u8fd9\u6837\u7684\u547d\u540d\u7a7a\u95f4\uff0c\u6211\u4eec\u6ca1\u6709\u529e\u6cd5\u4f7f\u7528 <code>d:<\/code> \u6280\u5de7\uff0c\u6240\u4ee5\u8fd9\u91cc\u6211\u4eec\u9009\u62e9\u4e3a <code>ContentControl<\/code> \u7684 <code>Content<\/code> \u5c5e\u6027\u6dfb\u52a0 <code>d:<\/code> \u7279\u6027\u3002<\/div>\n<\/div>\n<h2 id=\"\u865a\u62df\u63a7\u4ef6\">\n\u865a\u62df\u63a7\u4ef6\n<a href=\"#%e8%99%9a%e6%8b%9f%e6%8e%a7%e4%bb%b6\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6211\u4eec\u4e0d\u4ec5\u53ef\u4ee5\u501f\u52a9\u8bbe\u8ba1\u65f6\u7279\u6027\u6765\u5b9e\u73b0\u63a7\u4ef6\u67d0\u4e9b\u5c5e\u6027\u7684\u865a\u62df\uff0c\u8fd8\u53ef\u4ee5\u865a\u62df\u6574\u4e2a\u63a7\u4ef6\u51fa\u6765\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;d:Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Virtual Button&#34;<\/span> <span class=\"na\">Style=<\/span><span class=\"s\">&#34;{StaticResource MyButtonStyle}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728\u8bbe\u8ba1\u65f6\u770b\u5230\u4e00\u4e2a\u865a\u62df\u7684\u6309\u94ae\u4e86\uff0c\u800c\u4e0d\u9700\u8981\u5728\u8fd0\u884c\u65f6\u624d\u80fd\u770b\u5230\u6548\u679c\u3002\u8fd9\u4e00\u6280\u5de7\u53ef\u4ee5\u7528\u6765\u9884\u89c8\u6309\u94ae\u7684\u6837\u5f0f\u3002<\/p>\n<p>\u8fd8\u6709\u4e00\u79cd\u5e38\u89c1\u60c5\u5f62\u662f\uff0c\u6211\u4eec\u8bbe\u8ba1\u7684\u8f6f\u4ef6\u4f1a\u8ba9\u7528\u6237\u53bb\u624b\u52a8\u6dfb\u52a0\u4e00\u4e9b\u9879\u76ee\uff0c\u4ece\u800c\u52a8\u6001\u751f\u6210\u5bf9\u5e94\u7684\u63a7\u4ef6\u3002\u5bf9\u4e8e\u8fd9\u6837\u7684\u60c5\u51b5\uff0c\u6211\u4eec\u5982\u679c\u80fd\u5728\u8bbe\u8ba1\u65f6\u5c31\u770b\u5230\u4e00\u4e9b\u201c\u751f\u6210\u201d\u51fa\u6765\u7684\u63a7\u4ef6\uff0c\u90a3\u4e48\u5c31\u80fd\u66f4\u597d\u5730\u5f00\u53d1\u6837\u5f0f\u4e86\u3002\u6b64\u65f6\uff0c\u6211\u4eec\u6dfb\u52a0\u4e00\u4e9b\u865a\u62df\u63a7\u4ef6\uff0c\u5c31\u53ef\u4ee5\u6ee1\u8db3\u8fd9\u4e2a\u9700\u6c42\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ItemsControl&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;d:ItemsControl.Items&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 1&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Button 3&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/d:ItemsControl.Items&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/ItemsControl&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u8bbe\u8ba1\u65f6\u6570\u636e\">\n\u8bbe\u8ba1\u65f6\u6570\u636e\n<a href=\"#%e8%ae%be%e8%ae%a1%e6%97%b6%e6%95%b0%e6%8d%ae\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u6bb5\u5185\u5bb9\u53ef\u4ee5\u8bf4\u662f\u91cd\u4e2d\u4e4b\u91cd\u4e86\u3002\u5f88\u591a\u5f00\u53d1\u8005\u82e6\u607c\u4e8e\u56e0\u4e3a\u5728 Window \u7684\u4ee3\u7801\u540e\u53f0\u901a\u8fc7 <code>this.DataContext = new ViewModel();<\/code> \u6765\u6dfb\u52a0 <code>ViewModel<\/code>\uff0c\u5bfc\u81f4\u5728\u8bbe\u8ba1\u65f6\u65e0\u6cd5\u770b\u5230\u7ed1\u5b9a\u7684\u6570\u636e\uff0c\u4e5f\u65e0\u6cd5\u83b7\u5f97\u667a\u80fd\u63d0\u793a\u3002\u8fd9\u65f6\u5019\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>d:DataContext<\/code> \u6765\u6307\u5b9a\u8bbe\u8ba1\u65f6\u7684\u6570\u636e\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">d:DataContext=<\/span><span class=\"s\">&#34;{d:DesignInstance Type=vm:MainViewModel}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p><code>DesignInstance<\/code> \u8fd8\u6709\u4e00\u4e2a <code>IsDesignTimeCreatable<\/code> \u5c5e\u6027\uff0c\u7528\u4e8e\u6307\u5b9a\u662f\u5426\u5728\u8bbe\u8ba1\u65f6\u521b\u5efa\u5b9e\u4f8b\u3002\u5982\u679c\u8bbe\u4e3a <code>True<\/code>\uff0c\u8fd8\u5c06\u80fd\u591f\u5728\u8bbe\u8ba1\u65f6\u770b\u5230\u4e00\u4e9b ViewModel \u4e2d\u5c5e\u6027\u7684\u9ed8\u8ba4\u503c\u3002<\/p>\n<p>\u6216\u8005\u6211\u4eec\u8fd8\u53ef\u4ee5\u8fd9\u6837\u5199\uff0c\u5e76\u4e14\u8fd8\u53ef\u4ee5\u5728 XAML \u4e2d\u5b9a\u5236\u4e00\u4e9b ViewModel \u7684\u5c5e\u6027\u7684\u521d\u59cb\u503c\uff0c\u4fbf\u4e8e\u89c2\u5bdf\u6548\u679c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;d:DataContext&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;vm:MainViewModel<\/span> <span class=\"na\">Message=<\/span><span class=\"s\">&#34;Hello!&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/d:DataContext&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u5217\u8868\u9879\">\n\u5217\u8868\u9879\n<a href=\"#%e5%88%97%e8%a1%a8%e9%a1%b9\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5982\u679c\u6211\u4eec\u6709\u4e00\u4e2a <code>ListBox<\/code>\uff0c\u5e76\u4e14\u60f3\u8981\u67e5\u770b\u5217\u8868\u9879\u7684\u6548\u679c\uff0c\u53ef\u4ee5\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ListBox<\/span> <span class=\"na\">ItemsSource=<\/span><span class=\"s\">&#34;{Binding Students}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;d:ListBox.ItemsSource&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;x:Array<\/span> <span class=\"na\">Type=<\/span><span class=\"s\">&#34;model:Student&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;model:Student<\/span> <span class=\"na\">Name=<\/span><span class=\"s\">&#34;Alice&#34;<\/span> <span class=\"na\">Age=<\/span><span class=\"s\">&#34;18&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;model:Student<\/span> <span class=\"na\">Name=<\/span><span class=\"s\">&#34;Bob&#34;<\/span> <span class=\"na\">Age=<\/span><span class=\"s\">&#34;19&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;model:Student<\/span> <span class=\"na\">Name=<\/span><span class=\"s\">&#34;Charlie&#34;<\/span> <span class=\"na\">Age=<\/span><span class=\"s\">&#34;20&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/x:Array&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/d:ListBox.ItemsSource&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/ListBox&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u4e0d\u60f3\u5199 <code>x:Array<\/code>\uff0c\u800c\u662f\u5e0c\u671b\u91c7\u7528\u4f20\u7edf\u7684\u4e3a <code>Items<\/code> \u6dfb\u52a0\u63a7\u4ef6\u7684\u65b9\u5f0f\u6dfb\u52a0\u9884\u89c8\u9879\uff0c\u4e5f\u53ef\u4ee5\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ListBox<\/span> <span class=\"na\">ItemsSource=<\/span><span class=\"s\">&#34;{Binding Students}&#34;<\/span> <span class=\"na\">d:ItemsSource=<\/span><span class=\"s\">&#34;{x:Null}&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ListBox.Items&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ListBoxItem&gt;<\/span>Student 1<span class=\"nt\">&lt;\/ListBoxItem&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ListBoxItem&gt;<\/span>Student 2<span class=\"nt\">&lt;\/ListBoxItem&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ListBoxItem&gt;<\/span>Student 3<span class=\"nt\">&lt;\/ListBoxItem&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/ListBox.Items&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/ListBox&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u989d\u5916\u5199\u4e00\u4e2a <code>d:ItemsSource=&quot;{x:Null}&quot;<\/code> \u662f\u56e0\u4e3a <code>ItemsSource<\/code> \u548c <code>Items<\/code> \u4e24\u4e2a\u5c5e\u6027\u4e0d\u80fd\u540c\u65f6\u4f7f\u7528\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u5c06 <code>ItemsSource<\/code> \u8bbe\u7f6e\u4e3a <code>null<\/code>\uff0c\u5c31\u53ef\u4ee5\u907f\u514d\u8fd9\u4e2a\u62a5\u9519\u4e86\u3002<\/p>\n<p>\u9664\u4e86\u8fd9\u4e9b\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\u9884\u89c8\u7684\u662f\u6bd4\u8f83\u7b80\u5355\u7684\u6570\u636e\uff0c\u6216\u8005\u6211\u4eec\u5e76\u4e0d\u975e\u5e38\u5173\u5fc3\u6570\u636e\u7684\u5185\u5bb9\u53ca\u683c\u5f0f\uff0c\u53ea\u662f\u5e0c\u671b\u751f\u6210\u51e0\u4e2a\u9879\u76ee\u4ece\u800c\u67e5\u770b\u6837\u5f0f\u6216\u6a21\u677f\u7684\u4e66\u5199\u662f\u5426\u6709\u95ee\u9898\uff0c\u90a3\u4e48\u8fd8\u6709\u4e00\u4e2a\u66f4\u7b80\u5355\u7684\u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;ListBox<\/span> <span class=\"na\">ItemsSource=<\/span><span class=\"s\">&#34;{Binding Students}&#34;<\/span> <span class=\"na\">d:ItemsSource=<\/span><span class=\"s\">&#34;{d:SampleData ItemCount=5}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u5c31\u53ef\u4ee5\u751f\u6210 5 \u4e2a\u865a\u62df\u7684\u5217\u8868\u9879\u4e86\u3002<\/p>\n<h2 id=\"\u66f4\u591a\u529f\u80fd\">\n\u66f4\u591a\u529f\u80fd\n<a href=\"#%e6%9b%b4%e5%a4%9a%e5%8a%9f%e8%83%bd\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9664\u4e86\u4e0a\u9762\u4ecb\u7ecd\u7684\u8fd9\u4e9b\uff0c\u8fd8\u6709\u5f88\u591a\u5176\u4ed6\u7684\u8bbe\u8ba1\u65f6\u7279\u6027\uff0c\u6bd4\u5982\uff1a<\/p>\n<ol>\n<li><code>d:DesignSource<\/code> \u7528\u4e8e <code>CollectionViewSource<\/code> \u7684\u8bbe\u8ba1\u65f6\u6570\u636e\uff1b<\/li>\n<li><code>DesignData<\/code> \u751f\u6210\u64cd\u4f5c\uff1b<\/li>\n<li>\u5728\u5176\u4ed6\u7a0b\u5e8f\u96c6\u7684\u81ea\u5b9a\u4e49\u63a7\u4ef6\u53ca\u9644\u52a0\u5c5e\u6027\u4e0a\u4f7f\u7528\u8bbe\u8ba1\u65f6\u7279\u6027\u3002<\/li>\n<\/ol>\n<p>\u5173\u4e8e\u4e0a\u9762\u7684\u8fd9\u4e9b\u5185\u5bb9\uff0c\u5927\u5bb6\u53ef\u4ee5\u79fb\u6b65\u6211\u7684\u89c6\u9891\u89c2\u770b\u5012\u6570\u4e24\u4e2a\u7ae0\u8282\u3002<\/p>\n<h2 id=\"\u53c2\u8003\">\n\u53c2\u8003\n<a href=\"#%e5%8f%82%e8%80%83\" class=\"anchor\">&para;<\/a>\n<\/h2><ul>\n<li><a class=\"link\" href=\"https:\/\/learn.microsoft.com\/en-us\/previous-versions\/visualstudio\/visual-studio-2010\/ee839627%28v=vs.100%29\" target=\"_blank\" rel=\"noopener\"\n>Design-Time Attributes<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/learn.microsoft.com\/en-us\/previous-versions\/visualstudio\/visual-studio-2010\/ee823176%28v=vs.100%29\" target=\"_blank\" rel=\"noopener\"\n>Using Sample Data in the WPF Designer<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/learn.microsoft.com\/en-us\/visualstudio\/xaml-tools\/xaml-designtime-data?view=vs-2022\" target=\"_blank\" rel=\"noopener\"\n>Use Design Time Data with the XAML Designer<\/a><\/li>\n<\/ul>"},{"title":"\u5982\u4f55\u9ad8\u6548\u8bfb\u53d6 XML \u4e2d\u6240\u9700\u7684\u5185\u5bb9\uff08\u5176\u4e00\uff09","link":"https:\/\/blog.coldwind.top\/posts\/xml-read-benchmarks\/","pubDate":"Sun, 18 Aug 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/xml-read-benchmarks\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/08\/18\/d1TnRLiG4kOu6j8.jpg\" alt=\"Featured image of post \u5982\u4f55\u9ad8\u6548\u8bfb\u53d6 XML \u4e2d\u6240\u9700\u7684\u5185\u5bb9\uff08\u5176\u4e00\uff09\" \/><p>\u8fd9\u6b21\u6211\u4eec\u7528\u4e8e\u6f14\u793a\u7684 XML \u6587\u672c\u6765\u81ea W3Schools \u7684<a class=\"link\" href=\"https:\/\/www.w3schools.com\/xml\/simple.xml\" target=\"_blank\" rel=\"noopener\"\n>\u4e00\u4e2a\u6837\u4f8b<\/a>\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"cp\">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;breakfast_menu&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;food&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;name&gt;<\/span>Belgian Waffles<span class=\"nt\">&lt;\/name&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;price&gt;<\/span>$5.95<span class=\"nt\">&lt;\/price&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;description&gt;<\/span>Two of our famous Belgian Waffles with plenty of real maple syrup<span class=\"nt\">&lt;\/description&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;calories&gt;<\/span>650<span class=\"nt\">&lt;\/calories&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/food&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c\">&lt;!-- \u7701\u7565\u4e2d\u95f4\u7684\u4e09\u4e2a food --&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;food&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;name&gt;<\/span>Homestyle Breakfast<span class=\"nt\">&lt;\/name&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;price&gt;<\/span>$6.95<span class=\"nt\">&lt;\/price&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;description&gt;<\/span>Two eggs, bacon or sausage, toast, and our ever-popular hash browns<span class=\"nt\">&lt;\/description&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;calories&gt;<\/span>950<span class=\"nt\">&lt;\/calories&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/food&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/breakfast_menu&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5047\u5b9a\u6211\u4eec\u7684\u4efb\u52a1\u662f\u8bfb\u53d6\u6240\u6709 <code>food<\/code> \u8282\u70b9\u7684 <code>name<\/code> \u5c5e\u6027\u7684\u503c\uff0c\u7136\u540e\u5c06\u5b83\u4eec\u5b58\u50a8\u5230\u4e00\u4e2a <code>List&lt;string&gt;<\/code> \u4e2d\u3002\u9996\u5148\u6211\u4eec\u6765\u7528\u51e0\u79cd\u65b9\u5f0f\u6765\u5b9e\u73b0\u8fd9\u4e2a\u9700\u6c42\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-xmldocument\">\n\u4f7f\u7528 XmlDocument\n<a href=\"#%e4%bd%bf%e7%94%a8-xmldocument\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>XmlDocument<\/code> \u7b97\u662f\u4e00\u79cd\u201c\u4f20\u7edf\u201d\u7684\u65b9\u5f0f\u3002\u5b83\u6709\u4e24\u79cd\u201c\u73a9\u6cd5\u201d\uff0c\u4e00\u79cd\u662f\u4f7f\u7528\u8bf8\u5982 <code>GetElementsByTagName<\/code> \u8fd9\u6837\u7684\u65b9\u6cd5\uff0c\u4e00\u70b9\u4e00\u70b9\u5730\u627e\u5230\u6211\u4eec\u9700\u8981\u7684\u8282\u70b9\u53ca\u5176\u5c5e\u6027\u548c\u5185\u5bb9\uff1b\u53e6\u4e00\u79cd\u662f\u4f7f\u7528 XPath \u8868\u8fbe\u5f0f\uff0c\u4e00\u6b21\u6027\u627e\u5230\u6240\u6709\u7b26\u5408\u6761\u4ef6\u7684\u8282\u70b9\u3002\u6211\u4eec\u5148\u6765\u770b\u770b\u7b2c\u4e00\u79cd\u65b9\u5f0f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">XmlDocument<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">doc<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">XmlDocument<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">doc<\/span><span class=\"p\">.<\/span><span class=\"n\">LoadXml<\/span><span class=\"p\">(<\/span><span class=\"n\">testXml<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">doc<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">GetElementsByTagName<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;food&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">OfType<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">XmlNode<\/span><span class=\"p\">&gt;()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">node<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;name&#34;<\/span><span class=\"p\">]!.<\/span><span class=\"n\">InnerText<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ var names = new List&lt;string&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ foreach (XmlNode node in doc.GetElementsByTagName(&#34;food&#34;))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ {<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ names.Add(node[&#34;name&#34;]!.InnerText);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ }<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ return names;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u4e0a\u9762\u6ce8\u91ca\u6389\u7684\u4ee3\u7801\u662f\u4f7f\u7528\u4f20\u7edf\u7684 <code>foreach<\/code> \u5faa\u73af\u6765\u5b9e\u73b0\u7684\uff0c\u8fd9\u6837\u5199\u5728\u65e7\u7248\u672c\u7684 .NET \u4e2d\u53ef\u80fd\u4f1a\u66f4\u5feb\u4e00\u4e9b\uff0c\u4f46\u662f\u5728 .NET 7 \u4ee5\u6765\u7684\u65b0\u7248\u672c\u4e2d\uff0cLINQ \u7684\u6027\u80fd\u5df2\u7ecf\u5f97\u5230\u4e86\u5f88\u5927\u7684\u63d0\u5347\u3002\u5bf9\u4e8e\u5e38\u89c1\u7684\u96c6\u5408\u7c7b\u578b\uff0cLINQ \u7684\u6027\u80fd\u5df2\u7ecf\u548c\u4f20\u7edf\u7684 <code>foreach<\/code> \u5faa\u73af\u76f8\u5dee\u65e0\u51e0\uff0c\u751a\u81f3\u6709\u65f6\u8fd8\u66f4\u5feb\uff0c\u800c\u4e14\u5b8c\u5168\u4e0d\u4f1a\u4ea7\u751f\u989d\u5916\u7684 GC \u538b\u529b\u3002<\/div>\n<\/div>\n<p>\u7136\u540e\u6211\u4eec\u8fd8\u53ef\u4ee5\u7528 XPath \u8868\u8fbe\u5f0f\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">XmlDocumentXPath<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">doc<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">XmlDocument<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">doc<\/span><span class=\"p\">.<\/span><span class=\"n\">LoadXml<\/span><span class=\"p\">(<\/span><span class=\"n\">testXml<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">doc<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">SelectNodes<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\/\/food\/name&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">OfType<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">XmlNode<\/span><span class=\"p\">&gt;()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">node<\/span><span class=\"p\">.<\/span><span class=\"n\">InnerText<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u4f7f\u7528-xmllinq\">\n\u4f7f\u7528 Xml.Linq\n<a href=\"#%e4%bd%bf%e7%94%a8-xmllinq\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>Xml.Linq<\/code> \u662f\u4e00\u79cd\u66f4\u52a0\u73b0\u4ee3\u7684\u65b9\u5f0f\uff0c\u5b83\u7684 API \u8bbe\u8ba1\u66f4\u52a0\u53cb\u597d\uff0c\u4f7f\u7528\u8d77\u6765\u4e5f\u66f4\u52a0\u65b9\u4fbf\u3002\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">XDocument<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">doc<\/span> <span class=\"p\">=<\/span> <span class=\"n\">XDocument<\/span><span class=\"p\">.<\/span><span class=\"n\">Parse<\/span><span class=\"p\">(<\/span><span class=\"n\">testXml<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">doc<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Root<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Elements<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;food&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">node<\/span><span class=\"p\">.<\/span><span class=\"n\">Element<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;name&#34;<\/span><span class=\"p\">)!.<\/span><span class=\"n\">Value<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p><code>XDocument<\/code> \u540c\u6837\u53ef\u4ee5\u4f7f\u7528 XPath \u8868\u8fbe\u5f0f\u6765\u5b9e\u73b0\uff0c\u4f46\u662f\u8fd9\u91cc\u6211\u4eec\u5c31\u4e0d\u6f14\u793a\u4e86\uff0c\u56e0\u4e3a <code>XDocument<\/code> \u7684 API \u8bbe\u8ba1\u5df2\u7ecf\u8db3\u591f\u53cb\u597d\uff0c\u4e0d\u50cf\u662f <code>XmlDocument<\/code> \u90a3\u6837\u4f7f\u7528 XPath \u8868\u8fbe\u5f0f\u4f1a\u663e\u5f97\u66f4\u52a0\u7b80\u6d01\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-xmlreader\">\n\u4f7f\u7528 XmlReader\n<a href=\"#%e4%bd%bf%e7%94%a8-xmlreader\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>XmlReader<\/code> \u662f\u4e00\u79cd\u57fa\u4e8e\u6d41\u7684\u65b9\u5f0f\uff0c\u5b83\u7684\u64cd\u4f5c\u5e76\u4e0d\u7b80\u5355\uff0c\u4f46\u662f\u6548\u7387\u6781\u9ad8\u3002\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">XmlReader<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">stringReader<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StringReader<\/span><span class=\"p\">(<\/span><span class=\"n\">testXml<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">xmlReader<\/span> <span class=\"p\">=<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"n\">Xml<\/span><span class=\"p\">.<\/span><span class=\"n\">XmlReader<\/span><span class=\"p\">.<\/span><span class=\"n\">Create<\/span><span class=\"p\">(<\/span><span class=\"n\">stringReader<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">res<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;(<\/span><span class=\"m\">8<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"n\">xmlReader<\/span><span class=\"p\">.<\/span><span class=\"n\">Read<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">xmlReader<\/span><span class=\"p\">.<\/span><span class=\"n\">IsStartElement<\/span><span class=\"p\">()<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">xmlReader<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span> <span class=\"p\">==<\/span> <span class=\"s\">&#34;name&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">res<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">xmlReader<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadElementContentAsString<\/span><span class=\"p\">());<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">res<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u4f7f\u7528-regex\">\n\u4f7f\u7528 Regex\n<a href=\"#%e4%bd%bf%e7%94%a8-regex\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u56e0\u4e3a\u6211\u4eec\u7684\u4efb\u52a1\u8fc7\u4e8e\u7b80\u5355\uff0c\u8981\u89e3\u6790\u7684 XML \u6587\u672c\u5185\u5bb9\u4e5f\u5f88\u7eaf\u7cb9\uff0c\u6240\u4ee5\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">matches<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Regex<\/span><span class=\"p\">.<\/span><span class=\"n\">Matches<\/span><span class=\"p\">(<\/span><span class=\"n\">testXml<\/span><span class=\"p\">,<\/span> <span class=\"s\">@&#34;&lt;name&gt;(.*?)&lt;\/name&gt;&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">matches<\/span><span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">match<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">match<\/span><span class=\"p\">.<\/span><span class=\"n\">Groups<\/span><span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">].<\/span><span class=\"n\">Value<\/span><span class=\"p\">).<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u4f7f\u7528\u4f20\u7edf\u7684\u5b57\u7b26\u4e32\u65b9\u6cd5\">\n\u4f7f\u7528\u4f20\u7edf\u7684\u5b57\u7b26\u4e32\u65b9\u6cd5\n<a href=\"#%e4%bd%bf%e7%94%a8%e4%bc%a0%e7%bb%9f%e7%9a%84%e5%ad%97%e7%ac%a6%e4%b8%b2%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528\u4f20\u7edf\u7684\u5b57\u7b26\u4e32\u65b9\u6cd5\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">StringOps<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">res<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;(<\/span><span class=\"m\">8<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">cur<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u627e\u5230\u4e0b\u4e00\u4e2a &lt;name&gt; \u8282\u70b9<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">idx<\/span> <span class=\"p\">=<\/span> <span class=\"n\">testXml<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&lt;name&gt;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">cur<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5982\u679c\u627e\u4e0d\u5230\uff0c\u8bf4\u660e\u5df2\u7ecf\u627e\u5b8c\u4e86<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">idx<\/span> <span class=\"p\">&lt;<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u627e\u5230\u5bf9\u5e94\u7684 &lt;\/name&gt; \u8282\u70b9<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">end<\/span> <span class=\"p\">=<\/span> <span class=\"n\">testXml<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&lt;\/name&gt;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">idx<\/span> <span class=\"p\">+<\/span> <span class=\"m\">6<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">res<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">testXml<\/span><span class=\"p\">.<\/span><span class=\"n\">Substring<\/span><span class=\"p\">(<\/span><span class=\"n\">idx<\/span> <span class=\"p\">+<\/span> <span class=\"m\">6<\/span><span class=\"p\">,<\/span> <span class=\"n\">end<\/span> <span class=\"p\">-<\/span> <span class=\"n\">idx<\/span> <span class=\"p\">-<\/span> <span class=\"m\">6<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u4ece\u4e0b\u4e00\u4e2a\u8282\u70b9\u5f00\u59cb\u7ee7\u7eed\u627e<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">cur<\/span> <span class=\"p\">=<\/span> <span class=\"n\">end<\/span> <span class=\"p\">+<\/span> <span class=\"m\">7<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u63d0\u524d\u5267\u900f\u4e00\u4e0b\uff0c\u8fd9\u4e2a\u65b9\u5f0f\u7684\u6548\u7387\u975e\u5e38\u4f4e\uff0c\u8fdc\u4f4e\u4e8e\u5176\u4ed6\u51e0\u79cd\u65b9\u5f0f\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u8fd8\u6709\u4e00\u4e2a\u6740\u624b\u950f\uff1a<code>Span&lt;T&gt;<\/code>\u3002<\/p>\n<h2 id=\"\u4f7f\u7528-spant\">\n\u4f7f\u7528 Span<T>\n<a href=\"#%e4%bd%bf%e7%94%a8-spant\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>Span&lt;T&gt;<\/code> \u662f C# 7.2 \u5f15\u5165\u7684\u4e00\u4e2a\u65b0\u7279\u6027\uff0c\u5b83\u53ef\u4ee5\u8ba9\u6211\u4eec\u66f4\u52a0\u9ad8\u6548\u5730\u64cd\u4f5c\u5185\u5b58\u3002\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">SpanOps<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">res<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;(<\/span><span class=\"m\">8<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">span<\/span> <span class=\"p\">=<\/span> <span class=\"n\">testXml<\/span><span class=\"p\">.<\/span><span class=\"n\">AsSpan<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">idx<\/span> <span class=\"p\">=<\/span> <span class=\"n\">span<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&lt;name&gt;&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">idx<\/span> <span class=\"p\">&lt;<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">end<\/span> <span class=\"p\">=<\/span> <span class=\"n\">span<\/span><span class=\"p\">.<\/span><span class=\"n\">Slice<\/span><span class=\"p\">(<\/span><span class=\"n\">idx<\/span> <span class=\"p\">+<\/span> <span class=\"m\">6<\/span><span class=\"p\">).<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&lt;\/name&gt;&#34;<\/span><span class=\"p\">)<\/span> <span class=\"p\">+<\/span> <span class=\"n\">idx<\/span> <span class=\"p\">+<\/span> <span class=\"m\">6<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">res<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">span<\/span><span class=\"p\">.<\/span><span class=\"n\">Slice<\/span><span class=\"p\">(<\/span><span class=\"n\">idx<\/span> <span class=\"p\">+<\/span> <span class=\"m\">6<\/span><span class=\"p\">,<\/span> <span class=\"n\">end<\/span> <span class=\"p\">-<\/span> <span class=\"n\">idx<\/span> <span class=\"p\">-<\/span> <span class=\"m\">6<\/span><span class=\"p\">).<\/span><span class=\"n\">ToString<\/span><span class=\"p\">());<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">span<\/span> <span class=\"p\">=<\/span> <span class=\"n\">span<\/span><span class=\"p\">.<\/span><span class=\"n\">Slice<\/span><span class=\"p\">(<\/span><span class=\"n\">end<\/span> <span class=\"p\">+<\/span> <span class=\"m\">7<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">res<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u6027\u80fd\u6d4b\u8bd5\">\n\u6027\u80fd\u6d4b\u8bd5\n<a href=\"#%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u73b0\u5728\u6211\u4eec\u5c31\u53ef\u4ee5\u6765\u6d4b\u8bd5\u4e00\u4e0b\u8fd9\u51e0\u79cd\u65b9\u5f0f\u7684\u6027\u80fd\u4e86\u3002\u6211\u4eec\u4f7f\u7528 BenchmarkDotNet \u6765\u8fdb\u884c\u6d4b\u8bd5\u3002\u7ed3\u679c\u5982\u4e0b\uff1a<\/p>\n<p><img src=\"https:\/\/s2.loli.net\/2024\/07\/29\/Cg3vUj1eVIFuA9z.png\"\nloading=\"lazy\"\nalt=\"Benchmark \u7ed3\u679c\"\n><\/p>\n<p>\u600e\u4e48\u6837\uff0c\u5927\u5bb6\u9886\u6559\u4e86 <code>Span<\/code> \u7684\u5a01\u529b\u4e86\u5417\uff1f\u5b83\u4e00\u9a91\u7edd\u5c18\uff0c\u5df2\u7ecf\u8fdb\u5165\u7eb3\u79d2\u7684\u5883\u754c\u4e86\u3002\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u7ed3\u8bba\uff1a<\/p>\n<ol>\n<li>\u5982\u679c\u6211\u4eec\u8981\u83b7\u53d6\u7684\u5185\u5bb9\u5e76\u4e0d\u590d\u6742\uff0c\u6211\u4eec\u5b8c\u5168\u53ef\u4ee5\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u6765\u6293\u53d6\u60f3\u8981\u7684\u5185\u5bb9\uff0c\u800c\u4e0d\u662f\u6b7b\u677f\u5730\u89e3\u6790 XML \u6587\u6863<\/li>\n<li>\u5f53\u8f83\u4e3a\u590d\u6742\u65f6\uff0c\u6211\u4eec\u8fd8\u662f\u9700\u8981\u501f\u52a9\u4f20\u7edf\u7684\u65b9\u5f0f\u8fdb\u884c\u8bfb\u53d6\u3002\u5b83\u4eec\u7684\u6027\u80fd\u5173\u7cfb\u4e3a\uff1a<code>XmlReader<\/code> &gt; <code>XDocument<\/code> &gt; <code>XmlDocument<\/code><\/li>\n<li>\u4ece\u5b9e\u7528\u6027\u7684\u89d2\u5ea6\u8003\u8651\uff0c <code>XDocument<\/code> \u6bd4 <code>XmlReader<\/code> \u53ca <code>XmlDocument<\/code> \u90fd\u66f4\u52a0\u5b9e\u7528\uff0c\u901f\u5ea6\u6bd4\u4f20\u7edf\u7684 <code>XmlDocument<\/code> \u5feb\uff0c\u53c8\u5e76\u4e0d\u663e\u8457\u900a\u4e8e <code>XmlReader<\/code>\uff0c\u6240\u4ee5\u5e94\u8be5\u662f\u6211\u4eec\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\u7684\u6700\u4f18\u9009\u9879<\/li>\n<li>\u4f7f\u7528 <code>Span<\/code> \u53ef\u4ee5\u663e\u8457\u4f18\u5316\u6027\u80fd\uff0c\u5c24\u5176\u662f\u6211\u4eec\u9700\u8981\u9891\u7e41\u5bf9\u5b57\u7b26\u4e32\u8fdb\u884c <code>IndexOf<\/code>\u3001<code>SubString<\/code> \u7b49\u64cd\u4f5c\u65f6<\/li>\n<\/ol>"},{"title":"\u4f7f\u7528 AsyncBarrier \u6765\u7b49\u5f85\u5e76\u540c\u6b65\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1","link":"https:\/\/blog.coldwind.top\/posts\/use-asyncbarrier-to-sync-tasks\/","pubDate":"Sun, 11 Aug 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/use-asyncbarrier-to-sync-tasks\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/08\/11\/15IEZJX7fCq4caS.jpg\" alt=\"Featured image of post \u4f7f\u7528 AsyncBarrier \u6765\u7b49\u5f85\u5e76\u540c\u6b65\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\" \/><blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1Gx4y1479f\/\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<p>\u5927\u5bb6\u5728\u505a\u5f02\u6b65\u7f16\u7a0b\u5f00\u53d1\u7684\u65f6\u5019\uff0c\u4e0d\u77e5\u9053\u662f\u5426\u4f1a\u9047\u5230\u8fd9\u6837\u7684\u4e00\u79cd\u60c5\u5f62\uff1a<\/p>\n<p>\u6709\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\uff0c\u8fd9\u4e9b\u4efb\u52a1\u4e4b\u95f4\u6ca1\u6709\u4f9d\u8d56\u5173\u7cfb\uff0c\u4f46\u662f\u6211\u4eec\u9700\u8981\u7b49\u5f85\u6240\u6709\u4efb\u52a1\u90fd\u5b8c\u6210\u540e\u518d\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u64cd\u4f5c\u3002\u6211\u4eec\u552f\u4e00\u77e5\u9053\u7684\uff0c\u5c31\u662f\u8fd9\u4e9b\u4efb\u52a1\u7684\u6570\u91cf\u3002<\/p>\n<p>\u4e3e\u4e2a\u4f8b\u5b50\uff1a\u6211\u4eec\u73b0\u5728\u6709\u4e09\u4e2a IO \u76f8\u5173\u7684\u5f02\u6b65\u4efb\u52a1\u3002\u8fd9\u4e9b\u4efb\u52a1\u7684\u5148\u540e\u987a\u5e8f\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u5e76\u4e14\u8fd9\u4e9b\u4efb\u52a1\u4e5f\u4e0d\u5fc5\u540c\u65f6\u53d1\u8d77\uff0c\u4f46\u662f\u6211\u4eec\u9700\u8981\u7b49\u5f85\u8fd9\u4e09\u4e2a\u4efb\u52a1\u90fd\u5b8c\u6210\u540e\u518d\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u64cd\u4f5c\u3002<\/p>\n<p>\u5bf9\u4e8e\u6700\u666e\u901a\u7684\u7b49\u5f85\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\uff0c\u6211\u4eec\u9996\u5148\u80af\u5b9a\u4f1a\u60f3\u5230\u4f7f\u7528 <code>Task.WhenAll<\/code> \u65b9\u6cd5\u3002\u4f46\u662f <code>Task.WhenAll<\/code> \u73b0\u5728\u5e76\u4e0d\u80fd\u6ee1\u8db3\u6211\u4eec\u7684\u9700\u6c42\uff0c\u56e0\u4e3a\u5b83\u9700\u8981\u80fd\u591f\u7acb\u523b\u83b7\u53d6\u5230\u6240\u6709\u4efb\u52a1\u7684\u96c6\u5408\u3002\u5e76\u4e14\u56e0\u4e3a\u6211\u4eec\u5e0c\u671b\u5728\u6bcf\u4e2a\u5f02\u6b65\u4efb\u52a1\u7684\u4e2d\u95f4\u67d0\u4e2a\u73af\u8282\u53bb\u7b49\u5f85\u5176\u4ed6\u4efb\u52a1\u7684\u5b8c\u6210\uff0c\u800c\u5e76\u4e0d\u662f\u6240\u6709\u5f02\u6b65\u4efb\u52a1\u90fd\u4f1a\u5728\u540c\u4e00\u65f6\u95f4\u70b9\u53d1\u8d77\uff0c\u6240\u4ee5\u8fd9\u5c31\u4ea7\u751f\u4e86\u4e00\u4e2a\u77db\u76fe\u3002<\/p>\n<p>\u8fd9\u65f6\u5019\u5927\u5bb6\u53ef\u80fd\u4f1a\u60f3\u5230\u53e6\u5916\u4e00\u79cd\u66f4\u52a0\u7b80\u5355\u7c97\u66b4\u7684\u65b9\u5f0f\uff1a\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u5c40\u90e8\u5b57\u6bb5 <code>int count<\/code>\uff0c\u7136\u540e\u6bcf\u4e2a\u5f02\u6b65\u4efb\u52a1\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u5c06 <code>count<\/code> \u81ea\u589e\u3002\u5f53 <code>count<\/code> \u7684\u503c\u7b49\u4e8e\u6211\u4eec\u9884\u671f\u7684\u4efb\u52a1\u6570\u91cf\u65f6\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u64cd\u4f5c\u3002\u8fd9\u79cd\u65b9\u5f0f\u867d\u7136\u53ef\u4ee5\u89e3\u51b3\u95ee\u9898\uff0c\u4f46\u662f\u5b9e\u73b0\u8d77\u6765\u6bd4\u8f83\u7e41\u7410\uff0c\u56e0\u4e3a\u6211\u4eec\u8fd8\u9700\u8981\u8003\u8651\u4f7f\u7528\u4ec0\u4e48\u673a\u5236\u6765\u63a7\u5236\u8fd9\u4e9b\u5f02\u6b65\u4efb\u52a1\u5728 <code>count<\/code> \u8fbe\u5230\u9884\u671f\u503c\u65f6\u8fdb\u884c\u540e\u7eed\u64cd\u4f5c\u3002\u6700\u7b80\u5355\u7684\u65b9\u5f0f\u65e0\u7591\u662f\u4f7f\u7528\u8f6e\u8be2\uff0c\u4f46\u8fd9\u663e\u7136\u662f\u4e0d\u591f\u597d\u7684\u3002\u806a\u660e\u4e00\u4e9b\u7684\u65b9\u5f0f\u662f\u4f7f\u7528\u4fe1\u53f7\u91cf\uff0c\u5982 <code>SemaphoreSlim<\/code>\uff0c\u6216\u8005\u5176\u4ed6\u5e93\u63d0\u4f9b\u7684 <code>AsyncAutoResetEvent<\/code> \u7b49\u3002\u5f53\u7136\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u91c7\u7528\u66f4\u52a0\u8f7b\u91cf\u7684 TCS\uff08<code>TaskCompletionSource<\/code>\uff09\u6765\u5b9e\u73b0\u3002\u4f46\u5373\u4fbf\u601d\u8def\u5df2\u7ecf\u6709\u4e86\uff0c\u5b9e\u9645\u5b9e\u73b0\u8d77\u6765\u4f9d\u65e7\u975e\u5e38\u590d\u6742\uff0c\u56e0\u4e3a\u6211\u4eec\u8fd8\u8981\u8003\u8651 <code>count<\/code> \u53d8\u91cf\u7684\u7ebf\u7a0b\u5b89\u5168\u3001\u5f02\u5e38\u5904\u7406\u3001\u53d6\u6d88\u4efb\u52a1\u7b49\u3002<\/p>\n<h2 id=\"\u5f15\u5165-asyncbarrier\">\n\u5f15\u5165 AsyncBarrier\n<a href=\"#%e5%bc%95%e5%85%a5-asyncbarrier\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u65f6\u5019\uff0c<code>AsyncBarrier<\/code> \u5c31\u6d3e\u4e0a\u7528\u573a\u4e86\u3002<code>AsyncBarrier<\/code> \u662f\u4e00\u4e2a\u975e\u5e38\u8f7b\u91cf\u7ea7\u7684\u7c7b\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u7b49\u5f85\u5e76\u540c\u6b65\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\u3002\u8fd9\u4e2a\u7c7b\u662f\u7531 <code>Microsoft.VisualStudio.Threading<\/code> \u63d0\u4f9b\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u6613\u5730\u627e\u5230<a class=\"link\" href=\"https:\/\/github.com\/microsoft\/vs-threading\/blob\/main\/src\/Microsoft.VisualStudio.Threading\/AsyncBarrier.cs\" target=\"_blank\" rel=\"noopener\"\n>\u5b83\u7684\u6e90\u4ee3\u7801<\/a>\u3002<\/p>\n<p>\u5b9e\u9645\u5728\u4f7f\u7528\u65f6\uff0c\u6211\u5e76\u4e0d\u63a8\u8350\u5927\u5bb6\u53bb\u76f4\u63a5\u5c06 <code>Microsoft.VisualStudio.Threading<\/code> \u8fd9\u4e2a\u5e93\u5f15\u5165\u5230\u9879\u76ee\u4e2d\uff0c\u56e0\u4e3a\u8fd9\u4e2a\u5e93\u672c\u8eab\u662f\u4e00\u4e2a\u975e\u5e38\u5e9e\u5927\u7684\u5e93\uff0c\u800c\u4e14\u91cc\u9762\u8fd8\u5305\u542b\u4e86\u4e00\u4e9b\u4ee3\u7801\u5206\u6790\u5668\uff08Code Analyzers\uff09\uff0c\u4f1a\u7ed9\u6211\u4eec\u7684\u9879\u76ee\u6dfb\u52a0\u4e00\u4e9b\u607c\u4eba\u7684\u201c\u6ce2\u6d6a\u7ebf\u201d\u3002\u6240\u4ee5\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u6211\u66f4\u63a8\u8350\u5927\u5bb6\u53bb\u4f7f\u7528 <code>Nito.AsyncEx<\/code> \u8fd9\u4e2a\u5e93\u3002\u4f46\u662f\u5b83\u53c8\u4e0d\u5305\u542b <code>AsyncBarrier<\/code> \u8fd9\u4e2a\u7c7b\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u5c06 <code>AsyncBarrier<\/code> \u7684\u6e90\u4ee3\u7801\u590d\u5236\u5230\u6211\u4eec\u7684\u9879\u76ee\u4e2d\uff0c\u7136\u540e\u7a0d\u4f5c\u4fee\u6539\u5373\u53ef\u3002\u5982\u679c\u4f60\u4e0d\u60f3\u9ebb\u70e6\uff0c\u6211\u4e5f\u63d0\u4f9b\u4e86\u4e00\u4e2a\u5f00\u7bb1\u5373\u7528\u7684\u7248\u672c\uff0c\u5728 <a class=\"link\" href=\"https:\/\/gist.github.com\/BYJRK\/b1b893bb5660cea32326025f49116609\" target=\"_blank\" rel=\"noopener\"\n>GitHub Gist<\/a> \u4e0a\u3002<\/p>\n<p>\u6211\u4eec\u6765\u7b80\u5355\u7406\u89e3\u4e00\u4e0b\u5b83\u7684\u6e90\u4ee3\u7801\u3002\u8fd9\u91cc\u6211\u8282\u9009\u4e86\u4e00\u90e8\u5206\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><span class=\"lnt\">40\n<\/span><span class=\"lnt\">41\n<\/span><span class=\"lnt\">42\n<\/span><span class=\"lnt\">43\n<\/span><span class=\"lnt\">44\n<\/span><span class=\"lnt\">45\n<\/span><span class=\"lnt\">46\n<\/span><span class=\"lnt\">47\n<\/span><span class=\"lnt\">48\n<\/span><span class=\"lnt\">49\n<\/span><span class=\"lnt\">50\n<\/span><span class=\"lnt\">51\n<\/span><span class=\"lnt\">52\n<\/span><span class=\"lnt\">53\n<\/span><span class=\"lnt\">54\n<\/span><span class=\"lnt\">55\n<\/span><span class=\"lnt\">56\n<\/span><span class=\"lnt\">57\n<\/span><span class=\"lnt\">58\n<\/span><span class=\"lnt\">59\n<\/span><span class=\"lnt\">60\n<\/span><span class=\"lnt\">61\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">AsyncBarrier<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">participantCount<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Stack<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Waiter<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">waiters<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">AsyncBarrier<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">participants<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">participants<\/span> <span class=\"p\">&lt;=<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArgumentOutOfRangeException<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">nameof<\/span><span class=\"p\">(<\/span><span class=\"n\">participants<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">$&#34;Argument {nameof(participants)} must be a positive number.&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">participantCount<\/span> <span class=\"p\">=<\/span> <span class=\"n\">participants<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">waiters<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Stack<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Waiter<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">participants<\/span> <span class=\"p\">-<\/span> <span class=\"m\">1<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">ValueTask<\/span> <span class=\"n\">SignalAndWait<\/span><span class=\"p\">(<\/span><span class=\"n\">CancellationToken<\/span> <span class=\"n\">cancellationToken<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">lock<\/span> <span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">waiters<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">waiters<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">+<\/span> <span class=\"m\">1<\/span> <span class=\"p\">==<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">participantCount<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">waiters<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">&gt;<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Waiter<\/span> <span class=\"n\">waiter<\/span> <span class=\"p\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">waiters<\/span><span class=\"p\">.<\/span><span class=\"n\">Pop<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">waiter<\/span><span class=\"p\">.<\/span><span class=\"n\">CompletionSource<\/span><span class=\"p\">.<\/span><span class=\"n\">TrySetResult<\/span><span class=\"p\">(<\/span><span class=\"k\">default<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">waiter<\/span><span class=\"p\">.<\/span><span class=\"n\">CancellationRegistration<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ValueTask<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">cancellationToken<\/span><span class=\"p\">.<\/span><span class=\"n\">IsCancellationRequested<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">?<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">FromCanceled<\/span><span class=\"p\">(<\/span><span class=\"n\">cancellationToken<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">:<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">CompletedTask<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">else<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">TaskCompletionSource<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">EmptyStruct<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">tcs<\/span> <span class=\"p\">=<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">TaskCreationOptions<\/span><span class=\"p\">.<\/span><span class=\"n\">RunContinuationsAsynchronously<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">CancellationTokenRegistration<\/span> <span class=\"n\">ctr<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">cancellationToken<\/span><span class=\"p\">.<\/span><span class=\"n\">CanBeCanceled<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ctr<\/span> <span class=\"p\">=<\/span> <span class=\"n\">cancellationToken<\/span><span class=\"p\">.<\/span><span class=\"n\">Register<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">static<\/span> <span class=\"p\">(<\/span><span class=\"n\">tcs<\/span><span class=\"p\">,<\/span> <span class=\"n\">ct<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">((<\/span><span class=\"n\">TaskCompletionSource<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">EmptyStruct<\/span><span class=\"p\">&gt;)<\/span><span class=\"n\">tcs<\/span><span class=\"p\">!).<\/span><span class=\"n\">TrySetCanceled<\/span><span class=\"p\">(<\/span><span class=\"n\">ct<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">tcs<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">else<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ctr<\/span> <span class=\"p\">=<\/span> <span class=\"k\">default<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">waiters<\/span><span class=\"p\">.<\/span><span class=\"n\">Push<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Waiter<\/span><span class=\"p\">(<\/span><span class=\"n\">tcs<\/span><span class=\"p\">,<\/span> <span class=\"n\">ctr<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ValueTask<\/span><span class=\"p\">(<\/span><span class=\"n\">tcs<\/span><span class=\"p\">.<\/span><span class=\"n\">Task<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u8fd8\u6709\u53e6\u5916\u4e24\u4e2a\u7c7b\u578b <code>Waiter<\/code> \u548c <code>EmptyStruct<\/code>\uff0c\u8fd9\u91cc\u7531\u4e8e\u7bc7\u5e45\u7684\u5173\u7cfb\u5c31\u4e0d\u5c55\u793a\u4e86\u3002\u5b83\u4eec\u505a\u7684\u4e8b\u60c5\u4e5f\u975e\u5e38\u7b80\u5355\uff0c\u524d\u8005\u7528\u4e8e\u5b58\u50a8\u7b49\u5f85\u5668\u7684\u4fe1\u606f\uff0c\u540e\u8005\u5219\u662f\u4e00\u4e2a\u7a7a\u7ed3\u6784\u4f53\uff0c\u7528\u4e8e\u8868\u793a\u4e00\u4e2a\u7a7a\u7684\u5f02\u6b65\u64cd\u4f5c\u3002\u5b83\u4eec\u5e76\u4e0d\u662f\u6211\u4eec\u7684\u91cd\u70b9\uff0c\u6240\u4ee5\u5c31\u4e0d\u5c55\u5f00\u8ba8\u8bba\u4e86\u3002<\/p>\n<p>\u6211\u4eec\u4e0d\u96be\u89c2\u5bdf\u5230\u8fd9\u4e48\u51e0\u70b9\uff1a<\/p>\n<ol>\n<li>\u5b83\u5185\u90e8\u6709\u4e00\u4e2a <code>participantCount<\/code> \u5b57\u6bb5\uff0c\u8868\u793a\u53c2\u4e0e\u8005\u7684\u6570\u91cf\uff1b\u53e6\u5916\u8fd8\u6709\u4e00\u4e2a <code>Stack<\/code>\uff0c\u7528\u6765\u5b58\u50a8\u6240\u6709\u7b49\u5f85\u7684\u53c2\u4e0e\u8005\uff1b<\/li>\n<li>\u5b83\u53ea\u6709\u4e00\u4e2a\u516c\u5f00\u7684\u65b9\u6cd5 <code>SignalAndWait<\/code>\uff0c\u8868\u793a\u8c03\u7528\u8005\u73b0\u5728\u8981\u8fdb\u5165\u7b49\u5f85\u72b6\u6001\u3002\u5728\u8fd9\u4e2a\u65b9\u6cd5\u4e2d\uff1a\n<ul>\n<li>\u9996\u5148\uff0c\u5b83\u4f1a\u5224\u65ad\u5f53\u524d\u7b49\u5f85\u7684\u53c2\u4e0e\u8005\u6570\u91cf\u662f\u5426\u7b49\u4e8e\u9884\u671f\u7684\u53c2\u4e0e\u8005\u6570\u91cf\u3002\u5982\u679c\u662f\uff0c\u90a3\u4e48\u5c31\u5c06\u7b49\u5f85\u5668\u9010\u4e2a\u4ece <code>Stack<\/code> \u4e2d\u5f39\u51fa\u5e76\u5524\u9192\uff1b<\/li>\n<li>\u5982\u679c\u4e0d\u662f\uff0c\u90a3\u4e48\u5c31\u521b\u5efa\u4e00\u4e2a\u65b0\u7684 <code>TaskCompletionSource<\/code>\uff0c\u5e76\u5c06\u5176\u5b58\u5165 <code>Stack<\/code> \u4e2d\uff0c\u7136\u540e\u8fd4\u56de\u8fd9\u4e2a <code>TaskCompletionSource<\/code> \u7684 <code>Task<\/code> \u7ed9\u53c2\u4e0e\u8005\u7528\u4e8e <code>await<\/code>\u3002<\/li>\n<\/ul>\n<\/li>\n<li>\u5f53\u6240\u6709\u53c2\u4e0e\u8005\u90fd\u5230\u9f50\u540e\uff0c<code>SignalAndWait<\/code> \u65b9\u6cd5\u4f1a\u8fd4\u56de\u4e00\u4e2a\u5df2\u5b8c\u6210\u7684 <code>ValueTask<\/code>\uff0c\u8fd9\u65f6\u5019\u6240\u6709\u53c2\u4e0e\u8005\u90fd\u53ef\u4ee5\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u64cd\u4f5c\u3002<\/li>\n<\/ol>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u8fd9\u91cc\u5176\u5b9e\u8fd8\u6709\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff0c\u5c31\u662f <code>Stack<\/code> \u7684\u5bb9\u91cf\u662f <code>participantCount - 1<\/code>\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u5e76\u4e0d\u9700\u8981\u5c06\u6700\u540e\u4e00\u4e2a\u53c2\u4e0e\u8005\u4e5f\u5165\u6808\u3002\u6bd5\u7adf\uff0c\u5f53\u201c\u5012\u6570\u7b2c\u4e00\u201d\u5230\u8fbe\u7ec8\u70b9\u65f6\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5ba3\u544a\u6bd4\u8d5b\u7ed3\u675f\u4e86\u3002<\/div>\n<\/div>\n<h2 id=\"\u4f7f\u7528-asyncbarrier\">\n\u4f7f\u7528 AsyncBarrier\n<a href=\"#%e4%bd%bf%e7%94%a8-asyncbarrier\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u73b0\u5728\u6211\u4eec\u5c31\u53ef\u4ee5\u6765\u7528\u4e00\u7528\u5b83\u4e86\u3002\u6211\u4eec\u8fd9\u91cc\u501f\u52a9 <code>CommunityToolkit.Mvvm<\/code> \u8fd9\u4e2a\u5e93\u6765\u5199\u4e00\u4e2a\u89c6\u56fe\u6a21\u578b\uff08ViewModel\uff09\uff0c\u5927\u81f4\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span> <span class=\"p\">:<\/span> <span class=\"n\">ObservableObject<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">ObservableCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Results<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">AsyncBarrier<\/span> <span class=\"n\">_asyncBarrier<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"m\">3<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [RelayCommand]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">FirstJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">CancellationToken<\/span> <span class=\"n\">token<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"m\">1500<\/span><span class=\"p\">,<\/span> <span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;First job completed. Waiting for async barrier...&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">_asyncBarrier<\/span><span class=\"p\">.<\/span><span class=\"n\">SignalAndWait<\/span><span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;First job completed.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [RelayCommand]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">SecondJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">CancellationToken<\/span> <span class=\"n\">token<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"m\">1500<\/span><span class=\"p\">,<\/span> <span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Second job completed. Waiting for async barrier...&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">_asyncBarrier<\/span><span class=\"p\">.<\/span><span class=\"n\">SignalAndWait<\/span><span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Second job completed.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [RelayCommand]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">ThirdJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">CancellationToken<\/span> <span class=\"n\">token<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"m\">1500<\/span><span class=\"p\">,<\/span> <span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Third job completed. Waiting for async barrier...&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">_asyncBarrier<\/span><span class=\"p\">.<\/span><span class=\"n\">SignalAndWait<\/span><span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Third job completed.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u6211\u4eec\u5b9a\u4e49\u4e86\u4e09\u4e2a\u5f02\u6b65\u65b9\u6cd5 <code>FirstJobAsync<\/code>\u3001<code>SecondJobAsync<\/code> \u548c <code>ThirdJobAsync<\/code>\uff0c\u5b83\u4eec\u5206\u522b\u6a21\u62df\u4e86\u4e09\u4e2a\u5f02\u6b65\u4efb\u52a1\u3002\u8fd9\u4e09\u4e2a\u4efb\u52a1\u4e4b\u95f4\u6ca1\u6709\u4f9d\u8d56\u5173\u7cfb\uff0c\u4f46\u662f\u6211\u4eec\u5e0c\u671b\u5728\u5b83\u4eec\u90fd\u5b8c\u6210\u540e\u518d\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u64cd\u4f5c\u3002\u6211\u4eec\u5728\u7c7b\u4e2d\u58f0\u660e\u4e86\u4e00\u4e2a <code>AsyncBarrier<\/code> \u5b57\u6bb5\uff0c\u7136\u540e\u8ba9\u8fd9\u4e09\u4e2a\u4efb\u52a1\u90fd\u8c03\u7528\u5b83\u7684 <code>SignalAndWait<\/code> \u65b9\u6cd5\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u4fdd\u8bc1\u8fd9\u4e09\u4e2a\u4efb\u52a1\u90fd\u5b8c\u6210\u540e\u624d\u4f1a\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u64cd\u4f5c\u3002<\/p>\n<p>\u5b9e\u9645\u8fd0\u884c\u4ee3\u7801\uff0c\u6211\u4eec\u53ef\u4ee5\u53d1\u73b0\u786e\u5b9e\u8fbe\u5230\u4e86\u6211\u4eec\u60f3\u8981\u5b9e\u73b0\u7684\u6548\u679c\u3002\u8fd9\u4e09\u4e2a\u6309\u94ae\u53ef\u4ee5\u8ba9\u7528\u6237\u4ee5\u4efb\u610f\u7684\u987a\u5e8f\u53ca\u65f6\u95f4\u95f4\u9694\u8fdb\u884c\u70b9\u51fb\uff0c\u5e76\u4e14\u6bcf\u4e2a\u4efb\u52a1\u63a5\u8fd1\u5b8c\u6210\u7684\u65f6\u5019\uff0c\u90fd\u4f1a\u8fdb\u5165\u7b49\u5f85\u72b6\u6001\u3002\u53ea\u6709\u5f53\u6240\u6709\u4efb\u52a1\u90fd\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u624d\u4f1a\u770b\u5230\u6240\u6709\u4efb\u52a1\u90fd\u5df2\u5b8c\u6210\u7684\u63d0\u793a\u3002<\/p>\n<p>\u66f4\u68d2\u7684\u662f\uff0c<code>AsyncBarrier<\/code> \u8fd8\u53ef\u4ee5\u91cd\u590d\u4f7f\u7528\u3002\u6bd5\u7adf\u5b83\u5e95\u5c42\u53ea\u662f\u4e00\u4e2a <code>Stack<\/code>\u3002\u6211\u4eec\u5728\u7b49\u5f85\u65f6\u4f1a\u5165\u6808\uff0c\u7b49\u5f85\u5b8c\u6210\u540e\u4f1a\u51fa\u6808\uff0c\u6700\u7ec8\u4f7f\u5b83\u56de\u5f52\u521d\u59cb\u72b6\u6001\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u754c\u9762\u4e2d\u53cd\u590d\u5b9e\u9a8c\u8fd9\u4e00\u73b0\u8c61\u3002<\/p>\n<h2 id=\"\u53d6\u6d88\u4efb\u52a1\">\n\u53d6\u6d88\u4efb\u52a1\n<a href=\"#%e5%8f%96%e6%b6%88%e4%bb%bb%e5%8a%a1\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u73b0\u5728\u6211\u4eec\u5e0c\u671b\u66f4\u8fdb\u4e00\u6b65\uff0c\u4e3a\u8fd9\u4e9b\u5f02\u6b65\u4efb\u52a1\u6dfb\u52a0\u53d6\u6d88\u529f\u80fd\u3002\u90a3\u4e48\uff0c\u9996\u5148\u6211\u4eec\u53ef\u4ee5\u6dfb\u52a0 <code>InitAllJobs<\/code> \u4e0e <code>FinishJobs<\/code> \u4e24\u4e2a\u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"n\">AsyncBarrier<\/span><span class=\"p\">?<\/span> <span class=\"n\">_asyncBarrier<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[MemberNotNull(nameof(_asyncBarrier))]<\/span> <span class=\"c1\">\/\/ \u63d0\u793a\u7f16\u8bd1\u5668\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u786e\u4fdd _asyncBarrier \u4e0d\u4e3a\u7a7a<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">InitJobs<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_asyncBarrier<\/span> <span class=\"p\">==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_asyncBarrier<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">AsyncBarrier<\/span><span class=\"p\">(<\/span><span class=\"m\">3<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Clear<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">FinishJobs<\/span><span class=\"p\">(<\/span><span class=\"kt\">bool<\/span> <span class=\"n\">success<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_asyncBarrier<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_asyncBarrier<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">success<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;All jobs completed successfully.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">else<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Jobs were canceled.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u5206\u522b\u7528\u4e8e\u521d\u59cb\u5316\u4efb\u52a1\u4e0e\u7ed3\u675f\u4efb\u52a1\u3002\u5728\u521d\u59cb\u5316\u4efb\u52a1\u65f6\uff0c\u6211\u4eec\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684 <code>AsyncBarrier<\/code> \u5b9e\u4f8b\uff0c\u5e76\u6e05\u7a7a <code>Results<\/code> \u96c6\u5408\u3002\u5728\u7ed3\u675f\u4efb\u52a1\u65f6\uff0c\u6211\u4eec\u4f1a\u5c06 <code>AsyncBarrier<\/code> \u5b9e\u4f8b\u7f6e\u7a7a\uff0c\u5e76\u6839\u636e\u662f\u5426\u6210\u529f\u5b8c\u6210\u4efb\u52a1\u6765\u6dfb\u52a0\u63d0\u793a\u4fe1\u606f\u3002<\/p>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u8fd9\u5176\u5b9e\u4e5f\u662f\u6211\u6bd4\u8f83\u63a8\u8350\u7684\u4f7f\u7528 <code>AsyncBarrier<\/code> \u7684\u65b9\u5f0f\u3002\u867d\u7136\u6211\u4eec\u524d\u9762\u8bf4\u4e86\uff0c\u5b83\u53ef\u4ee5\u88ab\u91cd\u590d\u4f7f\u7528\u3002\u4f46\u662f\u89c2\u5bdf\u5b83\u7684\u6e90\u4ee3\u7801\u4f1a\u53d1\u73b0\uff0c\u5b83\u975e\u5e38\u8f7b\u91cf\uff0c\u4e5f\u4e0d\u9700\u8981\u62c5\u5fc3\u8d44\u6e90\u91ca\u653e\u7684\u95ee\u9898\uff0c\u56e0\u4e3a\u6211\u4eec\u5927\u53ef\u4ee5\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u5b9e\u4f8b\u5316\u4e00\u4e2a\u65b0\u7684\u51fa\u6765\u3002\u6bd5\u7adf\u8fd9\u6837\u8fd8\u6709\u4e00\u4e2a\u597d\u5904\uff0c\u5c31\u662f\u6bcf\u6b21\u6211\u4eec\u90fd\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u53bb\u8c03\u6574\u5b83\u7684 <code>participantCount<\/code>\u3002<\/div>\n<\/div>\n<p>\u63a5\u4e0b\u6765\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6bcf\u4e2a\u5f02\u6b65\u4efb\u52a1\u4e2d\u6dfb\u52a0\u53d6\u6d88\u903b\u8f91\u3002\u4ee5 <code>FirstJobAsync<\/code> \u4e3a\u4f8b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"na\">[RelayCommand]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">FirstJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">CancellationToken<\/span> <span class=\"n\">token<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">InitJobs<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">try<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"m\">1200<\/span><span class=\"p\">,<\/span> <span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;First job completed. Waiting for async barrier...&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">_asyncBarrier<\/span><span class=\"p\">.<\/span><span class=\"n\">SignalAndWait<\/span><span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">FinishJobs<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">TaskCanceledException<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Results<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;First job was canceled.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">FinishJobs<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u7684\u5927\u81f4\u601d\u8def\u662f\uff1a<\/p>\n<ol>\n<li>\u9996\u5148\u4f1a\u8c03\u7528 <code>InitJobs<\/code> \u65b9\u6cd5\uff0c\u521d\u59cb\u5316\u4efb\u52a1\u3002\u8fd9\u91cc\u6bcf\u4e2a\u5f02\u6b65\u65b9\u6cd5\u90fd\u4f1a\u5c1d\u8bd5\u53bb\u521d\u59cb\u5316\uff0c\u4f46\u53ea\u6709\u7b2c\u4e00\u4e2a\uff08\u5373 <code>AsyncBarrier<\/code> \u5b57\u6bb5\u4e3a\u7a7a\u65f6\uff09\u662f\u6709\u6548\u7684\uff1b<\/li>\n<li>\u5728\u5f02\u6b65\u4efb\u52a1\u4e2d\u4f7f\u7528 <code>try-catch<\/code> \u5757\uff0c\u6355\u83b7 <code>TaskCanceledException<\/code> \u5f02\u5e38\u3002\u56e0\u4e3a\u5982\u679c\u6211\u4eec\u60f3\u8981\u53d6\u6d88\u4efb\u52a1\uff0c\u90a3\u4e48\u8fd9\u4e2a\u5f02\u6b65\u4efb\u52a1\u4e2d\u7684 <code>Task.Delay<\/code> \u4ee5\u53ca <code>AsyncBarrier.SignalAndWait<\/code> \u90fd\u4f1a\u629b\u51fa\u8fd9\u4e2a\u5f02\u5e38\uff1b<\/li>\n<li>\u5f53\u5f02\u6b65\u4efb\u52a1\u5b8c\u6210\u65f6\uff0c\u4f1a\u8c03\u7528 <code>FinishJobs<\/code> \u65b9\u6cd5\uff0c\u7ed3\u675f\u4efb\u52a1\u3002\u5e76\u4e14\u8fd9\u91cc\u7c7b\u4f3c <code>InitJobs<\/code>\uff0c\u53ea\u6709\u7b2c\u4e00\u4e2a\u5f02\u6b65\u4efb\u52a1\u4f1a\u6709\u6548\u8c03\u7528\u3002<\/li>\n<\/ol>\n<p>\u7136\u540e\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u4e00\u4e2a <code>RelayCommand<\/code>\uff0c\u7528\u6765\u5b9e\u73b0\u53d6\u6d88\u529f\u80fd\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"na\">[RelayCommand]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">CancelAllJobs<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">FirstJobCommand<\/span><span class=\"p\">.<\/span><span class=\"n\">IsRunning<\/span><span class=\"p\">)<\/span> <span class=\"n\">FirstJobCommand<\/span><span class=\"p\">.<\/span><span class=\"n\">Cancel<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">SecondJobCommand<\/span><span class=\"p\">.<\/span><span class=\"n\">IsRunning<\/span><span class=\"p\">)<\/span> <span class=\"n\">SecondJobCommand<\/span><span class=\"p\">.<\/span><span class=\"n\">Cancel<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">ThirdJobCommand<\/span><span class=\"p\">.<\/span><span class=\"n\">IsRunning<\/span><span class=\"p\">)<\/span> <span class=\"n\">ThirdJobCommand<\/span><span class=\"p\">.<\/span><span class=\"n\">Cancel<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u5b9e\u73b0\u4e86\u60f3\u8981\u7684\u6548\u679c\u4e86\u3002\u6b64\u65f6\uff0c\u6211\u4eec\u5728 XAML \u4e2d\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Window.DataContext&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;local:MainViewModel<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/Window.DataContext&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;DockPanel<\/span> <span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;DockPanel<\/span> <span class=\"na\">DockPanel.Dock=<\/span><span class=\"s\">&#34;Bottom&#34;<\/span> <span class=\"na\">LastChildFill=<\/span><span class=\"s\">&#34;False&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Job1&#34;<\/span> <span class=\"na\">Command=<\/span><span class=\"s\">&#34;{Binding FirstJobCommand}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Job2&#34;<\/span> <span class=\"na\">Command=<\/span><span class=\"s\">&#34;{Binding SecondJobCommand}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Job3&#34;<\/span> <span class=\"na\">Command=<\/span><span class=\"s\">&#34;{Binding ThirdJobCommand}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Cancel&#34;<\/span> <span class=\"na\">Command=<\/span><span class=\"s\">&#34;{Binding CancelAllJobsCommand}&#34;<\/span> <span class=\"na\">DockPanel.Dock=<\/span><span class=\"s\">&#34;Right&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/DockPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ListBox<\/span> <span class=\"na\">ItemsSource=<\/span><span class=\"s\">&#34;{Binding Results}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/DockPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u5b9e\u4e0a\u9762\u7684\u6545\u4e8b\u8fd8\u6ca1\u6709\u7ed3\u675f\uff0c\u56e0\u4e3a\u5b9e\u9645\u8fd0\u884c\u540e\u4f1a\u53d1\u73b0\uff0c<code>Cancel<\/code> \u6309\u94ae\u5728\u4efb\u4f55\u65f6\u5019\u90fd\u662f\u53ef\u7528\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u6b63\u786e\u5904\u7406\u5b83\u7684 ICommand \u7684 <code>CanExecute<\/code> \u65b9\u6cd5\u3002\u8fd9\u91cc\u6211\u5c31\u4e0d\u5c55\u5f00\u8bb2\u4e86\uff0c\u6211\u5728\u89c6\u9891\u4e2d\u6709\u8be6\u7ec6\u8bb2\u89e3\uff0c\u5927\u5bb6\u53ef\u4ee5\u5728\u6587\u7ae0\u5f00\u5934\u627e\u5230\u76f8\u5e94\u7684\u89c6\u9891\u94fe\u63a5\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>AsyncBarrier<\/code> \u662f\u4e00\u4e2a\u975e\u5e38\u8f7b\u91cf\u7ea7\u7684\u7c7b\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u7b49\u5f85\u5e76\u540c\u6b65\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\u3002\u5b83\u7684\u5b9e\u73b0\u975e\u5e38\u7b80\u5355\uff0c\u4f46\u662f\u5374\u975e\u5e38\u5b9e\u7528\u3002\u6211\u4eec\u53ef\u4ee5\u5728\u5f02\u6b65\u4efb\u52a1\u4e2d\u4f7f\u7528\u5b83\uff0c\u6765\u4fdd\u8bc1\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\u90fd\u5b8c\u6210\u540e\u518d\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u64cd\u4f5c\u3002\u540c\u65f6\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u5728\u5f02\u6b65\u4efb\u52a1\u4e2d\u6dfb\u52a0\u53d6\u6d88\u903b\u8f91\uff0c\u6765\u4fdd\u8bc1\u4efb\u52a1\u7684\u53ef\u9760\u6027\u3002<\/p>\n<p>\u5927\u5bb6\u5982\u679c\u6709\u8fd9\u6837\u7684\u9700\u6c42\uff0c\u4e0d\u59a8\u53bb\u8bd5\u4e00\u4e0b\u8fd9\u4e2a\u7c7b\uff0c\u76f8\u4fe1\u4e00\u5b9a\u53ef\u4ee5\u5e2e\u4e0a\u5fd9\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u501f\u6b64\u5b66\u4e60\u5fae\u8f6f\u5b98\u65b9\u7684\u6e90\u4ee3\u7801\uff0c\u4e86\u89e3\u4e00\u4e0b\u5b83\u7684\u5b9e\u73b0\u7ec6\u8282\u3002\u8fd9\u5bf9\u6211\u4eec\u63d0\u5347\u7f16\u7a0b\u80fd\u529b\u4e5f\u662f\u975e\u5e38\u6709\u5e2e\u52a9\u7684\u3002<\/p>"},{"title":"C# \u5b57\u7b26\u4e32\u64cd\u4f5c\u5b9e\u7528\u6280\u5de7\u53ca\u65b0\u624b\u6613\u72af\u9519\u8bef","link":"https:\/\/blog.coldwind.top\/posts\/csharp-string-tips-tricks\/","pubDate":"Sat, 27 Jul 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/csharp-string-tips-tricks\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/07\/29\/nzM6Ya8AJDZNlhi.jpg\" alt=\"Featured image of post C# \u5b57\u7b26\u4e32\u64cd\u4f5c\u5b9e\u7528\u6280\u5de7\u53ca\u65b0\u624b\u6613\u72af\u9519\u8bef\" \/><blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1mx4y1x7JR\/\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<p>C# \u4e3a\u5b57\u7b26\u4e32\u76f8\u5173\u7684\u64cd\u4f5c\u63d0\u4f9b\u4e86\u5f88\u591a\u5b9e\u7528\u7684\u7c7b\uff0c\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li><code>string<\/code><\/li>\n<li><code>StringBuilder<\/code><\/li>\n<li><code>Encoding<\/code><\/li>\n<li><code>Regex<\/code><\/li>\n<\/ul>\n<p>\u5b83\u4eec\u7684\u529f\u80fd\u76f8\u5f53\u5f3a\u5927\uff0c\u4f46\u8fd9\u4e5f\u5bfc\u81f4\u4e86\u6211\u4eec\u53ef\u80fd\u5e76\u4e0d\u8db3\u591f\u4e86\u89e3\u5b83\uff0c\u5bfc\u81f4\u6211\u4eec\u53ef\u80fd\u5e76\u4e0d\u719f\u6089\u67d0\u4e9b\u65b9\u6cd5\u7684\u91cd\u8f7d\uff0c\u6216\u8005\u4e0d\u77e5\u9053\u67d0\u4e9b\u65b9\u6cd5\u7684\u6027\u80fd\u95ee\u9898\uff0c\u6700\u7ec8\u5bfc\u81f4\u6211\u4eec\u7684\u4ee3\u7801\u6548\u7387\u4f4e\u4e0b\uff08\u800c\u4e14\u6211\u4eec\u8fd8\u5e38\u5e38\u5bdf\u89c9\u4e0d\u5230\uff09\u3002\u8fd9\u7bc7\u6587\u7ae0\u6211\u5c06\u4e3a\u5927\u5bb6\u4ecb\u7ecd\u4e00\u4e9b C# \u5b57\u7b26\u4e32\u64cd\u4f5c\u7684\u5b9e\u7528\u6280\u5de7\u548c\u6613\u72af\u9519\u8bef\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u5927\u5bb6\u66f4\u597d\u5730\u4f7f\u7528\u5b57\u7b26\u4e32\u3002<\/p>\n<h2 id=\"\u5728\u53ef\u4ee5\u4f7f\u7528\u5b57\u7b26\u7684\u65f6\u5019\u4e0d\u8981\u4f7f\u7528\u5b57\u7b26\u4e32\">\n\u5728\u53ef\u4ee5\u4f7f\u7528\u5b57\u7b26\u7684\u65f6\u5019\u4e0d\u8981\u4f7f\u7528\u5b57\u7b26\u4e32\n<a href=\"#%e5%9c%a8%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8%e5%ad%97%e7%ac%a6%e7%9a%84%e6%97%b6%e5%80%99%e4%b8%8d%e8%a6%81%e4%bd%bf%e7%94%a8%e5%ad%97%e7%ac%a6%e4%b8%b2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 C# \u4e2d\uff0c\u58f0\u660e\u4e00\u4e2a\u5b57\u7b26\u4e0e\u5b57\u7b26\u4e32\uff0c\u6709\u4e00\u4e2a\u5f88\u5178\u578b\u7684\u533a\u522b\uff0c\u5c31\u662f\u4f7f\u7528\u5355\u5f15\u53f7\u548c\u53cc\u5f15\u53f7\u3002\u9664\u6b64\u4e4b\u5916\uff0c\u5b83\u4eec\u4e8c\u8005\u4e5f\u662f\u533a\u522b\u5f88\u5927\u7684\u3002\u5b57\u7b26\u4e32\u53d8\u91cf\u5b9e\u9645\u4e0a\u662f\u5728\u5806\u4e0a\u5206\u914d\u4e86\u4e00\u5757\u5185\u5b58\u7a7a\u95f4\uff0c\u8fd9\u4e2a\u7a7a\u95f4\u7528\u6765\u5b58\u50a8\u5b57\u7b26\u4e32\u7684\u5185\u5bb9\u3002\u800c\u5b57\u7b26\u5219\u662f\u503c\u7c7b\u578b\uff0c\u5b83\u5b58\u50a8\u5728\u6808\u4e0a\uff0c\u6240\u4ee5\u5b83\u7684\u6027\u80fd\u8981\u6bd4\u5b57\u7b26\u4e32\u8981\u597d\u5f88\u591a\u3002\u6240\u4ee5\u7edd\u5bf9\u4e0d\u80fd\u628a\u5b57\u7b26\u7b80\u5355\u7406\u89e3\u4e3a\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32\uff0c\u5b83\u4eec\u662f\u5b8c\u5168\u4e0d\u540c\u7684\u4e24\u79cd\u7c7b\u578b\uff0c\u6548\u7387\u4e5f\u662f\u5f88\u4e0d\u76f8\u540c\u7684\u3002<\/p>\n<p>\u5728 C# \u4e2d\u4f7f\u7528 <code>string<\/code> \u7c7b\u578b\u7684\u67d0\u4e9b\u65b9\u6cd5\u65f6\uff0c\u6211\u4eec\u5c31\u6709\u673a\u4f1a\u4f7f\u7528\u5b57\u7b26\u800c\u4e0d\u662f\u5b57\u7b26\u4e32\uff0c\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">str<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Hello, World!&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">StartsWith<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;H&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">EndsWith<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;!&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Contains<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;o&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;o&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Split<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;,&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e9b\u65b9\u6cd5\u90fd\u6709\u91cd\u8f7d\uff0c\u53ef\u4ee5\u63a5\u53d7\u5b57\u7b26\u4f5c\u4e3a\u53c2\u6570\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u5b57\u7b26\u800c\u4e0d\u662f\u5b57\u7b26\u4e32\uff0c\u8fd9\u6837\u53ef\u4ee5\u63d0\u9ad8\u4ee3\u7801\u7684\u6027\u80fd\u3002<\/p>\n<p>\u4e3a\u4ec0\u4e48\u8981\u8fd9\u4e48\u505a\u5462\uff1f\u9664\u4e86\u4e0a\u9762\u63d0\u5230\u7684\u5f15\u7528\u7c7b\u578b\u548c\u503c\u7c7b\u578b\u7684\u533a\u522b\u4ee5\u5916\uff0c\u5b83\u4eec\u8fd8\u6709\u5176\u4ed6\u4e00\u4e9b\u533a\u522b\u3002\u4ee5 <code>Contains<\/code> \u4e3a\u4f8b\uff0c\u5927\u5bb6\u53ef\u4ee5\u60f3\u8c61\u4e00\u4e0b\u8fd9\u4e2a\u65b9\u6cd5\u5728\u5e95\u5c42\u662f\u5982\u4f55\u5b9e\u73b0\u7684\u3002\u6bd4\u5982\u5e95\u5c42\u53ef\u80fd\u4f1a\u662f\u4e00\u4e2a\u4e8c\u5c42\u5faa\u73af\uff0c\u7b2c\u4e00\u5c42\u5faa\u73af\u904d\u5386\u5b57\u7b26\u4e32\u7684\u6bcf\u4e00\u4e2a\u5b57\u7b26\uff0c\u7b2c\u4e8c\u5c42\u5faa\u73af\u5219\u5728\u5339\u914d\u5230\u7b2c\u4e00\u4e2a\u5b57\u7b26\u540e\uff0c\u518d\u904d\u5386\u540e\u9762\u7684\u5b57\u7b26\uff0c\u770b\u662f\u5426\u548c\u6211\u4eec\u8981\u67e5\u627e\u7684\u5b50\u5b57\u7b26\u4e32\u76f8\u540c\u3002<\/p>\n<p>\u4e3a\u4e86\u4fdd\u8bc1\u7b97\u6cd5\u7684\u901a\u7528\u6027\uff0c\u5373\u4fbf\u6211\u4eec\u4f20\u5165\u7684\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a 1\uff0c\u5e95\u5c42\u4e5f\u4f1a\u628a\u5b83\u5f53\u505a\u4e00\u4e2a\u5b57\u7b26\u4e32\u6765\u5904\u7406\u3002\u8fd9\u5bf9\u5e94\u5230 JIT \u7f16\u8bd1\u540e\u7684\u673a\u5668\u7801\uff0c\u5c31\u4f1a\u6709\u4e00\u4e9b\u989d\u5916\u7684\u5f00\u9500\uff0c\u6bd4\u5982\u5224\u65ad\u5faa\u73af\u7684\u8df3\u51fa\u6761\u4ef6\uff0c\u4ee5\u53ca\u8df3\u8f6c\u7b49\u3002\u800c\u5982\u679c\u6211\u4eec\u4f20\u5165\u7684\u662f\u5b57\u7b26\uff0c\u90a3\u4e48\u5e95\u5c42\u5c31\u53ef\u4ee5\u76f4\u63a5\u6bd4\u8f83\u5355\u4e2a\u5b57\u7b26\u7684\u503c\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u51cf\u5c11\u4e00\u4e9b\u989d\u5916\u7684\u5f00\u9500\u3002<\/p>\n<h2 id=\"\u4f7f\u7528\u65b9\u6cd5\u7684\u91cd\u8f7d\u51cf\u5c11\u4e0d\u5fc5\u8981\u7684\u8c03\u7528\">\n\u4f7f\u7528\u65b9\u6cd5\u7684\u91cd\u8f7d\uff0c\u51cf\u5c11\u4e0d\u5fc5\u8981\u7684\u8c03\u7528\n<a href=\"#%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%e7%9a%84%e9%87%8d%e8%bd%bd%e5%87%8f%e5%b0%91%e4%b8%8d%e5%bf%85%e8%a6%81%e7%9a%84%e8%b0%83%e7%94%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5b57\u7b26\u4e32\u7c7b\u7684\u5f88\u591a\u65b9\u6cd5\u90fd\u5305\u542b\u4e86\u5927\u91cf\u7684\u91cd\u8f7d\u3002\u6b63\u786e\u4f7f\u7528\u8fd9\u4e9b\u91cd\u8f7d\uff0c\u6709\u5229\u4e8e\u6211\u4eec\u51cf\u5c11\u4e00\u4e9b\u989d\u5916\u7684\u8c03\u7528\uff0c\u4ee5\u53ca\u6240\u9020\u6210\u7684\u8d44\u6e90\u6d6a\u8d39\u3002\u6bd4\u5982\u4e0b\u9762\u51e0\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">str<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34; Hello, World,, Good, Morning &#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8fd9\u91cc\u6211\u4eec\u5e0c\u671b\u5c06\u4e0a\u9762\u7684\u5185\u5bb9\u6309\u7167\u9017\u53f7\u5206\u5272\uff0c\u5e76\u53bb\u9664\u7a7a\u5b57\u7b26\u4e32<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6b63\u786e\u7684\u505a\u6cd5\u662f\u4f7f\u7528\u4e0b\u9762\u8fd9\u4e2a Split \u65b9\u6cd5\u7684\u91cd\u8f7d<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">slices<\/span> <span class=\"p\">=<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Split<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;,&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">StringSplitOptions<\/span><span class=\"p\">.<\/span><span class=\"n\">RemoveEmptyEntries<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/\u5047\u5982\u6211\u4eec\u4e0d\u77e5\u9053\u8fd9\u4e2a\u91cd\u8f7d\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u5199\u51fa\u4e0b\u9762\u8fd9\u6837\u7684\u4ee3\u7801<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">slices<\/span> <span class=\"p\">=<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Split<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;,&#39;<\/span><span class=\"p\">).<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">!<\/span><span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">IsNullOrEmpty<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">)).<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8fd8\u6bd4\u5982\u6211\u4eec\u5e0c\u671b\u53bb\u9664\u6bcf\u4e2a\u5b57\u7b26\u4e32\u7684\u524d\u540e\u7a7a\u683c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6b63\u786e\u7684\u505a\u6cd5\u662f\u4f7f\u7528\u4e0b\u9762\u8fd9\u4e2a Split \u65b9\u6cd5\u7684\u91cd\u8f7d<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">slices<\/span> <span class=\"p\">=<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Split<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;,&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">StringSplitOptions<\/span><span class=\"p\">.<\/span><span class=\"n\">TrimEntries<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u540c\u6837\u5730\uff0c\u5047\u5982\u6211\u4eec\u4e0d\u77e5\u9053\u8fd9\u4e2a\u91cd\u8f7d\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u5199\u51fa\u4e0b\u9762\u8fd9\u6837\u7684\u4ee3\u7801<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">slices<\/span> <span class=\"p\">=<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Split<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;,&#39;<\/span><span class=\"p\">).<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">s<\/span><span class=\"p\">.<\/span><span class=\"n\">Trim<\/span><span class=\"p\">()).<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6bcf\u4e00\u6b21\u5bf9\u5b57\u7b26\u4e32\u7c7b\u578b\u8c03\u7528\u5b83\u7684\u5e38\u89c1\u65b9\u6cd5\uff0c\u90fd\u4f1a\u4ea7\u751f\u989d\u5916\u7684\u5f00\u9500\u3002<\/p>\n<p>\u6211\u4eec\u518d\u6765\u770b\u53e6\u5916\u4e00\u4e2a\u4f8b\u5b50\uff1a\u6bd4\u8f83\u4e24\u4e2a\u5b57\u7b26\u4e32\u662f\u5426\u76f8\u540c\u3002\u5982\u679c\u6211\u4eec\u60f3\u8981\u5ffd\u7565\u5927\u5c0f\u5199\u8fdb\u884c\u6bd4\u8f83\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u5199\u51fa\u8fd9\u6837\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">s1<\/span><span class=\"p\">.<\/span><span class=\"n\">ToLower<\/span><span class=\"p\">()<\/span> <span class=\"p\">==<\/span> <span class=\"n\">s2<\/span><span class=\"p\">.<\/span><span class=\"n\">ToLower<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u662f\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u6709\u6548\u7387\u663e\u8457\u9ad8\u4e8e\u4e0a\u9762\u8fd9\u79cd\u65b9\u5f0f\u7684\u65b9\u6cd5 <code>Equals<\/code>\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">s1<\/span><span class=\"p\">.<\/span><span class=\"n\">Equals<\/span><span class=\"p\">(<\/span><span class=\"n\">s2<\/span><span class=\"p\">,<\/span> <span class=\"n\">StringComparison<\/span><span class=\"p\">.<\/span><span class=\"n\">OrdinalIgnoreCase<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u662f\u7684\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u4e5f\u62e5\u6709\u4e00\u4e9b\u91cd\u8f7d\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u907f\u514d\u521b\u5efa\u4e24\u4e2a\u65b0\u7684\u5b57\u7b26\u4e32\uff0c\u4ee5\u53ca\u989d\u5916\u7684\u6bd4\u8f83\u64cd\u4f5c\u3002<\/p>\n<h2 id=\"string-\u7c7b\u7684\u6784\u9020\u51fd\u6570\">\nstring \u7c7b\u7684\u6784\u9020\u51fd\u6570\n<a href=\"#string-%e7%b1%bb%e7%9a%84%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u76f8\u4fe1\u5927\u591a\u6570\u65b0\u624b\u53ef\u80fd\u58f0\u660e\u5b57\u7b26\u4e32\u7684\u65b9\u5f0f\u90fd\u662f\u76f4\u63a5\u4f7f\u7528\u53cc\u5f15\u53f7\uff0c\u6216\u8005\u5bf9\u5176\u4ed6\u5b57\u7b26\u4e32\u8c03\u7528\u4e00\u4e9b\u65b9\u6cd5\u800c\u5f97\u5230\uff0c\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">str<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Hello, World!&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">str2<\/span> <span class=\"p\">=<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Substring<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">str3<\/span> <span class=\"p\">=<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;,&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34; &#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u5b9e\u9645\u4e0a\uff0c<code>string<\/code> \u7c7b\u8fd8\u6709\u4e00\u4e9b\u6784\u9020\u51fd\u6570\uff0c\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u66f4\u597d\u5730\u521b\u5efa\u5b57\u7b26\u4e32\u3002\u76f8\u4fe1\u7528\u8fc7 Python \u7684\u90fd\u77e5\u9053\uff0c\u5982\u679c\u6211\u4eec\u60f3\u5728\u63a7\u5236\u53f0\u8f93\u51fa\u4e00\u4e2a\u957f\u5ea6\u4e3a 20 \u4e2a\u7b49\u53f7\u7684\u5206\u9694\u7b26\uff0c\u901a\u5e38\u6211\u4eec\u7684\u505a\u6cd5\u662f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-python\" data-lang=\"python\"><span class=\"line\"><span class=\"cl\"><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;=&#39;<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">20<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u5b9e\u5728 C# \u4e2d\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u7c7b\u4f3c\u7684\u6548\u679c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">sep<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">string<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;=&#39;<\/span><span class=\"p\">,<\/span> <span class=\"m\">20<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">sep<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u9664\u6b64\u4e4b\u5916\uff0c\u5982\u679c\u6211\u4eec\u6709\u4e00\u4e2a\u5b57\u7b26\u6570\u7ec4\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528 <code>string<\/code> \u7c7b\u7684\u6784\u9020\u51fd\u6570\u6765\u521b\u5efa\u5b57\u7b26\u4e32\u3002\u8fd9\u4e2a\u6280\u5de7\u4e00\u822c\u7528\u4e0d\u5230\uff0c\u53ef\u4e00\u65e6\u6211\u4eec\u6709\u4e86\u4e00\u4e2a\u9700\u8981\u8f6c\u4e3a\u5b57\u7b26\u4e32\u7684\u5b57\u7b26\u6570\u7ec4\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u5c31\u4f1a\u663e\u5f97\u975e\u5e38\u6709\u7528\u3002\u4e00\u4e2a\u5178\u578b\u7684\u4f8b\u5b50\u662f\uff0c\u5982\u679c\u6211\u4eec\u60f3\u7ffb\u8f6c\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u90a3\u4e48\u5728\u4e0d\u501f\u52a9 <code>Span<\/code> \u6216 <code>unsafe<\/code> \u7684\u60c5\u51b5\u4e0b\uff0c\u6548\u7387\u6700\u9ad8\u7684\u65b9\u5f0f\u4e3a\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">char<\/span><span class=\"p\">[]<\/span> <span class=\"n\">chars<\/span> <span class=\"p\">=<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">ToCharArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Array<\/span><span class=\"p\">.<\/span><span class=\"n\">Reverse<\/span><span class=\"p\">(<\/span><span class=\"n\">chars<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">reversed<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">string<\/span><span class=\"p\">(<\/span><span class=\"n\">chars<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u4e0d\u77e5\u9053\u5b57\u7b26\u4e32\u7684\u6784\u9020\u51fd\u6570\u7684\u7528\u6cd5\uff0c\u53ef\u80fd\u5c31\u4f1a\u5199\u51fa\u4e0b\u9762\u7684\u4ee3\u7801\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">reversed<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Join<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Reverse<\/span><span class=\"p\">());<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5f53\u7136\u4e86\uff0c\u6211\u4eec\u6c38\u8fdc\u53ef\u4ee5\u5199\u51fa\u66f4\u52a0\u8fa3\u773c\u775b\u7684\u4ee3\u7801\uff0c\u4e0d\u662f\u5417\uff1f<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ string reversed = new string(str.Reverse().ToArray());<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">char<\/span><span class=\"p\">[]<\/span> <span class=\"n\">chars<\/span> <span class=\"p\">=<\/span> <span class=\"n\">str<\/span><span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">c<\/span><span class=\"p\">).<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">chars<\/span> <span class=\"p\">=<\/span> <span class=\"n\">chars<\/span><span class=\"p\">.<\/span><span class=\"n\">Reverse<\/span><span class=\"p\">().<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">reversed<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Join<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">chars<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u4e0e\u64cd\u4f5c\u7cfb\u7edf\u6709\u5173\u7684\u4e00\u4e9b\u65b9\u6cd5\">\n\u4e0e\u64cd\u4f5c\u7cfb\u7edf\u6709\u5173\u7684\u4e00\u4e9b\u65b9\u6cd5\n<a href=\"#%e4%b8%8e%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e6%9c%89%e5%85%b3%e7%9a%84%e4%b8%80%e4%ba%9b%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u7531\u4e8e Windows \u4e0e Unix \u7cfb\u7edf\u7684\u4e00\u4e9b\u533a\u522b\uff0c\u5bfc\u81f4\u4e86\u4e24\u4e2a\u65f6\u4e0d\u5e38\u4f1a\u8ba9\u6211\u4eec\u611f\u5230\u75db\u82e6\u7684\u4e8b\u60c5\uff1a\u6362\u884c\u7b26\u548c\u8def\u5f84\u5206\u9694\u7b26\u3002\u5728 Windows \u7cfb\u7edf\u4e2d\uff0c\u6362\u884c\u7b26\u4e3a <code>\\r\\n<\/code>\uff08CRLF\uff09\uff0c\u800c\u5728 Unix \u7cfb\u7edf\u4e2d\uff0c\u6362\u884c\u7b26\u4e3a <code>\\n<\/code>\uff08LF\uff09\u3002\u800c\u8def\u5f84\u5206\u9694\u7b26\u5728 Windows \u7cfb\u7edf\u4e2d\u4e3a <code>\\<\/code>\uff0c\u800c\u5728 Unix \u7cfb\u7edf\u4e2d\u4e3a <code>\/<\/code>\u3002<\/p>\n<p>\u5728\u9762\u5bf9\u8fd9\u4e9b\u95ee\u9898\u65f6\uff0c\u6211\u4eec\u5176\u5b9e\u662f\u6709\u4e00\u4e9b\u6280\u5de7\u7684\u3002\u6bd4\u5982\u5904\u7406\u8def\u5f84\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>Path<\/code> \u7c7b\uff0c\u5b83\u4f1a\u6839\u636e\u5f53\u524d\u64cd\u4f5c\u7cfb\u7edf\u7684\u4e0d\u540c\uff0c\u8fd4\u56de\u4e0d\u540c\u7684\u8def\u5f84\u5206\u9694\u7b26\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">folder<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;MyFolder&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">subfolder<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;MySubFolder\/&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">filename<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;MyFile.txt&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">path<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Path<\/span><span class=\"p\">.<\/span><span class=\"n\">Combine<\/span><span class=\"p\">(<\/span><span class=\"n\">folder<\/span><span class=\"p\">,<\/span> <span class=\"n\">subfolder<\/span><span class=\"p\">,<\/span> <span class=\"n\">filename<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u65b9\u6cd5\u4e0d\u4ec5\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5904\u7406\u8def\u5f84\u5206\u9694\u7b26\uff0c\u8fd8\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5904\u7406\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u4ee5\u53ca\u8def\u5f84\u7684\u89c4\u8303\u5316\u3002\u6bd4\u5982\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c<code>subfolder<\/code> \u672b\u5c3e\u591a\u4e86\u4e00\u4e2a <code>\/<\/code>\uff0c\u4f46\u662f <code>Path.Combine<\/code> \u65b9\u6cd5\u4f1a\u81ea\u52a8\u5e2e\u6211\u4eec\u53bb\u9664\u8fd9\u4e2a\u591a\u4f59\u7684 <code>\/<\/code>\u3002<\/p>\n<p>\u7c7b\u4f3c\u5730\uff0c\u9762\u5bf9\u6362\u884c\u7b26\u7684\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>Environment.NewLine<\/code> \u6765\u83b7\u53d6\u5f53\u524d\u64cd\u4f5c\u7cfb\u7edf\u7684\u6362\u884c\u7b26\u3002\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u65b9\u5f0f\u62fc\u63a5\u4e00\u4e2a\u591a\u884c\u5b57\u7b26\u4e32\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">lines<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">string<\/span><span class=\"p\">[]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;Hello, World!&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;Good, Morning!&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">text<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Join<\/span><span class=\"p\">(<\/span><span class=\"n\">Environment<\/span><span class=\"p\">.<\/span><span class=\"n\">NewLine<\/span><span class=\"p\">,<\/span> <span class=\"n\">lines<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u7c7b\u4f3c <code>Environment.NewLine<\/code> \u8fd9\u6837\u7684\u5c5e\u6027\uff0c\u6211\u4eec\u8fd8\u6709 <code>Path.DirectorySeparatorChar<\/code>\u3001<code>Path.PathSeparator<\/code> \u7b49\uff0c\u5b83\u4eec\u90fd\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5904\u7406\u4e00\u4e9b\u4e0e\u64cd\u4f5c\u7cfb\u7edf\u6709\u5173\u7684\u95ee\u9898\u3002<\/div>\n<\/div>\n<p>\u4e0d\u4ec5\u5982\u6b64\uff0c.NET 6 \u8fd8\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a\u65b0\u65b9\u6cd5\uff1a<code>ReplaceLineEndings<\/code>\u3002\u8fd9\u4e2a\u65b9\u6cd5\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5c06\u5b57\u7b26\u4e32\u4e2d\u7684\u6362\u884c\u7b26\u7edf\u4e00\u4e3a\u5f53\u524d\u64cd\u4f5c\u7cfb\u7edf\u7684\u6362\u884c\u7b26\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">text<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Hello, World!\\r\\nGood morning!\\nGood night!&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u5219\u9ed8\u8ba4\u5c06\u6362\u884c\u7b26\u66ff\u6362\u4e3a\u5f53\u524d\u64cd\u4f5c\u7cfb\u7edf\u7684\u6362\u884c\u7b26<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">normalized<\/span> <span class=\"p\">=<\/span> <span class=\"n\">text<\/span><span class=\"p\">.<\/span><span class=\"n\">ReplaceLineEndings<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5982\u679c\u4f20\u5165\u53c2\u6570\uff0c\u5219\u5c06\u6362\u884c\u7b26\u66ff\u6362\u4e3a\u6307\u5b9a\u7684\u6362\u884c\u7b26<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">normalized<\/span> <span class=\"p\">=<\/span> <span class=\"n\">text<\/span><span class=\"p\">.<\/span><span class=\"n\">ReplaceLineEndings<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\\n&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">normalized<\/span> <span class=\"p\">=<\/span> <span class=\"n\">text<\/span><span class=\"p\">.<\/span><span class=\"n\">ReplaceLineEndings<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\\t&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u5b9e\u5f88\u591a\u65f6\u5019\uff0c\u6211\u4eec\u6839\u672c\u4e0d\u9700\u8981\u663e\u5f0f\u5730\u4e0e\u6362\u884c\u7b26\u6253\u4ea4\u9053\u3002\u56e0\u4e3a .NET \u7684\u5f88\u591a\u65b9\u6cd5\u90fd\u4f1a\u81ea\u52a8\u5e2e\u6211\u4eec\u5904\u7406\u8fd9\u4e9b\u95ee\u9898\uff0c\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">lines<\/span> <span class=\"p\">=<\/span> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadAllLines<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;file.txt&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteAllLines<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;file.txt&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">lines<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;...&#34;<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u5728\u63a7\u5236\u53f0\u8f93\u51fa\u6587\u672c\uff0c\u5e76\u81ea\u52a8\u6362\u884c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadLine<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u8bfb\u53d6\u7528\u6237\u8f93\u5165\uff0c\u5e76\u81ea\u52a8\u5904\u7406\u6362\u884c\u7b26<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sb<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StringBuilder<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">AppendLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7b49\u7b49\u3002\u8fd9\u4e9b\u65b9\u6cd5\u7684\u540d\u79f0\u4e2d\u90fd\u4f1a\u5305\u542b <code>Line<\/code> \u8fd9\u4e2a\u5355\u8bcd\uff0c\u5927\u52a0\u53ef\u4ee5\u591a\u591a\u7559\u610f\u3002<\/p>\n<h2 id=\"stringbuilder-\u7684\u4e00\u4e9b\u6280\u5de7\">\nStringBuilder \u7684\u4e00\u4e9b\u6280\u5de7\n<a href=\"#stringbuilder-%e7%9a%84%e4%b8%80%e4%ba%9b%e6%8a%80%e5%b7%a7\" class=\"anchor\">&para;<\/a>\n<\/h2><p><code>StringBuilder<\/code> \u53ef\u80fd\u662f\u4e00\u4e2a\u5bf9\u4e8e\u5927\u5bb6\u6765\u8bf4\uff0c\u65e2\u719f\u6089\u53c8\u964c\u751f\u7684\u7c7b\u3002\u719f\u6089\u662f\u56e0\u4e3a\u6211\u4eec\u5728\u5904\u7406\u5927\u91cf\u5b57\u7b26\u4e32\u62fc\u63a5\u65f6\uff0c\u90fd\u4f1a\u7528\u5230\u5b83\uff0c\u964c\u751f\u662f\u56e0\u4e3a\u6211\u4eec\u53ef\u80fd\u5e76\u4e0d\u4e86\u89e3\u5b83\u7684\u6240\u6709\u529f\u80fd\u3002\u8fd9\u91cc\u6211\u5c31\u4e0d\u591a\u8d58\u8ff0\u4e86\uff0c\u6211\u7528\u4e00\u5c0f\u6bb5\u4ee3\u7801\u6765\u5c55\u793a <code>StringBuilder<\/code> \u7684\u4e00\u4e9b\u6280\u5de7\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sb<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StringBuilder<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6dfb\u52a0\u5b57\u7b26\u4e32<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">AppendLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Hello, World!&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">AppendFormat<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Hello, {0}!&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;World&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;H&#39;<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u6dfb\u52a0 5 \u4e2a &#39;H&#39;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">Insert<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Hello, &#34;<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u5728\u6307\u5b9a\u4f4d\u7f6e\u63d2\u5165\u5b57\u7b26\u4e32<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">Replace<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Hello&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Good&#34;<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u66ff\u6362\u5b57\u7b26\u4e32<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">Remove<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u5220\u9664\u6307\u5b9a\u4f4d\u7f6e\u7684\u5b57\u7b26\u4e32<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">Clear<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u6e05\u7a7a StringBuilder<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u5c06 StringBuilder \u8f6c\u4e3a\u5b57\u7b26\u4e32<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u5c06 StringBuilder \u7684\u4e00\u90e8\u5206\u8f6c\u4e3a\u5b57\u7b26\u4e32<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6ca1\u60f3\u5230\u5427\uff0c\u8fde\u5b83\u7684 <code>ToString<\/code> \u65b9\u6cd5\u90fd\u5305\u542b\u4e00\u4e2a\u7c7b\u4f3c <code>SubString<\/code> \u7684\u91cd\u8f7d\uff0c\u65b9\u4fbf\u6211\u4eec\u51cf\u5c11\u4e00\u6b21\u4e0d\u5fc5\u8981\u7684\u5185\u5b58\u5f00\u9500\u3002<\/p>\n<h2 id=\"\u62e5\u62b1\u8bed\u6cd5\u7cd6\u4f7f\u7528\u5b57\u7b26\u4e32\u5185\u63d2\">\n\u62e5\u62b1\u8bed\u6cd5\u7cd6\uff0c\u4f7f\u7528\u5b57\u7b26\u4e32\u5185\u63d2\n<a href=\"#%e6%8b%a5%e6%8a%b1%e8%af%ad%e6%b3%95%e7%b3%96%e4%bd%bf%e7%94%a8%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%86%85%e6%8f%92\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 C# 6 \u4e2d\uff0c\u6211\u4eec\u8fce\u6765\u4e86\u5b57\u7b26\u4e32\u5185\u63d2\uff08String interpolation\uff09\u8fd9\u4e2a\u8bed\u6cd5\u7cd6\u3002\u8fd9\u4e2a\u8bed\u6cd5\u7cd6\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u66f4\u52a0\u65b9\u4fbf\u5730\u62fc\u63a5\u5b57\u7b26\u4e32\uff0c\u800c\u4e14\u8fd8\u53ef\u4ee5\u5728\u5b57\u7b26\u4e32\u4e2d\u63d2\u5165\u8868\u8fbe\u5f0f\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;World&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">18<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">str<\/span> <span class=\"p\">=<\/span> <span class=\"s\">$&#34;Hello, {name}! You are {age} years old.&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5728\u4ee5\u524d\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u5199\u51fa\u4e0b\u9762\u8fd9\u6837\u7684\u4ee3\u7801<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">str<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Format<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Hello, {0}! You are {1} years old.&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">age<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5b9e\u9645\u4e0a\uff0c\u8fd9\u4e2a\u8bed\u6cd5\u7cd6\u7684\u4f5c\u7528\u8fdc\u4e0d\u6b62\u4e8e\u6b64\uff0c\u5b83\u7684\u6027\u80fd\u662f\u9ad8\u4e8e <code>string.Format<\/code> \u7684\u3002\u751a\u81f3\u56e0\u4e3a\u5b83\u6027\u80fd\u7684\u63d0\u5347\uff0c\u6211\u4eec\u5728\u4f7f\u7528 <code>StringBuilder<\/code> \u65f6\uff0c\u90fd\u53ef\u4ee5\u8003\u8651\u4f7f\u7528\u5b57\u7b26\u4e32\u5185\u63d2\u6765\u4ee3\u66ff <code>AppendFormat<\/code>\u3002\u4e0d\u8fc7\uff0c\u5bf9\u4e8e\u8fd9\u79cd\u60c5\u5f62\uff0c\u6027\u80fd\u6700\u9ad8\u7684\u65b9\u5f0f\u662f\u8fde\u7eed\u4f7f\u7528 <code>Append<\/code> \u65b9\u6cd5\uff0c\u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">id<\/span> <span class=\"p\">=<\/span> <span class=\"m\">123<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;World&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">age<\/span> <span class=\"p\">=<\/span> <span class=\"m\">18<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">sb<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StringBuilder<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f7f\u7528 AppendFormat<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">AppendFormat<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;ID: {0}, Name: {1}, Age: {2}&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">age<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f7f\u7528\u5b57\u7b26\u4e32\u5185\u63d2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;ID: {id}, Name: {name}, Age: {age}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f7f\u7528\u8fde\u7eed\u7684 Append \u65b9\u6cd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">sb<\/span><span class=\"p\">.<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;ID: &#34;<\/span><span class=\"p\">).<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">).<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;, Name: &#34;<\/span><span class=\"p\">).<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"p\">).<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;, Age: &#34;<\/span><span class=\"p\">).<\/span><span class=\"n\">Append<\/span><span class=\"p\">(<\/span><span class=\"n\">age<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9664\u6b64\u4e4b\u5916\uff0c\u5b57\u7b26\u4e32\u8fd8\u6709\u5f88\u591a\u6280\u5de7\uff0c\u6bd4\u5982\uff1a<\/p>\n<ol>\n<li>\u539f\u59cb\u5b57\u7b26\u4e32\uff08Raw string\uff09<\/li>\n<li><code>StringPool<\/code> \u4e0e <code>string.Intern<\/code><\/li>\n<li><code>Span&lt;char&gt;<\/code><\/li>\n<li>\u6587\u672c\u7f16\u7801\uff08<code>Encoding<\/code>\uff09<\/li>\n<li>\u4e00\u4e9b\u4e0e\u5b57\u7b26\u4e32\u6709\u5173\u7684\u7279\u6027<\/li>\n<\/ol>\n<p>\u4f46\u662f\u56e0\u4e3a\u7bc7\u5e45\u7684\u5173\u7cfb\uff0c\u6211\u4eec\u8fd9\u6b21\u5c31\u4e0d\u5c55\u5f00\u4e86\u3002\u5e0c\u671b\u5927\u5bb6\u80fd\u591f\u901a\u8fc7\u8fd9\u7bc7\u6587\u7ae0\uff0c\u4e86\u89e3\u5230\u4e00\u4e9b C# \u5b57\u7b26\u4e32\u64cd\u4f5c\u7684\u5b9e\u7528\u6280\u5de7\u548c\u6613\u72af\u9519\u8bef\u3002\u5e0c\u671b\u5927\u5bb6\u5728\u4ee5\u540e\u7684\u5f00\u53d1\u4e2d\uff0c\u80fd\u591f\u66f4\u52a0\u719f\u7ec3\u5730\u4f7f\u7528\u5b57\u7b26\u4e32\uff0c\u5199\u51fa\u66f4\u52a0\u9ad8\u6548\u7684\u4ee3\u7801\u3002<\/p>"},{"title":"\u5982\u4f55\u8bfb\u5199 INI \u914d\u7f6e\u6587\u4ef6\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/deal-with-ini-file\/","pubDate":"Thu, 11 Jul 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/deal-with-ini-file\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/07\/11\/QyFiMdrfNPKpazT.jpg\" alt=\"Featured image of post \u5982\u4f55\u8bfb\u5199 INI \u914d\u7f6e\u6587\u4ef6\uff1f\" \/><p>INI \u6587\u4ef6\u662f\u4e00\u79cd\u76f8\u5f53\u53e4\u8001\u7684\u914d\u7f6e\u6587\u4ef6\u683c\u5f0f\uff0c\u4f46\u5f88\u201c\u53ef\u60dc\u201d\u7684\u662f\uff0c\u5b83\u5982\u4eca\u4f9d\u65e7\u88ab\u5e7f\u6cdb\u4f7f\u7528\u3002\u6b63\u56e0\u4e3a\u5982\u6b64\uff0c\u5373\u4fbf\u73b0\u5728\u5df2\u7ecf\u51fa\u73b0\u4e86\u5f88\u591a\u66f4\u52a0\u73b0\u4ee3\u5316\u7684\u914d\u7f6e\u6587\u4ef6\u683c\u5f0f\uff08\u6bd4\u5982 JSON\u3001YAML\u3001TOML \u7b49\uff09\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u80fd\u4f1a\u9047\u5230\u8bfb\u5199 INI \u6587\u4ef6\u7684\u60c5\u5f62\u3002\u90a3\u4e48\u8fd9\u6b21\u6211\u4eec\u5c31\u6765\u770b\u770b\u5982\u4f55\u5728 C# \u4e2d\u8bfb\u5199 INI \u6587\u4ef6\u3002<\/p>\n<h2 id=\"ini-\u6587\u4ef6\u683c\u5f0f\u6982\u8ff0\">\nINI \u6587\u4ef6\u683c\u5f0f\u6982\u8ff0\n<a href=\"#ini-%e6%96%87%e4%bb%b6%e6%a0%bc%e5%bc%8f%e6%a6%82%e8%bf%b0\" class=\"anchor\">&para;<\/a>\n<\/h2><p>INI \u6587\u4ef6\u662f\u4e00\u79cd\u6587\u672c\u6587\u4ef6\uff0c\u5b83\u7531\u4e00\u7cfb\u5217\u7684\u8282\uff08Section\uff09\u548c\u952e\u503c\u5bf9\uff08Key-value pair\uff09\u7ec4\u6210\u3002\u6bcf\u4e2a\u952e\u503c\u5bf9\u90fd\u4f4d\u4e8e\u67d0\u4e2a\u8282\u4e2d\uff0c\u952e\u548c\u503c\u4f4d\u4e8e\u7b49\u53f7\uff08<code>=<\/code>\uff09\u5de6\u53f3\uff0c\u800c\u8282\u5219\u7531\u65b9\u62ec\u53f7\uff08<code>[]<\/code>\uff09\u62ec\u8d77\u6765\u3002\u4e00\u4e2a\u7b80\u5355\u7684 INI \u6587\u4ef6\u770b\u8d77\u6765\u53ef\u80fd\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-ini\" data-lang=\"ini\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">[Section1]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">Key1<\/span><span class=\"o\">=<\/span><span class=\"s\">Value1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">Key2<\/span><span class=\"o\">=<\/span><span class=\"s\">Value2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">[Section2]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">Key3<\/span><span class=\"o\">=<\/span><span class=\"s\">Value3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">Key4<\/span><span class=\"o\">=<\/span><span class=\"s\">Value4<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6b64\u5916\uff0cINI \u6587\u4ef6\u8fd8\u652f\u6301\u6ce8\u91ca\uff0c\u901a\u5e38\u4ee5\u5206\u53f7\uff08<code>;<\/code>\uff09\u5f00\u5934\uff08\u6709\u65f6\u4e5f\u53ef\u4ee5\u81ea\u5b9a\u4e49\u4e3a\u5176\u4ed6\u7b26\u53f7\uff0c\u6bd4\u5982 <code>#<\/code> \u7b49\uff09\uff0c\u76f4\u5230\u884c\u5c3e\u4e3a\u6b62\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-ini\" data-lang=\"ini\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">[Section1]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">Key1<\/span><span class=\"o\">=<\/span><span class=\"s\">Value1 ; \u8fd9\u662f\u4e00\u4e2a\u6ce8\u91ca<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>INI \u6587\u4ef6\u7684\u683c\u5f0f\u8981\u6c42\u57fa\u672c\u5c31\u662f\u8fd9\u6837\u4e86\u3002\u5176\u4ed6\u53ef\u80fd\u8fd8\u6709\u4e00\u4e9b\u8bf8\u5982\u547d\u540d\u4e60\u60ef\uff0c\u4ee5\u53ca\u7b49\u53f7\u5de6\u53f3\u662f\u5426\u6dfb\u52a0\u7a7a\u683c\u7b49\u7ec6\u8282\uff0c\u4f46\u8fd9\u4e9b\u901a\u5e38\u90fd\u662f\u6ca1\u6709\u5177\u4f53\u7ea6\u675f\u7684\u3002<\/p>\n<p>\u4e0d\u96be\u53d1\u73b0\uff0cINI \u56e0\u4e3a\u683c\u5f0f\u6781\u5176\u7b80\u5355\uff0c\u6240\u4ee5\u5b83\u7684\u89e3\u6790\u4e5f\u662f\u76f8\u5f53\u5bb9\u6613\u7684\uff0c\u6211\u4eec\u7a0d\u52a0\u601d\u8003\uff0c\u901a\u5e38\u5c31\u53ef\u4ee5\u5199\u51fa\u4e00\u4e2a\u7b80\u5355\u7684\u89e3\u6790\u5668\u3002\u4f46\u662f\uff0c\u65e2\u7136\u5df2\u7ecf\u6709\u73b0\u6210\u7684\u89e3\u6790\u5e93\uff0c\u6211\u4eec\u5f53\u7136\u4e0d\u5fc5\u81ea\u5df1\u91cd\u590d\u9020\u8f6e\u5b50\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u5c31\u6765\u770b\u770b\u5728 C# \u4e2d\u5982\u4f55\u8bfb\u5199 INI \u6587\u4ef6\u3002<\/p>\n<h2 id=\"\u4f20\u7edf\u65b9\u6cd5\u4f7f\u7528-win32-api\">\n\u4f20\u7edf\u65b9\u6cd5\uff1a\u4f7f\u7528 Win32 API\n<a href=\"#%e4%bc%a0%e7%bb%9f%e6%96%b9%e6%b3%95%e4%bd%bf%e7%94%a8-win32-api\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u76f8\u4fe1\u5927\u5bb6\u53ea\u8981\u5728\u7f51\u4e0a\u641c\u7d22\u8fc7\u8fd9\u4e2a\u95ee\u9898\uff0c\u5c31\u4e00\u5b9a\u4f1a\u770b\u5230\u6709\u4eba\u63a8\u8350\u4f7f\u7528 Win32 API \u6765\u8bfb\u5199 INI \u6587\u4ef6\u3002\u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u7b80\u5355\u3001\u9ad8\u6548\uff0c\u4f46\u7f3a\u70b9\u4e5f\u5f88\u660e\u663e\uff1a\u5b83\u662f\u4e0d\u8de8\u5e73\u53f0\u7684\u3002\u5982\u679c\u4f60\u7684\u7a0b\u5e8f\u9700\u8981\u5728 Linux \u6216 macOS \u4e0a\u8fd0\u884c\uff0c\u90a3\u4e48\u8fd9\u79cd\u65b9\u6cd5\u5c31\u4e0d\u9002\u7528\u4e86\u3002<\/p>\n<p>INI \u6587\u4ef6\u7684\u8bfb\u5199\u64cd\u4f5c\u5728 Windows \u5e73\u53f0\u4e0a\u6709\u4e13\u95e8\u7684 API \u652f\u6301\uff0c\u8fd9\u4e9b API \u4f4d\u4e8e <code>kernel32.dll<\/code> \u4e2d\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 P\/Invoke \u7684\u65b9\u5f0f\u8c03\u7528\u8fd9\u4e9b API\uff0c\u5b9e\u73b0\u5bf9 INI \u6587\u4ef6\u7684\u8bfb\u5199\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Runtime.InteropServices<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[DllImport(&#34;kernel32&#34;)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">extern<\/span> <span class=\"kt\">long<\/span> <span class=\"n\">WritePrivateProfileString<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">section<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">key<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">val<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">filePath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[DllImport(&#34;kernel32&#34;)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">extern<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">GetPrivateProfileString<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">section<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">key<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">def<\/span><span class=\"p\">,<\/span> <span class=\"n\">StringBuilder<\/span> <span class=\"n\">retVal<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">size<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">filePath<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">IniReadValue<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">Section<\/span><span class=\"p\">,<\/span><span class=\"kt\">string<\/span> <span class=\"n\">Key<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">StringBuilder<\/span> <span class=\"n\">temp<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StringBuilder<\/span><span class=\"p\">(<\/span><span class=\"m\">256<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"n\">GetPrivateProfileString<\/span><span class=\"p\">(<\/span><span class=\"n\">Section<\/span><span class=\"p\">,<\/span><span class=\"n\">Key<\/span><span class=\"p\">,<\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">,<\/span><span class=\"n\">temp<\/span><span class=\"p\">,<\/span> <span class=\"m\">256<\/span><span class=\"p\">,<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">temp<\/span><span class=\"p\">.<\/span><span class=\"n\">ToString<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u53ea\u9700\u8981\u4ece <code>kernel32.dll<\/code> \u4e2d\u5bfc\u5165 <code>WritePrivateProfileString<\/code> \u548c <code>GetPrivateProfileString<\/code> \u4e24\u4e2a\u51fd\u6570\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u5bf9\u4e8e INI \u6587\u4ef6\u7684\u8bfb\u5199\u64cd\u4f5c\u4e86\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u8fd8\u4f1a\u989d\u5916\u5199\u4e00\u4e2a <code>IniReadValue<\/code> \u65b9\u6cd5\u6765\u5305\u88c5 <code>GetPrivateProfileString<\/code> \u51fd\u6570\uff0c\u4ee5\u4fbf\u66f4\u52a0\u65b9\u4fbf\u5730\u8bfb\u53d6\u952e\u503c\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u9664\u4e86\u4e0a\u9762\u7684\u4e24\u4e2a\u65b9\u6cd5\uff0c<code>kernel32.dll<\/code> \u4e2d\u8fd8\u6709\u4e00\u4e9b\u5176\u4ed6\u7684\u51fd\u6570\uff0c\u6bd4\u5982 <code>GetPrivateProfileSection<\/code>\u3001<code>GetPrivateProfileSectionNames<\/code> \u7b49\uff0c\u5b83\u4eec\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u66f4\u52a0\u65b9\u4fbf\u5730\u64cd\u4f5c INI \u6587\u4ef6\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u67e5\u9605\u76f8\u5173\u6587\u6863\u3002<\/div>\n<\/div>\n<p>\u4f46\u662f\u5927\u5bb6\u5728\u4f7f\u7528\u8fd9\u4e2a\u5e93\u7684\u65f6\u5019\uff0c\u4e0d\u77e5\u9053\u4f1a\u4e0d\u4f1a\u6709\u4e00\u79cd\u4eff\u4f5b\u201c\u9ad8\u5c04\u70ae\u6253\u868a\u5b50\u201d\u4e00\u6837\u7684\u5fc3\u60c5\uff1f\u6bd5\u7adf INI \u8fd9\u4e48\u7b80\u5355\u7684\u4e00\u79cd\u683c\u5f0f\uff0c\u5c45\u7136\u8981\u4f7f\u7528\u5230 P\/Invoke \u6765\u8c03\u7528 Win32 API\uff0c\u8fd9\u672a\u514d\u4e5f\u592a\u9ebb\u70e6\u4e86\u3002\u6240\u4ee5\uff0c\u8fd9\u79cd\u4f20\u7edf\u65b9\u5f0f\u5b58\u5728\u4ee5\u4e0b\u95ee\u9898\uff1a<\/p>\n<ol>\n<li>\u4f7f\u7528\u4f53\u9a8c\u5dee\uff1a\u9700\u8981\u901a\u8fc7 P\/Invoke \u6765\u8c03\u7528 Win32 API\uff0c\u8fd9\u5bf9\u4e8e C# \u5f00\u53d1\u8005\u6765\u8bf4\u5e76\u4e0d\u662f\u4e00\u79cd\u53cb\u597d\u7684\u4f53\u9a8c\u3002<\/li>\n<li>\u4e0d\u8de8\u5e73\u53f0\uff1a\u8fd9\u79cd\u65b9\u6cd5\u53ea\u80fd\u5728 Windows \u5e73\u53f0\u4e0a\u4f7f\u7528\uff0c\u65e0\u6cd5\u5728 Linux \u6216 macOS \u4e0a\u8fd0\u884c\u3002<\/li>\n<li>\u7ebf\u7a0b\u4e0d\u5b89\u5168\uff1a\u7531\u4e8e\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u51fd\u6570\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4f1a\u64cd\u4f5c\u5916\u90e8\u6587\u4ef6\uff0c\u6240\u4ee5\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e0b\u53ef\u80fd\u4f1a\u51fa\u73b0\u95ee\u9898\u3002<\/li>\n<li>\u65f6\u95f4\u590d\u6742\u5ea6\u9ad8\uff1a\u5047\u5982\u6211\u4eec\u60f3\u8981\u8bfb\u53d6 INI \u6587\u4ef6\u4e2d\u7684\u591a\u4e2a\u952e\u503c\u5bf9\uff0c\u90a3\u4e48\u5c31\u9700\u8981\u591a\u6b21\u8c03\u7528 <code>GetPrivateProfileString<\/code> \u51fd\u6570\uff0c\u800c\u6bcf\u6b21\u8c03\u7528\u90fd\u9700\u8981\u4ece\u6587\u4ef6\u5f00\u5934\u5f00\u59cb\u8bfb\u53d6\uff0c\u76f4\u5230\u627e\u5230\u5bf9\u5e94\u7684\u952e\u503c\u5bf9\u3002\u8fd9\u6837\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u663e\u7136\u662f\u4e0d\u591f\u7406\u60f3\u7684\u3002<\/li>\n<li>\u6587\u672c\u7f16\u7801\uff1a\u8fd9\u79cd\u65b9\u6cd5\u53ea\u4f1a\u4f7f\u7528\u7cfb\u7edf\u9ed8\u8ba4\u7684\u6587\u672c\u7f16\u7801\uff08\u6bd4\u5982\u4e2d\u6587\u64cd\u4f5c\u7cfb\u7edf\u7684 ANSI \u5bf9\u5e94 GBK \u7f16\u7801\uff09\uff0c\u65e0\u6cd5\u6307\u5b9a\u5176\u4ed6\u7f16\u7801\uff0c\u56e0\u6b64\u975e ASCII \u5b57\u7b26\u53ef\u80fd\u4f1a\u51fa\u73b0\u4e71\u7801\u3002<\/li>\n<\/ol>\n<p>\u6240\u4ee5\u4e0b\u9762\u6211\u4eec\u518d\u4ecb\u7ecd\u51e0\u4e2a\u522b\u7684\u5e93\u3002\u4f46\u662f\u5927\u5bb6\u4e5f\u4e0d\u8981\u9ad8\u5174\u592a\u65e9\uff0c\u56e0\u4e3a\u8fd9\u4e9b\u5e93\u867d\u7136\u5404\u6709\u4f18\u70b9\uff0c\u4f46\u4e5f\u6709\u5404\u81ea\u7684\u95ee\u9898\u3002<\/p>\n<h2 id=\"\u7b2c\u4e09\u65b9\u5e93ini-parser\">\n\u7b2c\u4e09\u65b9\u5e93\uff1aIni-Parser\n<a href=\"#%e7%ac%ac%e4%b8%89%e6%96%b9%e5%ba%93ini-parser\" class=\"anchor\">&para;<\/a>\n<\/h2><p><a class=\"link\" href=\"https:\/\/github.com\/rickyah\/ini-parser\" target=\"_blank\" rel=\"noopener\"\n>ini-parser<\/a> \u662f\u4e00\u6b3e\u975e\u5e38\u597d\u7528\u7684 INI \u6587\u4ef6\u89e3\u6790\u5e93\u3002\u5b83\u53ef\u4ee5\u4e00\u6b21\u6027\u5c06\u6574\u4e2a INI \u6587\u4ef6\u89e3\u6790\u4e3a\u4e00\u4e2a <code>IniData<\/code> \u5bf9\u8c61\uff08\u53ef\u4ee5\u60f3\u8c61\u6210\u4e00\u4e2a\u5b57\u5178\uff09\uff0c\u4ece\u800c\u65b9\u4fbf\u6211\u4eec\u50cf\u64cd\u4f5c\u5b57\u5178\u90a3\u6837\u4fbf\u6377\u53c8\u9ad8\u6548\u5730\u8fdb\u884c\u9ad8\u9891\u7387\u7684\u8bfb\u5199\u64cd\u4f5c\uff0c\u5e76\u5728\u6700\u540e\u7edf\u4e00\u5199\u56de\u6587\u4ef6\u3002<\/p>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u5927\u5bb6\u5728 NuGet \u4e2d\u641c\u7d22 <code>ini-parser<\/code> \u65f6\uff0c\u8fd8\u4f1a\u53d1\u73b0 <code>ini-parser-netstandard<\/code> \u8fd9\u4e2a\u5e93\u3002\u8fd9\u4e24\u4e2a\u5e93\u7684\u529f\u80fd\u662f\u4e00\u6837\u7684\uff0c\u53ea\u662f\u524d\u8005\u662f .NET Framework\u7684\uff0c\u800c\u540e\u8005\u5219\u662f .NET Standard 2.0 \u7684\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 .NET Core\u3001.NET 5+ \u53ca\u8de8\u5e73\u53f0\u73af\u5883\u4e2d\u4f7f\u7528\uff0c\u751a\u81f3\u8fd8\u53ef\u4ee5\u7528\u4e8e Unity \u6e38\u620f\u5f00\u53d1\u3002\u63a8\u8350\u5927\u5bb6\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u90fd\u4f7f\u7528\u540e\u8005\u3002<\/div>\n<\/div>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">IniParser<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">parser<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileIniDataParser<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">IniData<\/span> <span class=\"n\">data<\/span> <span class=\"p\">=<\/span> <span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadFile<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;config.ini&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8bfb\u53d6\u952e\u503c\u5bf9<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">value1<\/span> <span class=\"p\">=<\/span> <span class=\"n\">data<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">][<\/span><span class=\"s\">&#34;Key1&#34;<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">value2<\/span> <span class=\"p\">=<\/span> <span class=\"n\">data<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">][<\/span><span class=\"s\">&#34;Key2&#34;<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4fee\u6539\u952e\u503c\u5bf9<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">data<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">][<\/span><span class=\"s\">&#34;Key1&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;NewValue1&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">data<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">][<\/span><span class=\"s\">&#34;Key2&#34;<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;NewValue2&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5199\u56de\u6587\u4ef6<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteFile<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;config.ini&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u9664\u6b64\u4e4b\u5916\uff0c\u5b83\u8fd8\u652f\u6301\u66f4\u591a\u529f\u80fd\uff0c\u6bd4\u5982\u5408\u5e76\u591a\u4e2a INI \u6587\u4ef6\u7b49\u3002\u5927\u5bb6\u53ef\u4ee5\u67e5\u770b\u5b98\u65b9\u6587\u6863\u6765\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\u3002<\/p>\n<p>\u4f46\u662f\uff0c\u8fd9\u4e2a\u5e93\u6709\u4e00\u4e2a\u975e\u5e38\u660e\u663e\u7684\u9650\u5236\uff1a\u867d\u7136\u5b83\u4e00\u6b21\u6027\u8bfb\u53d6\u4e86\u6574\u4e2a INI \u6587\u4ef6\uff0c\u4f7f\u5f97\u6211\u4eec\u5728\u9700\u8981\u9891\u7e41\u8bfb\u5199\u65f6\u66f4\u52a0\u9ad8\u6548\u3002\u4f46\u662f\u5f53\u6587\u4ef6\u8f83\u5927\u65f6\uff0c\u4e00\u6b21\u6027\u8bfb\u53d6\u6574\u4e2a\u6587\u4ef6\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5360\u7528\u66f4\u5927\u7684\u5185\u5b58\uff1b\u4e0d\u4ec5\u5982\u6b64\uff0c\u5982\u679c\u6211\u4eec\u7684\u9700\u6c42\u4ec5\u4ec5\u662f\u4e34\u65f6\u8bfb\u5199\u67d0\u4e00\u9879\u914d\u7f6e\uff0c\u90a3\u4e48\u8fd9\u79cd\u4e00\u6b21\u6027\u8bfb\u53d6\u6574\u4e2a\u6587\u4ef6\u7684\u65b9\u5f0f\u663e\u7136\u662f\u4e0d\u591f\u9ad8\u6548\u7684\u3002<\/p>\n<p>\u6240\u4ee5\u8fd9\u91cc\u518d\u548c\u5927\u5bb6\u63a8\u8350\u53e6\u5916\u4e00\u4e2a\u5e93\u3002<\/p>\n<h2 id=\"\u7b2c\u4e09\u65b9\u5e93inisharp\">\n\u7b2c\u4e09\u65b9\u5e93\uff1aIniSharp\n<a href=\"#%e7%ac%ac%e4%b8%89%e6%96%b9%e5%ba%93inisharp\" class=\"anchor\">&para;<\/a>\n<\/h2><p><a class=\"link\" href=\"https:\/\/github.com\/kevinlae\/IniSharp\" target=\"_blank\" rel=\"noopener\"\n>IniSharp<\/a> \u771f\u662f\u4e00\u4e2a\u4e0d\u9519\u7684\u540d\u5b57\u3002\u8fd9\u4e2a\u5e93\u63d0\u4f9b\u4e86\u4fbf\u6377\u7684\u64cd\u4f5c INI \u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5e76\u4e14\u4e0d\u4f9d\u8d56 Win32 API\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u8de8\u5e73\u53f0\u73af\u5883\u4e0b\u4f7f\u7528\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">IniSharp<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">ini<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IniFile<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;config.ini&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Encoding<\/span><span class=\"p\">.<\/span><span class=\"n\">UTF8<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">value1<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ini<\/span><span class=\"p\">.<\/span><span class=\"n\">GetValue<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Key1&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">value2<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ini<\/span><span class=\"p\">.<\/span><span class=\"n\">GetValue<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Key2&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Default&#34;<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ \u5982\u679c\u8be5\u952e\u4e0d\u5b58\u5728\uff0c\u5219\u521b\u5efa\u5e76\u8fd4\u56de\u9ed8\u8ba4\u503c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">ini<\/span><span class=\"p\">.<\/span><span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Key1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;NewValue1&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">ini<\/span><span class=\"p\">.<\/span><span class=\"n\">DeleteKey<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;Key2&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">ini<\/span><span class=\"p\">.<\/span><span class=\"n\">DeleteSection<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Section2&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">sections<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ini<\/span><span class=\"p\">.<\/span><span class=\"n\">GetSections<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">keys<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ini<\/span><span class=\"p\">.<\/span><span class=\"n\">GetKeys<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Section1&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u5e93\u5e76\u4e0d\u4f1a\u4e00\u6b21\u6027\u8bfb\u53d6\u6574\u4e2a INI \u6587\u4ef6\uff0c\u800c\u662f\u5728\u6bcf\u6b21\u64cd\u4f5c\u65f6\u8fdb\u884c\u8bfb\u53d6\u6216\u5199\u5165\u64cd\u4f5c\uff0c\u56e0\u6b64\u4e0d\u4f1a\u5360\u7528\u8fc7\u591a\u7684\u5185\u5b58\u3002\u8fd9\u5728\u6211\u4eec\u7684\u9700\u6c42\u662f\u4e34\u65f6\u8bfb\u5199\u67d0\u4e00\u9879\u914d\u7f6e\u65f6\u663e\u5f97\u5c24\u4e3a\u91cd\u8981\u3002<\/p>\n<p>\u4f46\u662f\u6211\u4ecd\u7136\u8981\u6cfc\u5927\u5bb6\u4e00\u76c6\u51b7\u6c34\uff1a\u8fd9\u4e2a\u5e93\u7684\u6027\u80fd\u5e76\u4e0d\u9ad8\uff0c\u56e0\u4e3a\u5b83\u5e95\u5c42\u7684\u4ee3\u7801\u5b58\u5728\u4e00\u4e9b\u503c\u5f97\u4f18\u5316\u7684\u7a7a\u95f4\u3002\u4ee5\u8bfb\u53d6\u5355\u4e2a\u952e\u503c\u7684\u65b9\u6cd5\u4e3a\u4f8b\uff08\u4ee5\u4e0b\u4ee3\u7801\u4e3a\u8282\u9009\uff0c\u5e76\u4e0d\u5b8c\u6574\uff09\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><span class=\"lnt\">35\n<\/span><span class=\"lnt\">36\n<\/span><span class=\"lnt\">37\n<\/span><span class=\"lnt\">38\n<\/span><span class=\"lnt\">39\n<\/span><span class=\"lnt\">40\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5b83\u5728\u5e95\u5c42\u58f0\u660e\u4e86\u4e00\u4e2a\u201c\u78b0\u5de7\u201d\u4e0e Win 32 API \u4e00\u6837\u7684\u51fd\u6570\u540d<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">GetPrivateProfileString<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">section<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">key<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">defaultValue<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">lines<\/span> <span class=\"p\">=<\/span> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadAllLines<\/span><span class=\"p\">(<\/span><span class=\"n\">filePath<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileEncoding<\/span><span class=\"p\">).<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">sectionNum<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">keyNum<\/span><span class=\"p\">)<\/span> <span class=\"p\">=<\/span> <span class=\"n\">FindSectionAndKey<\/span><span class=\"p\">(<\/span><span class=\"n\">section<\/span><span class=\"p\">,<\/span> <span class=\"n\">key<\/span><span class=\"p\">,<\/span> <span class=\"n\">lines<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">sectionNum<\/span> <span class=\"p\">!=<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">keyNum<\/span> <span class=\"p\">!=<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">startIndex<\/span> <span class=\"p\">=<\/span> <span class=\"n\">lines<\/span><span class=\"p\">[<\/span><span class=\"n\">keyNum<\/span><span class=\"p\">].<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"n\">key<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">equalsIndex<\/span> <span class=\"p\">=<\/span> <span class=\"n\">lines<\/span><span class=\"p\">[<\/span><span class=\"n\">keyNum<\/span><span class=\"p\">].<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;=&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">startIndex<\/span> <span class=\"p\">+<\/span> <span class=\"n\">key<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"n\">strLalue<\/span> <span class=\"p\">=<\/span> <span class=\"n\">lines<\/span><span class=\"p\">[<\/span><span class=\"n\">keyNum<\/span><span class=\"p\">].<\/span><span class=\"n\">Substring<\/span><span class=\"p\">(<\/span><span class=\"n\">equalsIndex<\/span> <span class=\"p\">+<\/span> <span class=\"m\">1<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">int<\/span> <span class=\"n\">hashIndex<\/span> <span class=\"p\">=<\/span> <span class=\"n\">strLalue<\/span><span class=\"p\">.<\/span><span class=\"n\">IndexOf<\/span><span class=\"p\">(<\/span><span class=\"n\">commentChar<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"p\">(<\/span><span class=\"n\">hashIndex<\/span> <span class=\"p\">!=<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">?<\/span> <span class=\"n\">strLalue<\/span><span class=\"p\">.<\/span><span class=\"n\">Substring<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">hashIndex<\/span><span class=\"p\">)<\/span> <span class=\"p\">:<\/span> <span class=\"n\">strLalue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">defaultValue<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">sectionNum<\/span> <span class=\"p\">!=<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">keyNum<\/span> <span class=\"p\">==<\/span> <span class=\"p\">-<\/span><span class=\"m\">1<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">lines<\/span><span class=\"p\">.<\/span><span class=\"n\">Insert<\/span><span class=\"p\">(<\/span><span class=\"n\">sectionNum<\/span> <span class=\"p\">+<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"s\">$&#34;{key}={defaultValue}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">lock<\/span> <span class=\"p\">(<\/span><span class=\"n\">lockObject<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteAllLines<\/span><span class=\"p\">(<\/span><span class=\"n\">filePath<\/span><span class=\"p\">,<\/span> <span class=\"n\">lines<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileEncoding<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">else<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">lock<\/span> <span class=\"p\">(<\/span><span class=\"n\">lockObject<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"n\">StreamWriter<\/span> <span class=\"n\">sw<\/span> <span class=\"p\">=<\/span> <span class=\"n\">File<\/span><span class=\"p\">.<\/span><span class=\"n\">AppendText<\/span><span class=\"p\">(<\/span><span class=\"n\">filePath<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">sw<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;[{section}]&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">sw<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;{key}={defaultValue}&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">defaultValue<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0d\u96be\u770b\u51fa\u51e0\u4e2a\u95ee\u9898\uff1a<\/p>\n<ol>\n<li>\u5b83\u4f7f\u7528\u7684\u662f <code>ReadAllLines()<\/code> \u65b9\u6cd5\uff0c\u800c\u4e0d\u662f\u91c7\u7528 <code>ReadLines()<\/code> \u65b9\u6cd5\u8fd4\u56de\u4e00\u4e2a\u5ef6\u8fdf\u52a0\u8f7d\u7684 <code>IEnumerable&lt;string&gt;<\/code>\uff0c\u6216\u4f7f\u7528 <code>StreamReader<\/code> \u9010\u884c\u8bfb\u53d6\u3002\u8fd9\u6837\u4f1a\u5bfc\u81f4\u4e00\u6b21\u6027\u8bfb\u53d6\u6574\u4e2a\u6587\u4ef6\uff0c\u5360\u7528\u66f4\u591a\u5185\u5b58\u3002\u5c24\u5176\u662f\u5373\u4fbf\u6211\u4eec\u8981\u627e\u7684\u952e\u5c31\u5728\u6587\u4ef6\u7684\u5f00\u5934\uff0c\u5b83\u4e5f\u4f1a\u4ece\u5934\u8bfb\u53d6\u6574\u4e2a\u6587\u4ef6\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u591f\u9ad8\u6548\u7684\u3002<\/li>\n<li>\u5b83\u4f7f\u7528\u4e86 <code>File.WriteAllLines()<\/code> \u65b9\u6cd5\uff0c\u6bcf\u6b21\u4fee\u6539\u90fd\u4f1a\u91cd\u5199\u6574\u4e2a\u6587\u4ef6\u3002<\/li>\n<li>\u5728\u63d2\u5165\u65b0\u952e\u503c\u5bf9\u65f6\uff0c\u5b83\u4f7f\u7528\u4e86 <code>List.Insert()<\/code> \u65b9\u6cd5\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u6574\u4e2a\u5217\u8868\u7684\u5143\u7d20\u5411\u540e\u79fb\u52a8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\u3002<\/li>\n<\/ol>\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u8fd9\u4e2a\u5e93\u8fd8\u6709\u5176\u4ed6\u4e00\u4e9b\u63d0\u5347\u7a7a\u95f4\uff0c\u6bd4\u5982\u53ef\u4ee5\u4f7f\u7528 <code>Span<\/code>\u3001<code>ArrayPool<\/code> \u7b49\uff0c\u6765\u51cf\u5c11\u5185\u5b58\u5206\u914d\u548c GC \u538b\u529b\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e0a\u9762\u63d0\u5230\u7684\u51e0\u79cd\u65b9\u5f0f\u53ef\u4ee5\u8bf4\u662f\u5404\u6709\u5343\u79cb\uff0c\u603b\u4f1a\u5b58\u5728\u4e00\u4e9b\u7f3a\u61be\uff0c\u56e0\u6b64\u5173\u4e8e INI \u8fd9\u4e48\u7b80\u5355\u7684\u4e00\u4e2a\u6587\u4ef6\u683c\u5f0f\uff0c\u6211\u4eec\u7684\u6545\u4e8b\u5e76\u6ca1\u6709\u7ed3\u675f\u3002\u5728\u540e\u7eed\u7684\u6587\u7ae0\u4e2d\uff0c\u6211\u8fd8\u4f1a\u548c\u5927\u5bb6\u5206\u4eab\u66f4\u591a\u5173\u4e8e INI \u6587\u4ef6\u7684\u8bfb\u5199\u65b9\u6cd5\uff0c\u4ee5\u53ca\u4e00\u4e9b\u4f18\u5316\u6280\u5de7\u3002\u6b22\u8fce\u5927\u5bb6\u7ee7\u7eed\u5173\u6ce8\u6211\u7684\u535a\u5ba2\u3002<\/p>"},{"title":"\u4e3a\u4ec0\u4e48\u6211\u4eec\u4e00\u822c\u4e0d\u4f7f\u7528\u516c\u5171\u5b57\u6bb5\uff0c\u800c\u662f\u9009\u62e9\u81ea\u52a8\u5c5e\u6027\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/why-we-prefer-property-over-field\/","pubDate":"Thu, 13 Jun 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/why-we-prefer-property-over-field\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/06\/13\/6rLfG3dzciJpjvO.jpg\" alt=\"Featured image of post \u4e3a\u4ec0\u4e48\u6211\u4eec\u4e00\u822c\u4e0d\u4f7f\u7528\u516c\u5171\u5b57\u6bb5\uff0c\u800c\u662f\u9009\u62e9\u81ea\u52a8\u5c5e\u6027\uff1f\" \/><blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1ci421v7Uc\/\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<p>\u5728\u5199 C# \u4ee3\u7801\u7684\u65f6\u5019\uff0c\u6211\u4eec\u7ecf\u5e38\u4f1a\u5199\u8bf8\u5982\u6b64\u7c7b\u7684\u81ea\u52a8\u5c5e\u6027\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u65f6\u5019\u76f8\u4fe1\u5f88\u591a\u4eba\u90fd\u4f1a\u6709\u7591\u95ee\uff1a\u4e3a\u4ec0\u4e48\u6211\u4eec\u8981\u8d39\u52b2\u5199\u6210\u8fd9\u6837\u7684\u81ea\u52a8\u5c5e\u6027\uff1f\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u76f4\u63a5\u7b80\u5355\u5730\u628a\u5b83\u5199\u6210\u4e00\u4e2a\u516c\u5171\u5b57\u6bb5\u5462\uff1f\u5c31\u6bd4\u5982\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u5b9e\u8fd9\u662f\u6709\u4e00\u4e9b\u539f\u56e0\u7684\u3002\u6211\u4eec\u8fd9\u6b21\u5c31\u6765\u63a2\u8ba8\u4e00\u4e0b\u3002<\/p>\n<h2 id=\"\u770b\u5f85\u5c5e\u6027\u4e0e\u5b57\u6bb5\u7684\u65b9\u5f0f\u4e0d\u540c\">\n\u770b\u5f85\u5c5e\u6027\u4e0e\u5b57\u6bb5\u7684\u65b9\u5f0f\u4e0d\u540c\n<a href=\"#%e7%9c%8b%e5%be%85%e5%b1%9e%e6%80%a7%e4%b8%8e%e5%ad%97%e6%ae%b5%e7%9a%84%e6%96%b9%e5%bc%8f%e4%b8%8d%e5%90%8c\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6700\u91cd\u8981\u7684\uff0c\u5c31\u662f\u6211\u4eec\u770b\u5f85\u5c5e\u6027\u4e0e\u5b57\u6bb5\u7684\u65b9\u5f0f\uff0c\u6216\u8005\u5bf9\u4e8e\u5b83\u4eec\u6240\u626e\u6f14\u7684\u89d2\u8272\u7684\u7406\u89e3\u662f\u4e0d\u4e00\u6837\u7684\u3002<\/p>\n<p>\u5f53\u6211\u4eec\u770b\u5230\u4e00\u4e2a\u5c5e\u6027\u65f6\uff0c\u901a\u5e38\u6211\u4eec\u90fd\u4f1a\u671f\u671b\u5b83\u62e5\u6709\u4e00\u4e2a\u516c\u5171\u7684\u8bfb\u6743\u9650\uff0c\u540c\u65f6\u62e5\u6709\u4e00\u4e2a\u53ef\u80fd\u4e0d\u516c\u5f00\u7684\u5199\u6743\u9650\u8fd8\u53ef\u80fd\u5728\u521d\u59cb\u5316\u4e0a\u5b58\u5728\u4e00\u4e9b\u9650\u5236\u3002<strong>\u901a\u5e38\u6211\u4eec\u5199\u4e00\u4e2a\u5c5e\u6027\u65f6\uff0c\u90fd\u662f\u5e0c\u671b\u5b83\u5b58\u5728\u88ab\u5916\u754c\u8bbf\u95ee\u7684\u4ef7\u503c\uff0c\u5e76\u4e14\u6211\u4eec\u4e5f\u5145\u5206\u8003\u8651\u4e86\u540e\u679c<\/strong>\uff08\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u5728 setter \u4e2d\u6dfb\u52a0\u903b\u8f91\uff0c\u6216\u5e72\u8106\u4e0d\u5f00\u653e setter\uff09\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4\uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u6211\u4eec\u5e0c\u671b\u4e00\u4e2a\u5c5e\u6027\u5b83\u662f\u4e00\u4e2a\uff1a<\/p>\n<ol>\n<li>\uff08\u4e00\u822c\u60c5\u51b5\u4e0b\uff09\u53ef\u4ee5\u5728\u7c7b\u5916\u88ab\u8bbf\u95ee\u5230\uff0c\u5e76\u4e14\u5177\u6709\u4e00\u5b9a\u7684\u610f\u4e49\uff0c\u662f\u5f00\u53d1\u8005\u6545\u610f\u66b4\u9732\u51fa\u6765\u7684\u6210\u5458<\/li>\n<li>\u5b83\u7684\u521d\u59cb\u5316\u53ef\u80fd\u5305\u542b\u4e00\u4e9b\u903b\u8f91\uff0c\u6bd4\u5982\u53ef\u4ee5\u5728\u4ec0\u4e48\u65f6\u5019\u88ab\u521d\u59cb\u5316\uff0c\u662f\u5426\u5fc5\u987b\u88ab\u521d\u59cb\u5316\uff0c\u521d\u59cb\u5316\u540e\u8fd8\u80fd\u5426\u66f4\u6539\u7b49<\/li>\n<li>\u5b83\u540e\u53f0\u672a\u5fc5\u4e00\u5b9a\u5bf9\u5e94\u4e00\u4e2a\u5b57\u6bb5\uff0c\u800c\u662f\u4f1a\u901a\u8fc7\u4e00\u4e9b\u65b9\u5f0f\u6765\u5f97\u5230\u5b83\u7684\u503c<\/li>\n<\/ol>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\"><p>\u5bf9\u4e8e\u7b2c 3 \u6761\uff0c\u6211\u53ef\u4ee5\u4e3e\u51fa\u4e00\u4e9b\u4f8b\u5b50\uff1a<\/p>\n<ol>\n<li><code>List.Count<\/code> \u5b9e\u9645\u4e0e\u5e95\u5c42\u7684 <code>Array<\/code> \u7684\u957f\u5ea6\u6709\u5173<\/li>\n<li><code>AsyncRelayCommand.IsRunning<\/code> \u4e0e\u5e95\u5c42\u7684 <code>Task<\/code> \u7684\u72b6\u6001\u6709\u5173<\/li>\n<li><code>ObservableValidator.HasErrors<\/code> \u4e0e\u5e95\u5c42\u7528\u4e8e\u5b58\u653e\u9519\u8bef\u4fe1\u606f\u7684\u5217\u8868\u6709\u5173<\/li>\n<li><code>CheckBox.IsChecked<\/code> \u4e0e\u5e95\u5c42\u7684\u4f9d\u8d56\u5c5e\u6027\u6709\u5173<\/li>\n<\/ol><\/div>\n<\/div>\n<p>\u4f46\u662f\u5f53\u6211\u4eec\u770b\u5230\u5b57\u6bb5\u65f6\uff0c\u901a\u5e38\u4f1a\u600e\u4e48\u8003\u8651\u5462\uff1f\u6211\u4eec\u5148\u6765\u770b\u4e00\u6bb5\u7b80\u5355\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Manager<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">_uniqueId<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u4e00\u4e2a\u53ef\u80fd\u6709\u7279\u6b8a\u4f5c\u7528\u7684\u552f\u4e00 ID<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">IConfiguration<\/span> <span class=\"n\">_config<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u4e00\u4e2a\u901a\u8fc7\u4f9d\u8d56\u6ce8\u5165\u7684\u65b9\u5f0f\u5728\u6784\u9020\u4e2d\u521d\u59cb\u5316\u7684\u63a5\u53e3\u5bf9\u8c61<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_flag<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u4e00\u4e2a\u53ea\u7528\u4e8e\u5185\u90e8\u65b9\u6cd5\u95f4\u4f20\u9012\u72b6\u6001\u7684\u6807\u5fd7\u4f4d<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"kt\">object<\/span> <span class=\"n\">_syncRoot<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ \u4e00\u4e2a\u53ea\u7528\u4e8e\u7c7b\u5185\u90e8\u7684\u7ebf\u7a0b\u9501<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5927\u5bb6\u5bf9\u4e8e\u5b57\u6bb5\u7684\u5370\u8c61\u662f\u5426\u4e00\u822c\u90fd\u662f\u8fd9\u6837\u7684\u5462\uff1f\u5982\u679c\u662f\u7684\u8bdd\uff0c\u90a3\u4e48\u76f8\u4fe1\u5728\u770b\u5230\u4e0b\u9762\u7684\u4ee3\u7801\u65f6\uff0c\u4e00\u5b9a\u4f1a\u6709\u70b9\u604d\u60da\u548c\u4e0d\u77e5\u6240\u63aa\u5427\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Manager<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">protected<\/span> <span class=\"k\">readonly<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">UniqueId<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">Flag<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">ErrorMessage<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Oops!&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6240\u4ee5\u8fd9\u91cc\u9762\u7684\u9053\u7406\u76f8\u4fe1\u5927\u5bb6\u5e94\u8be5\u5df2\u7ecf\u6709\u4e00\u5b9a\u611f\u89c9\u4e86\u3002\u662f\u7684\uff0c\u6211\u4eec\u901a\u5e38\u5bf9\u4e8e\u5b57\u6bb5\u6240\u626e\u6f14\u89d2\u8272\u7684\u7406\u89e3\u662f\uff1a<\/p>\n<ol>\n<li>\u5b83\u901a\u5e38\u53ea\u7528\u4e8e\u7c7b\u5185\uff0c\u4f5c\u4e3a\u5176\u4ed6\u5c5e\u6027\u6216\u65b9\u6cd5\u7684\u8f85\u52a9\u89d2\u8272\uff08\u6bd4\u5982\u7ebf\u7a0b\u9501\u3001\u6807\u5fd7\u4f4d\u3001\u4f9d\u8d56\u6ce8\u5165\u7684\u5bf9\u8c61\u7b49\uff09<\/li>\n<li>\u5b83\u901a\u5e38\u4e0d\u5305\u542b\u592a\u591a\u7684\u903b\u8f91\uff0c\u53ea\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u503c\uff0c\u800c\u4e14\u4e5f\u4e0d\u5982\u5c5e\u6027\u90a3\u6837\u5177\u6709\u591a\u79cd\u521d\u59cb\u5316\u7684\u65b9\u5f0f<\/li>\n<li>\u5b83\u901a\u5e38\u4e0d\u592a\u201c\u5b89\u5168\u201d\uff0c\u6216\u8005\u8bf4\u5f00\u53d1\u8005\u5728\u4e0d\u4e86\u89e3\u7684\u60c5\u51b5\u4e0b\u4e0d\u592a\u6562\u8f7b\u6613\u53bb\u64cd\u4f5c\u5b83<\/li>\n<\/ol>\n<p>\u57fa\u4e8e\u8fd9\u6837\u4e0d\u540c\u7684\u770b\u5f85\u65b9\u5f0f\uff0c\u76f8\u4fe1\u5927\u5bb6\u5e94\u8be5\u90fd\u80fd\u7406\u89e3\u4e3a\u4ec0\u4e48\u6211\u4eec\u4e00\u822c\u4e0d\u76f4\u63a5\u4f7f\u7528\u516c\u5171\u5b57\u6bb5\u4e86\u3002<\/p>\n<p>\u5f53\u7136\u4e86\uff0c\u4f8b\u5916\u60c5\u51b5\u80af\u5b9a\u4e5f\u662f\u6709\u7684\u3002\u6bd4\u5982\u8bf4\u6211\u4eec\u5728\u5f00\u53d1\u4e00\u4e2a\u7b80\u5355\u7684 Unity \u6e38\u620f\uff0c\u90a3\u4e48\u901a\u5e38\u6211\u4eec\u4f1a\u5199\u51fa\u8fd9\u6837\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Player<\/span> <span class=\"p\">:<\/span> <span class=\"n\">MonoBehaviour<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [SerializeField]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">health<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ Unity \u5b98\u65b9\u63a8\u8350\u7684\u547d\u540d\u4e60\u60ef\u662f\u9996\u5b57\u6bcd\u5c0f\u5199<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">attack<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">defense<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6216\u8005\u5f53\u6211\u4eec\u60f3\u8981\u4e0e C\/C++ \u5199\u7684 DLL \u4ea4\u4e92\u65f6\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u5199\u51fa\u8fd9\u6837\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"na\">[StructLayout(LayoutKind.Sequential)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">struct<\/span> <span class=\"nc\">MyData<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">ushort<\/span> <span class=\"n\">Index<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">uint<\/span> <span class=\"n\">Value<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"n\">Data<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u76f4\u63a5\u4f7f\u7528\u516c\u5171\u5b57\u6bb5\uff0c\u800c\u4e0d\u662f\u5c5e\u6027\u3002<\/p>\n<h2 id=\"\u957f\u671f\u7684\u7ea6\u5b9a\u4fd7\u6210\">\n\u957f\u671f\u7684\u7ea6\u5b9a\u4fd7\u6210\n<a href=\"#%e9%95%bf%e6%9c%9f%e7%9a%84%e7%ba%a6%e5%ae%9a%e4%bf%97%e6%88%90\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u65e2\u7136\u6211\u4eec\u6709\u8fd9\u6837\u4e0d\u540c\u7684\u770b\u5f85\u65b9\u5f0f\uff0c\u6240\u4ee5\u5c31\u51fa\u73b0\u4e86\u76f8\u5f53\u591a\u7c7b\u4f3c\u7684\u5f00\u53d1\u4e60\u60ef\uff0c\u751a\u81f3\u8fde\u6807\u51c6\u5e93\u53ca\u7b2c\u4e09\u65b9\u5e93\u4e5f\u5728\u6709\u610f\u65e0\u610f\u8d2f\u5f7b\u7740\u8fd9\u6837\u7684\u4e60\u60ef\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5f53\u7136\u4e86\uff0c\u8fd9\u91cc\u9762\u5176\u5b9e\u8fd8\u6709\u4e00\u4e2a\u201c\u5148\u6709\u9e21\u8fd8\u662f\u5148\u6709\u86cb\u201d\u7684\u95ee\u9898\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u662f\u56e0\u4e3a\u6709\u4e86\u8fd9\u6837\u7684\u4e60\u60ef\uff0c\u6240\u4ee5\u624d\u4f1a\u6709\u8fd9\u6837\u7684\u6807\u51c6\u5e93\u8bbe\u8ba1\uff0c\u8fd8\u662f\u56e0\u4e3a\u6807\u51c6\u5e93\u8bbe\u8ba1\u7684\u5982\u6b64\uff0c\u6240\u4ee5\u6211\u4eec\u624d\u4f1a\u6709\u8fd9\u6837\u7684\u4e60\u60ef\u5462\uff1f\u4e0d\u8fc7\u8fd9\u4e2a\u95ee\u9898\u5c31\u4e0d\u5728\u6211\u4eec\u7684\u8ba8\u8bba\u8303\u56f4\u5185\u4e86\u3002<\/div>\n<\/div>\n<p>\u8fd9\u91cc\u6211\u53ef\u4ee5\u4e3e\u5f88\u591a\u4f8b\u5b50\uff1a<\/p>\n<ol>\n<li>\u5728 WPF \u5f00\u53d1\u4e2d\uff0c\u5982\u679c\u4f60\u60f3\u5728 XAML \u4e2d\u7ed1\u5b9a\u4e00\u4e2a\u7c7b\uff08\u901a\u5e38\u4e3a Model \u6216 ViewModel\uff09\u7684\u53d8\u91cf\uff0c\u90a3\u4e48\u8fd9\u4e2a\u53d8\u91cf\u5fc5\u987b\u662f\u4e00\u4e2a\u5c5e\u6027\uff0c\u800c\u4e0d\u80fd\u662f\u4e00\u4e2a\u5b57\u6bb5\u3002\u6b64\u5916\uff0cWPF \u4e2d\u53e6\u4e00\u4e2a\u76f8\u5f53\u91cd\u8981\u7684\u529f\u80fd\u2014\u2014\u4f9d\u8d56\u5c5e\u6027\u2014\u2014\u4e5f\u4f1a\u5145\u5206\u548c\u5c5e\u6027\u6253\u4ea4\u9053\u3002<\/li>\n<li>\u5728\u8fdb\u884c\u7c7b\u7684\u5e8f\u5217\u5316\u4e0e\u53cd\u5e8f\u5217\u5316\u65f6\uff0cJson.NET\u3001System.Text.Json \u7b49\u5e93\u9ed8\u8ba4\u53ea\u4f1a\u5e8f\u5217\u5316\u5c5e\u6027\uff0c\u800c\u4e0d\u4f1a\u5e8f\u5217\u5316\u5b57\u6bb5\u3002<\/li>\n<li><code>DataGrid<\/code>\u3001<code>PropertyGrid<\/code> \u7b49\u4f1a\u6839\u636e\u6570\u636e\u7c7b\u578b\u6765\u81ea\u52a8\u751f\u6210\u754c\u9762\u7684\u63a7\u4ef6\u90fd\u662f\u5173\u6ce8\u5c5e\u6027\u800c\u975e\u5b57\u6bb5\u3002<\/li>\n<li>\u5728 EntityFramework Core \u4e2d\uff0c\u5982\u679c\u4f60\u60f3\u8981\u4f7f\u7528\u4ee3\u7801\u4f18\u5148\uff08Code-First\uff09\u7684\u65b9\u5f0f\uff0c\u90a3\u4e48\u4f60\u7684\u5b9e\u4f53\u7c7b\u4e2d\u7684\u5c5e\u6027\u5fc5\u987b\u662f\u5c5e\u6027\uff0c\u800c\u4e0d\u80fd\u662f\u5b57\u6bb5\uff1b\u800c\u4f7f\u7528\u6570\u636e\u5e93\u4f18\u5148\uff08Database-First\uff09\u7684\u65b9\u5f0f\u65f6\uff0c\u5de5\u5177\u81ea\u52a8\u751f\u6210\u7684\u4e5f\u662f\u5c5e\u6027\u3002<\/li>\n<li>C# \u7684\u63a5\u53e3\u53ef\u4ee5\u5305\u542b\u5c5e\u6027\uff0c\u4f46\u4e0d\u80fd\u5305\u542b\u5b57\u6bb5\u3002<\/li>\n<li>C# \u7684\u8bb0\u5f55\u7c7b\uff08record\uff09\u5e95\u5c42\u4e5f\u662f\u4f7f\u7528\u5c5e\u6027\u6765\u5b9e\u73b0\u7684\u3002<\/li>\n<\/ol>\n<p>\u5176\u4ed6\u8fd8\u6709\u4e00\u4e9b\u522b\u7684\u4f8b\u5b50\uff0c\u6bd4\u5982\u6211\u4eec\u5728\u4f7f\u7528\u6570\u636e\u6620\u5c04\u7684\u5de5\u5177\uff08\u5982 Mapster\u3001AutoMapper \u7b49\uff09\u65f6\uff0c\u53ef\u80fd\u4e5f\u4f1a\u53d1\u73b0\u5c5e\u6027\u548c\u5b57\u6bb5\u7684\u4e00\u4e9b\u4e0d\u540c\u4e4b\u5904\u3002<\/p>\n<p>\u6240\u4ee5\uff0c\u65e2\u7136\u8fd9\u6837\u7684\u4e60\u60ef\u5e7f\u6cdb\u5b58\u5728\uff0c\u6211\u4eec\u4e3a\u4ec0\u4e48\u8981\u9009\u62e9\u505a\u4e00\u4e2a\u53e6\u7c7b\u7684\u5f00\u53d1\u8005\u5462\uff1f<\/p>\n<h2 id=\"\u7075\u6d3b\u6027\u4e0e\u5c01\u88c5\u6027\">\n\u7075\u6d3b\u6027\u4e0e\u5c01\u88c5\u6027\n<a href=\"#%e7%81%b5%e6%b4%bb%e6%80%a7%e4%b8%8e%e5%b0%81%e8%a3%85%e6%80%a7\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5c5e\u6027\u5177\u6709\u65e0\u4e0e\u4f26\u6bd4\u7684\u7075\u6d3b\u6027\u3002\u6211\u4eec\u53ef\u4ee5\u5728\u5c5e\u6027\u7684 getter \u548c setter \u4e2d\u6dfb\u52a0\u4efb\u610f\u7684\u903b\u8f91\uff0c\u6bd4\u5982\u6570\u636e\u6821\u9a8c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">_age<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_age<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">set<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"p\">&lt;<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArgumentOutOfRangeException<\/span><span class=\"p\">(<\/span><span class=\"n\">nameof<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span><span class=\"p\">),<\/span> <span class=\"s\">&#34;Age must be greater than 0.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_age<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u518d\u6bd4\u5982\u901a\u77e5\u529f\u80fd\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">ViewModel<\/span> <span class=\"p\">:<\/span> <span class=\"n\">INotifyPropertyChanged<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">_name<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_name<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">set<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_name<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">value<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_name<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">OnPropertyChanged<\/span><span class=\"p\">(<\/span><span class=\"n\">nameof<\/span><span class=\"p\">(<\/span><span class=\"n\">Name<\/span><span class=\"p\">));<\/span> <span class=\"c1\">\/\/ \u4e8b\u4ef6\u4e0e\u65b9\u6cd5\u7684\u5b9e\u73b0\u7565<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u66f4\u91cd\u8981\u7684\u662f\u5b83\u7684\u5c01\u88c5\u6027\u3002\u6bd4\u5982\u5e38\u89c1\u7684 setter \u5c31\u6709\u8fd9\u4e48\u51e0\u79cd\uff1a<\/p>\n<ol>\n<li><code>public<\/code>\uff1a\u516c\u5171\u7684 setter\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u4fee\u6539\u8fd9\u4e2a\u5c5e\u6027<\/li>\n<li><code>protected<\/code>\uff1a\u53d7\u4fdd\u62a4\u7684 setter\uff0c\u53ea\u6709\u7ee7\u627f\u8fd9\u4e2a\u7c7b\u7684\u5b50\u7c7b\u624d\u80fd\u4fee\u6539\u8fd9\u4e2a\u5c5e\u6027<\/li>\n<li><code>private<\/code>\uff1a\u79c1\u6709\u7684 setter\uff0c\u53ea\u6709\u8fd9\u4e2a\u7c7b\u5185\u90e8\u7684\u65b9\u6cd5\u624d\u80fd\u4fee\u6539\u8fd9\u4e2a\u5c5e\u6027<\/li>\n<li><code>internal<\/code>\uff1a\u5185\u90e8\u7684 setter\uff0c\u53ea\u6709\u540c\u4e00\u4e2a\u7a0b\u5e8f\u96c6\u5185\u7684\u65b9\u6cd5\u624d\u80fd\u4fee\u6539\u8fd9\u4e2a\u5c5e\u6027<\/li>\n<li><code>init<\/code>\uff1a\u521d\u59cb\u5316 setter\uff0c\u53ea\u80fd\u5728\u6784\u9020\u51fd\u6570\u4e2d\u521d\u59cb\u5316\u8fd9\u4e2a\u5c5e\u6027<\/li>\n<li>\u7a7a\uff1a\u53ea\u8bfb\u5c5e\u6027\uff0c\u53ea\u80fd\u5728\u6784\u9020\u51fd\u6570\u4e2d\u521d\u59cb\u5316\u8fd9\u4e2a\u5c5e\u6027<\/li>\n<\/ol>\n<p>\u4e0d\u4ec5\u5982\u6b64\uff0c\u8fd8\u53ef\u4ee5\u914d\u5408\u8bf8\u5982 <code>required<\/code>\u3001<code>virtual<\/code> \u7b49\u5173\u952e\u5b57\uff0c\u4f7f\u5f97\u5c5e\u6027\u7684\u7075\u6d3b\u6027\u548c\u5c01\u88c5\u6027\u66f4\u4e0a\u4e00\u5c42\u697c\u3002\u8fd9\u4e9b\u90fd\u662f\u5b57\u6bb5\u5b8c\u5168\u65e0\u6cd5\u6bd4\u62df\u7684\uff08\u6211\u77e5\u9053\u4e0a\u9762\u7684\u4e00\u4e9b\u5173\u952e\u5b57\u4e5f\u53ef\u4ee5\u7528\u4e8e\u5b57\u6bb5\uff0c\u4f46\u6548\u679c\u90fd\u5f88\u6709\u9650\uff0c\u6bd4\u5982\u4f1a\u540c\u65f6\u9650\u5236\u8bfb\u5199\u7684\u6743\u9650\u7b49\uff09\u3002<\/p>\n<h2 id=\"\u6027\u80fd\u65b9\u9762\u7684\u8003\u8651\">\n\u6027\u80fd\u65b9\u9762\u7684\u8003\u8651\n<a href=\"#%e6%80%a7%e8%83%bd%e6%96%b9%e9%9d%a2%e7%9a%84%e8%80%83%e8%99%91\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u65f6\u5019\u53ef\u80fd\u6709\u540c\u5b66\u53c8\u8981\u8bf4\u4e86\uff1a\u6211\u77e5\u9053\u81ea\u52a8\u5c5e\u6027\u5176\u5b9e\u662f\u4e2a\u8bed\u6cd5\u7cd6\uff0c\u6700\u7ec8\u8fd8\u662f\u4f1a\u88ab\u7f16\u8bd1\u5668\u8f6c\u6362\u6210\u5b57\u6bb5\u548c\u65b9\u6cd5\uff0c\u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [CompilerGenerated]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"p\">&lt;<\/span><span class=\"n\">Age<\/span><span class=\"p\">&gt;<\/span><span class=\"n\">k__BackingField<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [CompilerGenerated]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"p\">&lt;<\/span><span class=\"n\">Age<\/span><span class=\"p\">&gt;<\/span><span class=\"n\">k__BackingField<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [CompilerGenerated]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">set<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">&lt;<\/span><span class=\"n\">Age<\/span><span class=\"p\">&gt;<\/span><span class=\"n\">k__BackingField<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u90a3\u4e48\u8c03\u7528\u65b9\u6cd5\u53bb\u8bfb\u5199\u5b57\u6bb5\u7684\u503c\uff0c\u6548\u7387\u4e0a\u7406\u5e94\u6bd4\u76f4\u63a5\u8bfb\u5199\u5b57\u6bb5\u8981\u4f4e\u5bf9\u5427\uff1f\u5982\u679c\u662f\u8fd9\u6837\u7684\u8bdd\uff0c\u628a <code>{ get; set; }<\/code> \u8fd9\u6837\u7684\u81ea\u52a8\u5c5e\u6027\u76f4\u63a5\u5199\u6210\u516c\u5171\u5b57\u6bb5\uff0c\u4e0d\u662f\u66f4\u597d\u5417\uff1f<\/p>\n<p>\u8fd9\u662f\u4e2a\u597d\u95ee\u9898\uff0c\u6211\u4eec\u6765\u770b\u8fd9\u6837\u4e00\u4e2a\u4f8b\u5b50\u3002\u4e0b\u9762\u7684 <code>Person<\/code> \u7c7b\u4e2d\uff0c\u6211\u4eec\u5b9a\u4e49\u4e86\u4e24\u4e2a\u5c5e\u6027\uff0c\u4e00\u4e2a\u662f\u81ea\u52a8\u5c5e\u6027\uff0c\u4e00\u4e2a\u662f\u5b57\u6bb5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">p<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Person<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age1<\/span> <span class=\"p\">=<\/span> <span class=\"m\">10<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Age2<\/span> <span class=\"p\">=<\/span> <span class=\"m\">20<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age1<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age2<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u6211\u4eec\u89c2\u5bdf IL \u4ee3\u7801\uff0c\u4f1a\u53d1\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">IL_0000: newobj instance void Person::.ctor()\n<\/span><\/span><span class=\"line\"><span class=\"cl\">IL_0005: dup\n<\/span><\/span><span class=\"line\"><span class=\"cl\">IL_0006: ldc.i4.s 10\n<\/span><\/span><span class=\"line\"><span class=\"cl\">IL_0008: callvirt instance void Person::set_Age1(int32)\n<\/span><\/span><span class=\"line\"><span class=\"cl\">IL_000d: ldc.i4.s 20\n<\/span><\/span><span class=\"line\"><span class=\"cl\">IL_000f: stfld int32 Person::Age2\n<\/span><\/span><span class=\"line\"><span class=\"cl\">IL_0014: ret\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u597d\u50cf\u786e\u5b9e\u4e0d\u5927\u5bf9\u52b2\u554a\u3002<code>Age1<\/code> \u5c31\u662f\u4f7f\u7528\u4e86 <code>Person::set_Age1<\/code> \u65b9\u6cd5\uff0c\u800c <code>Age2<\/code> \u5374\u76f4\u63a5\u4f7f\u7528\u4e86 <code>stfld<\/code> \u6307\u4ee4\u3002\u90a3\u662f\u4e0d\u662f\u8bf4\u660e\u4fee\u6539\u5c5e\u6027\u7684\u901f\u5ea6\u5c31\u662f\u4f1a\u7565\u5fae\u6162\u4e8e\u76f4\u63a5\u4fee\u6539\u5b57\u6bb5\u5462\uff1f\u5148\u522b\u6025\uff0c\u6211\u4eec\u518d\u6765\u770b\u4e00\u770b JIT \u7f16\u8bd1\u540e\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">Program.&lt;Main&gt;$(System.String[])\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> L0000: mov ecx, 0x33a4ca1c\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> L0005: call 0x066f300c\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> L000a: mov dword ptr [eax+4], 0xa\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> L0011: mov dword ptr [eax+8], 0x14\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> L0018: ret\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c\u81ea\u52a8\u5c5e\u6027\u7684 setter \u5176\u5b9e\u4f1a\u88ab JIT \u7f16\u8bd1\u5668\u4f18\u5316\u6210\u76f4\u63a5\u7684\u5185\u5b58\u5199\u5165\u64cd\u4f5c\u3002\u8fd9\u5c31\u610f\u5473\u7740\uff0c\u5b9e\u9645\u4e0a\u5728\u8fd0\u884c\u65f6\uff0c\u4fee\u6539\u5c5e\u6027\u548c\u76f4\u63a5\u4fee\u6539\u5b57\u6bb5\u7684\u901f\u5ea6\u662f\u4e00\u6837\u7684\u3002\u6240\u4ee5\uff0c\u81ea\u52a8\u5c5e\u6027\u7684\u6027\u80fd\u548c\u516c\u5171\u5b57\u6bb5\u662f\u5b8c\u5168\u4e00\u6837\u7684\u3002\u5927\u5bb6\u5927\u53ef\u4ee5\u6253\u6d88\u8fd9\u4e2a\u987e\u8651\u4e86\u3002<\/p>\n<h2 id=\"net-9-\u5373\u5c06\u5230\u6765\u7684\u65b0\u8bed\u6cd5\u7279\u6027\">\n.NET 9 \u5373\u5c06\u5230\u6765\u7684\u65b0\u8bed\u6cd5\u7279\u6027\n<a href=\"#net-9-%e5%8d%b3%e5%b0%86%e5%88%b0%e6%9d%a5%e7%9a%84%e6%96%b0%e8%af%ad%e6%b3%95%e7%89%b9%e6%80%a7\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5982\u679c\u4f60\u8fd8\u5728\u72b9\u8c6b\u7684\u8bdd\uff0c\u6211\u8fd8\u53ef\u4ee5\u518d\u544a\u8bc9\u4f60\u4e00\u4e2a\u597d\u6d88\u606f\uff1a.NET 9\uff08C# 13\uff09\u5373\u5c06\u5f15\u5165\u4e00\u4e2a\u65b0\u8bed\u6cd5\u7279\u6027\uff1a<code>field<\/code> \u5173\u952e\u5b57\uff08\u8fd9\u4e2a\u5173\u952e\u5b57\u66fe\u7ecf\u5728 C# 11 \u7684\u65f6\u5019\u5c31\u91ca\u653e\u8fc7\u4fe1\u53f7\uff0c\u4f46\u56e0\u4e3a\u4e00\u4e9b\u539f\u56e0\u59d7\u59d7\u6765\u8fdf\uff09\u3002\u8fd9\u4e2a\u65b0\u7279\u6027\u53ef\u4ee5\u8ba9\u4f60\u66f4\u52a0\u65b9\u4fbf\u5730\u58f0\u660e\u4e00\u4e2a\u5c5e\u6027\u3002<\/p>\n<p>\u6211\u4eec\u90fd\u77e5\u9053\uff0c\u4ee5\u524d\u6211\u4eec\u5199\u5b8c\u6574\u5c5e\u6027\uff08<code>propfull<\/code>\uff09\u65f6\uff0c\u9700\u8981\u5199\u6210\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">_age<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_age<\/span> <span class=\"p\">\/<\/span> <span class=\"m\">2<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">set<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_age<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span> <span class=\"p\">*<\/span> <span class=\"m\">2<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u662f\u73b0\u5728\uff0c\u6709\u4e86 <code>field<\/code> \u5173\u952e\u5b57\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u5199\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">field<\/span> <span class=\"p\">\/<\/span> <span class=\"m\">2<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">set<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">field<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span> <span class=\"p\">*<\/span> <span class=\"m\">2<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u7684 <code>field<\/code> \u5c31\u76f8\u5f53\u4e8e\u90a3\u4e2a <code>_age<\/code> \u5b57\u6bb5\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u66f4\u52a0\u65b9\u4fbf\u5730\u58f0\u660e\u4e00\u4e2a\u5c5e\u6027\u4e86\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u901a\u8fc7\u4e0a\u9762\u7684\u8ba8\u8bba\uff0c\u76f8\u4fe1\u5927\u5bb6\u5bf9\u4e8e\u4e3a\u4ec0\u4e48\u6211\u4eec\u4e00\u822c\u4e0d\u4f7f\u7528\u516c\u5171\u5b57\u6bb5\uff0c\u800c\u662f\u9009\u62e9\u81ea\u52a8\u5c5e\u6027\u6709\u4e86\u66f4\u6df1\u7684\u7406\u89e3\u3002\u5f53\u7136\u4e86\uff0c\u8fd9\u5e76\u4e0d\u662f\u8bf4\u6211\u4eec\u5c31\u4e0d\u80fd\u4f7f\u7528\u516c\u5171\u5b57\u6bb5\u4e86\u3002\u5728\u4e00\u4e9b\u7279\u6b8a\u7684\u573a\u666f\u4e0b\uff0c\u6211\u4eec\u8fd8\u662f\u53ef\u4ee5\u4f7f\u7528\u516c\u5171\u5b57\u6bb5\u7684\u3002\u4f46\u662f\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u8fd8\u662f\u5e94\u8be5\u9009\u62e9\u81ea\u52a8\u5c5e\u6027\u3002<\/p>\n<p>C# \u540e\u9762\u4e0d\u65ad\u65b0\u589e\u7684\u8bed\u6cd5\u7279\u6027\uff0c\u4e00\u76f4\u5728\u4f18\u5316\u6211\u4eec\u4f7f\u7528\u5c5e\u6027\u7684\u4f53\u9a8c\u3002\u5728\u6bd4\u8f83\u65e7\u7684 C# \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u751a\u81f3\u4e0d\u80fd\u7ed9\u81ea\u52a8\u5c5e\u6027\u76f4\u63a5\u8d4b\u503c\uff0c\u800c\u662f\u9700\u8981\u901a\u8fc7\u6784\u9020\u51fd\u6570\u6765\u521d\u59cb\u5316\u3002\u4f46\u662f\u968f\u7740 C# \u7248\u672c\u7684\u4e0d\u65ad\u66f4\u65b0\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c\u81ea\u52a8\u5c5e\u6027\u7684\u4f7f\u7528\u53d8\u5f97\u8d8a\u6765\u8d8a\u65b9\u4fbf\u4e86\u3002\u9664\u4e86\u4e0a\u9762\u63d0\u5230\u7684\u5373\u5c06\u5230\u6765\u5730 <code>field<\/code> \u5173\u952e\u5b57\uff0c\u6211\u4eec\u5728 C# 9 \u8fd8\u8fce\u6765\u4e86\u8bb0\u5f55\u7c7b\u578b\uff0c\u5728 C# 12 \u53c8\u8fce\u6765\u4e86\u4e3b\u6784\u9020\u51fd\u6570\u3002\u8fd9\u4e9b\u90fd\u662f\u4e3a\u4e86\u8ba9\u6211\u4eec\u66f4\u52a0\u65b9\u4fbf\u5730\u4f7f\u7528\u5c5e\u6027\u3002<\/p>\n<p>\u76f8\u4fe1\u5927\u5bb6\u4eca\u540e\u53ef\u4ee5\u66f4\u52a0\u65e0\u5fe7\u65e0\u8651\u5730\u4f7f\u7528\u5c5e\u6027\u3002<\/p>"},{"title":"\u5982\u4f55\u5728 C# \u4e2d\u6a21\u62df Go \u7684 defer \u5173\u952e\u5b57\u5e76\u7528\u4e8e\u5ba2\u6237\u7aef\u5f00\u53d1","link":"https:\/\/blog.coldwind.top\/posts\/mimic-go-defer-in-csharp\/","pubDate":"Tue, 28 May 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/mimic-go-defer-in-csharp\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/05\/28\/WyuKtqiXZQ3pDEA.jpg\" alt=\"Featured image of post \u5982\u4f55\u5728 C# \u4e2d\u6a21\u62df Go \u7684 defer \u5173\u952e\u5b57\u5e76\u7528\u4e8e\u5ba2\u6237\u7aef\u5f00\u53d1\" \/><blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1Ym421T7CS\/\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<h2 id=\"go-\u4e2d\u7684-defer-\u5927\u6982\u662f\u600e\u4e48\u4e00\u56de\u4e8b\">\nGo \u4e2d\u7684 defer \u5927\u6982\u662f\u600e\u4e48\u4e00\u56de\u4e8b\n<a href=\"#go-%e4%b8%ad%e7%9a%84-defer-%e5%a4%a7%e6%a6%82%e6%98%af%e6%80%8e%e4%b9%88%e4%b8%80%e5%9b%9e%e4%ba%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p>Go \u8bed\u8a00\u4e2d\u6709\u4e00\u4e2a\u975e\u5e38\u597d\u7528\u7684 <code>defer<\/code> \u5173\u952e\u5b57\u3002<code>defer<\/code> \u4f1a\u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u6267\u884c\uff0c\u53ef\u4ee5\u7528\u6765\u91ca\u653e\u8d44\u6e90\uff0c\u5173\u95ed\u6587\u4ef6\u7b49\u3002\u6bd4\u5982\u6211\u4eec\u60f3\u6253\u5f00\u5e76\u8bfb\u53d6\u4e00\u4e2a\u5916\u90e8\u6587\u4ef6\u7684\u5185\u5bb9\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u5199\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">ReadFile<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">file<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">Open<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;file.txt&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5982\u679c\u6253\u5f00\u6587\u4ef6\u5931\u8d25\uff0c\u76f4\u63a5\u8fd4\u56de\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\"><\/span> <span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">log<\/span><span class=\"p\">.<\/span><span class=\"nf\">Fatal<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u5173\u95ed\u6587\u4ef6\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\"><\/span> <span class=\"k\">defer<\/span> <span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nf\">Close<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u8bfb\u53d6\u6587\u4ef6\u5185\u5bb9\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\"><\/span> <span class=\"nx\">content<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">make<\/span><span class=\"p\">([]<\/span><span class=\"kt\">byte<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1024<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nf\">Read<\/span><span class=\"p\">(<\/span><span class=\"nx\">content<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nb\">string<\/span><span class=\"p\">(<\/span><span class=\"nx\">content<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528 <code>defer<\/code> \u5173\u952e\u5b57\u6765\u786e\u4fdd\u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u5173\u95ed\u6587\u4ef6\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u7528\u62c5\u5fc3\u5fd8\u8bb0\u5173\u95ed\u6587\u4ef6\uff0c\u5bfc\u81f4\u8d44\u6e90\u6cc4\u6f0f\u3002<\/p>\n<p>\u5176\u5b9e\u5728 C# \u548c Python \u4e2d\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u501f\u52a9\u4e00\u4e9b\u7279\u6b8a\u7684\u8bed\u6cd5\u6765\u5b9e\u73b0\u7c7b\u4f3c\u7684\u6548\u679c\u3002\u6bd4\u5982\u5728 C# \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>using<\/code> \u5173\u952e\u5b57\u6765\u786e\u4fdd\u8d44\u6e90\u5728\u4f7f\u7528\u5b8c\u4e4b\u540e\u88ab\u91ca\u653e\uff1b\u5728 Python \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>with<\/code> \u5173\u952e\u5b57\u6765\u786e\u4fdd\u8d44\u6e90\u5728\u4f7f\u7528\u5b8c\u4e4b\u540e\u88ab\u91ca\u653e\u3002<\/p>\n<p>\u4f46\u6709\u4e9b\u65f6\u5019\uff0c\u6211\u4eec\u60f3\u8981\u5b9e\u73b0\u7684\u529f\u80fd\u53ea\u662f\u5e0c\u671b\u5728\u79bb\u5f00\u4f5c\u7528\u57df\u4e4b\u524d\u6267\u884c\u4e00\u4e9b\u4ee3\u7801\uff0c\u800c\u4e0d\u662f\u91ca\u653e\u8d44\u6e90\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u501f\u52a9 <code>using<\/code> \u5173\u952e\u5b57\u6765\u5b9e\u73b0\uff0c\u53ef\u4ee5\u4e3a\u6211\u4eec\u5e26\u6765\u610f\u60f3\u4e0d\u5230\u7684\u4fbf\u5229\u3002<\/p>\n<h2 id=\"\u5728-c-\u4e2d\u6a21\u62df-go-\u7684-defer\">\n\u5728 C# \u4e2d\u6a21\u62df Go \u7684 defer\n<a href=\"#%e5%9c%a8-c-%e4%b8%ad%e6%a8%a1%e6%8b%9f-go-%e7%9a%84-defer\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u524d\u9762\u5df2\u7ecf\u63d0\u5230\uff0c\u6211\u4eec\u9700\u8981\u5728 C# \u4e2d\u4f7f\u7528 <code>using<\/code> \u5173\u952e\u5b57\u6765\u6a21\u62df Go \u7684 <code>defer<\/code>\u3002\u4f46\u662f <code>using<\/code> \u5173\u952e\u5b57\u53ea\u80fd\u7528\u4e8e\u201c\u91ca\u653e\u8d44\u6e90\u201d\uff0c\u6216\u8005\u8bf4\u9700\u8981\u5bf9\u4e00\u4e2a\u5b9e\u73b0\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\u7684\u5bf9\u8c61\u8fdb\u884c\u64cd\u4f5c\u3002\u90a3\u4e48\u6211\u4eec\u5c31\u5fc5\u987b\u5b9e\u73b0 <code>Dispose<\/code> \u76f8\u5173\u7684\u903b\u8f91\u4e86\u3002\u8bdd\u867d\u5982\u6b64\uff0c\u5e76\u6ca1\u6709\u4eba\u89c4\u5b9a\u6211\u4eec\u5fc5\u987b\u5728 <code>Dispose<\/code> \u65b9\u6cd5\u4e2d\u6267\u884c\u91ca\u653e\u8d44\u6e90\u7684\u903b\u8f91\u3002\u6bd4\u5982\u6211\u4eec\u524d\u9762\u63d0\u5230\u7684\uff0c\u5e0c\u671b\u5728\u79bb\u5f00\u4f5c\u7528\u57df\u4e4b\u524d\u6267\u884c\u4e00\u4e9b\u4ee3\u7801\uff0c\u5c31\u53ef\u4ee5\u653e\u5728 <code>Dispose<\/code> \u65b9\u6cd5\u4e2d\u53bb\u6267\u884c\u3002<\/p>\n<p>\u57fa\u4e8e\u8fd9\u4e2a\u601d\u8def\uff0c\u6211\u4eec\u53ef\u4ee5\u5199\u51fa\u8fd9\u6837\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MyDisposable<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IDisposable<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Action<\/span> <span class=\"n\">_callback<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MyDisposable<\/span><span class=\"p\">(<\/span><span class=\"n\">Action<\/span> <span class=\"n\">callback<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_this<\/span><span class=\"p\">.<\/span><span class=\"n\">_callback<\/span> <span class=\"p\">=<\/span> <span class=\"n\">callback<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Dispose<\/span><span class=\"p\">()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_callback<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 <code>Dispose<\/code> \u65b9\u6cd5\u4e2d\u6267\u884c\u6211\u4eec\u60f3\u8981\u6267\u884c\u7684\u4ee3\u7801\u4e86\u3002\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u4f7f\u7528\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">void<\/span> <span class=\"n\">Foo<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">md<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MyDisposable<\/span><span class=\"p\">(()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Job is done.&#34;<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Do something<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\u8fd8\u7528\u5230\u4e86 C# 8.0 \u7684\u65b0\u7279\u6027\uff1a<code>using<\/code> \u8bed\u6cd5\u7684\u6539\u8fdb\u3002\u5728 C# 8.0 \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u7701\u7565 <code>using<\/code> \u8bed\u53e5\u4e2d\u7684\u5927\u62ec\u53f7\uff0c\u76f4\u63a5\u5728 <code>using<\/code> \u8bed\u53e5\u540e\u9762\u5199\u4e00\u4e2a\u8868\u8fbe\u5f0f\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u66f4\u52a0\u7b80\u6d01\u5730\u4f7f\u7528 <code>using<\/code> \u8bed\u6cd5\u4e86\u3002<\/p>\n<p>\u5b83\u5b9e\u9645\u5bf9\u5e94\u7684\u5e95\u5c42 C# \u4ee3\u7801\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">void<\/span> <span class=\"n\">Foo<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">MyDisposable<\/span> <span class=\"n\">md<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MyDisposable<\/span><span class=\"p\">(()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Job is done.&#34;<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">try<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Do something<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">finally<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">md<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">md<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6240\u4ee5\u53ef\u4ee5\u4fdd\u8bc1 <code>finally<\/code> \u8bed\u53e5\u4e2d\u7684\u4ee3\u7801\u4e00\u5b9a\u4f1a\u88ab\u6267\u884c\uff0c\u5373\u4f7f\u5728 <code>try<\/code> \u8bed\u53e5\u4e2d\u629b\u51fa\u4e86\u5f02\u5e38\u3002<\/p>\n<h2 id=\"\u8fd9\u4e00\u6280\u5de7\u5728-wpf-\u5f00\u53d1\u4e2d\u7684\u5999\u7528\">\n\u8fd9\u4e00\u6280\u5de7\u5728 WPF \u5f00\u53d1\u4e2d\u7684\u5999\u7528\n<a href=\"#%e8%bf%99%e4%b8%80%e6%8a%80%e5%b7%a7%e5%9c%a8-wpf-%e5%bc%80%e5%8f%91%e4%b8%ad%e7%9a%84%e5%a6%99%e7%94%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5176\u5b9e\u8fd9\u4e2a\u5c0f\u5999\u62db\u5e76\u4e0d\u662f\u6211\u7684\u539f\u521b\uff0c\u800c\u662f\u6cb9\u7ba1\u4e0a\u7684 <a class=\"link\" href=\"https:\/\/www.youtube.com\/@jason-williams\" target=\"_blank\" rel=\"noopener\"\n>Jason Williams<\/a> \u5728\u4ed6\u7684<a class=\"link\" href=\"https:\/\/www.youtube.com\/watch?v=DOtS7IOtACI\" target=\"_blank\" rel=\"noopener\"\n>\u4e00\u671f\u89c6\u9891<\/a>\u4e2d\u63d0\u5230\u7684\u3002\u5728\u4ed6\u7684\u89c6\u9891\u4e2d\uff0c\u4ed6\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7edd\u5999\u7684\u70b9\u5b50\u3002<\/p>\n<p>\u6211\u4eec\u5728\u505a WPF\uff08\u4ee5\u53ca\u5176\u4ed6\u8bf8\u5982 Win UI\u3001Avalonia \u7b49\uff09\u7684\u5ba2\u6237\u7aef\u5f00\u53d1\u65f6\uff0c\u7ecf\u5e38\u4f1a\u9047\u5230\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u9700\u8981\u53bb\u7ba1\u7406\u4e00\u4e2a\u8fdb\u5ea6\u6761\u7684\u53ef\u89c1\u72b6\u6001\u3002\u6bd4\u5982\u6211\u4eec\u73b0\u5728\u6709\u4e00\u4e2a\u5f02\u6b65\u4efb\u52a1\uff0c\u6211\u4eec\u5e0c\u671b\u4efb\u52a1\u5728\u6267\u884c\u671f\u95f4\u80fd\u591f\u663e\u793a\u4e00\u4e2a\u8fdb\u5ea6\u6761\uff0c\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\uff08\u4e0d\u7ba1\u6210\u529f\u4e0e\u5426\uff09\u540e\u8fdb\u5ea6\u6761\u6d88\u5931\u3002\u901a\u5e38\u6211\u4eec\u7684\u505a\u6cd5\u662f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6a21\u62df\u641c\u7d22\u7535\u5f71\u7684\u5f02\u6b65\u4efb\u52a1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">IsBusy<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u63a7\u5236\u8fdb\u5ea6\u6761\u662f\u5426\u53ef\u89c1\uff0c\u4e14\u8be5\u5c5e\u6027\u5177\u5907\u901a\u77e5\u529f\u80fd<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">SearchMovieAsync<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">movieName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">IsBusy<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"n\">CanSearch<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">IsBusy<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">resList<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">SearchMoviesFromInternetAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">movieName<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">resList<\/span> <span class=\"p\">==<\/span> <span class=\"kc\">null<\/span> <span class=\"p\">||<\/span> <span class=\"n\">resList<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">==<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">IsBusy<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">res<\/span> <span class=\"k\">in<\/span> <span class=\"n\">resList<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Do something<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">IsBusy<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53ef\u4ee5\u770b\u5230\uff0c\u6211\u4eec\u5728\u65b9\u6cd5\u4e2d\u9700\u8981\u591a\u6b21\u6839\u636e\u60c5\u51b5\u8bbe\u7f6e <code>IsBusy<\/code> \u5c5e\u6027\u3002\u8fd9\u6837\u7684\u4ee3\u7801\u770b\u8d77\u6765\u4e0d\u592a\u4f18\u96c5\u3002\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u7528\u4e0a\u524d\u9762\u5b9e\u73b0\u7684\u7c7b\u4e86\u3002\u4e0d\u8fc7\u6211\u4eec\u9700\u8981\u7a0d\u5fae\u4fee\u6539\u4e00\u4e0b\uff0c\u4f7f\u5b83\u7684\u56de\u8c03\u51fd\u6570\u53ef\u4ee5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">BusyDisposable<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IDisposable<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Action<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">bool<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_busySetter<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">BusyDisposable<\/span><span class=\"p\">(<\/span><span class=\"n\">Action<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">bool<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">busySetter<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_busySetter<\/span> <span class=\"p\">=<\/span> <span class=\"n\">busySetter<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_busySetter<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Dispose<\/span><span class=\"p\">()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_busySetter<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u8fd9\u6837\u4f7f\u7528\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">SearchMovieAsync<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">movieName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">_<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BusyDisposable<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">IsBusy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"n\">CanSearch<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">resList<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">SearchMoviesFromInternetAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">movieName<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">resList<\/span> <span class=\"p\">==<\/span> <span class=\"kc\">null<\/span> <span class=\"p\">||<\/span> <span class=\"n\">resList<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">==<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">res<\/span> <span class=\"k\">in<\/span> <span class=\"n\">resList<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Do something<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\"><p>\u8fd9\u91cc\u6709\u4e00\u4e2a\u9700\u8981\u6ce8\u610f\u7684\u70b9\uff1a\u6211\u4eec\u662f\u5728 ViewModel \u4e2d\u5bf9 <code>IsBusy<\/code> \u8fdb\u884c\u7684\u64cd\u4f5c\uff0c\u5e76\u501f\u52a9\u7ed1\u5b9a\u6765\u63a7\u5236\u524d\u53f0\u8fdb\u5ea6\u6761\u7684\u663e\u793a\u3002<strong>\u8fd9\u65e0\u5f62\u4e2d\u5e2e\u52a9\u6211\u4eec\u89e3\u51b3\u4e86\u4e00\u4e2a\u91cd\u8981\u7684\u9690\u60a3\uff1a\u7ebf\u7a0b\u5b89\u5168<\/strong>\u3002\u5373\u4fbf\u6211\u4eec\u5728\u975e UI \u7ebf\u7a0b\u4e2d\u4fee\u6539\u4e86 <code>IsBusy<\/code> \u5c5e\u6027\uff0c\u7531\u4e8e WPF \u7684\u6570\u636e\u7ed1\u5b9a\u673a\u5236\uff0c\u6211\u4eec\u4e5f\u4e0d\u7528\u62c5\u5fc3\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u3002<\/p>\n<p>\u4f46\u5982\u679c\u662f\u5728 View \u4e2d\u53bb\u76f4\u63a5\u64cd\u4f5c\u8fdb\u5ea6\u6761\u7684 <code>Visibility<\/code> \u5c5e\u6027\uff0c\u90a3\u4e48\u5c31\u53ef\u80fd\u9700\u8981\u6211\u4eec\u81ea\u5df1\u53bb\u5904\u7406\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898\u4e86\u3002\u5e38\u89c1\u7684\u65b9\u5f0f\u6bd4\u5982\u4f7f\u7528 <code>Dispatcher<\/code>\uff0c\u6216\u53c2\u8003\u6211\u7684\u8fd9\u7bc7 <a class=\"link\" href=\"https:\/\/blog.coldwind.top\/posts\/how-to-report-progress\" >\u5173\u4e8e\u4f7f\u7528 IProgress \u7684\u6587\u7ae0<\/a>\u3002<\/p><\/div>\n<\/div>\n<p>\u76f8\u4fe1\u5927\u5bb6\u7acb\u523b\u5c31\u80fd\u591f\u660e\u767d\u8fd9\u4e2a\u65b9\u5f0f\u6709\u591a\u4e48\u7b80\u6d01\u548c\u4f18\u96c5\u4e86\u3002\u6211\u4eec\u901a\u8fc7\u4f7f\u7528 <code>using<\/code> \u5173\u952e\u5b57\uff0c\u4fdd\u8bc1\u4e86\u5f53\u524d\u4f5c\u7528\u57df\u4e2d\u7684\u4ee3\u7801\u4e0d\u7ba1\u662f\u6b63\u5e38\u6267\u884c\u8fd8\u662f\u5f02\u5e38\u9000\u51fa\uff0c\u90fd\u4f1a\u5728\u79bb\u5f00\u4f5c\u7528\u57df\u4e4b\u524d\u6267\u884c <code>IsBusy = false<\/code> \u8fd9\u4e00\u884c\u4ee3\u7801\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u7528\u5728\u65b9\u6cd5\u4e2d\u591a\u6b21\u8bbe\u7f6e <code>IsBusy<\/code> \u5c5e\u6027\u4e86\u3002<\/p>\n<p>\u751a\u81f3\u6211\u4eec\u8fd8\u80fd\u518d\u7a0d\u5fae\u4f18\u5316\u4e00\u4e0b\uff0c\u6bd4\u5982\u4f7f\u7528\u4e00\u4e2a\u81ea\u52a8\u5c5e\u6027\u6765\u7b80\u5316 <code>BusyDisposable<\/code> \u7684\u5b9e\u4f8b\u5316\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"n\">BusyDisposable<\/span> <span class=\"n\">NewBusyDisposable<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BusyDisposable<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">IsBusy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">SearchMovieAsync<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">movieName<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">_<\/span> <span class=\"p\">=<\/span> <span class=\"n\">NewBusyDisposable<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u8fdb\u4e00\u6b65\u7b80\u5316\u8fd9\u4e00\u8bed\u6cd5\uff0c\u4ece\u800c\u4f7f\u5176\u66f4\u63a5\u8fd1 Go \u8bed\u8a00\u4e2d\u7684 <code>defer<\/code> \u5173\u952e\u5b57\u7684\u4f7f\u7528\u65b9\u5f0f\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u672c\u671f\u5185\u5bb9\u4e3b\u8981\u4ecb\u7ecd\u4e86 Go \u8bed\u8a00\u4e2d\u7684 <code>defer<\/code> \u5173\u952e\u5b57\uff0c\u4ee5\u53ca\u5982\u4f55\u5728 C# \u4e2d\u6a21\u62df <code>defer<\/code> \u7684\u5b9e\u73b0\u3002\u867d\u7136\u6211\u4eec\u4f3c\u4e4e\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u201c\u6ee5\u7528\u201d\u4e86 <code>using<\/code> \u5173\u952e\u5b57\u4ee5\u53ca <code>IDisposable<\/code> \u63a5\u53e3\uff0c\u4f46\u8fd9\u79cd\u65b9\u5f0f\u786e\u5b9e\u53ef\u4ee5\u5e26\u6765\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u4fbf\u5229\u3002<\/p>\n<p>\u6cb9\u7ba1\u4e0a\u7684\u8fd9\u4f4d Jason Williams \u4e5f\u7edd\u5bf9\u662f\u4e00\u4f4d\u5927\u795e\u3002\u867d\u7136\u4ed6\u89c6\u9891\u975e\u5e38\u5c11\uff0c\u7c89\u4e1d\u4e5f\u53ea\u6709\u51e0\u767e\uff0c\u4f46\u662f\u6bcf\u671f\u5185\u5bb9\u90fd\u582a\u79f0\u7cbe\u54c1\u3002\u5927\u5bb6\u6709\u673a\u4f1a\u7684\u8bdd\u4e5f\u53ef\u4ee5\u53bb\u5173\u6ce8\u4e00\u4e0b\u4ed6\uff0c\u76f8\u4fe1\u4e00\u5b9a\u4f1a\u6709\u6240\u6536\u83b7\u3002<\/p>"},{"title":"\u5982\u4f55\u5728\u5f02\u6b65\u4efb\u52a1\u4e2d\u6c47\u62a5\u8fdb\u5ea6","link":"https:\/\/blog.coldwind.top\/posts\/how-to-report-progress\/","pubDate":"Thu, 09 May 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/how-to-report-progress\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/05\/09\/RJYeMSKs5q6UdQn.jpg\" alt=\"Featured image of post \u5982\u4f55\u5728\u5f02\u6b65\u4efb\u52a1\u4e2d\u6c47\u62a5\u8fdb\u5ea6\" \/><blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1SD421P76s\/\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<p>\u5728\u6267\u884c\u5f02\u6b65\u4efb\u52a1\u65f6\uff0c\u6709\u65f6\u5019\u6211\u4eec\u4f1a\u5e0c\u671b\u6709\u529e\u6cd5\u6c47\u62a5\u8fdb\u5ea6\u3002\u6bd4\u5982\u5728\u4e00\u4e2a WPF \u7a0b\u5e8f\u4e2d\uff0c\u6211\u4eec\u5728\u754c\u9762\u4e0a\u653e\u4e86\u4e00\u4e2a\u8fdb\u5ea6\u6761\uff0c\u4ece\u800c\u5c55\u793a\u5f53\u524d\u4efb\u52a1\u7684\u8fdb\u5ea6\u3002\u90a3\u4e48\u8be5\u5982\u4f55\u6c47\u62a5\u5f02\u6b65\u4efb\u52a1\u7684\u8fdb\u5ea6\u5462\uff1f<\/p>\n<p>\u5176\u5b9e .NET \u6807\u51c6\u5e93\u5c31\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u5b9e\u73b0\u8fd9\u4e00\u529f\u80fd\u7684\u63a5\u53e3\u548c\u7c7b\uff1a<code>IProgress&lt;T&gt;<\/code> \u4e0e <code>Progress&lt;T&gt;<\/code>\uff0c\u5176\u4e2d <code>T<\/code> \u662f\u4e00\u4e2a\u6cdb\u578b\u7c7b\u578b\uff0c\u8868\u793a\u8981\u6c47\u62a5\u7684\u5185\u5bb9\u3002\u5982\u679c\u6211\u4eec\u5e0c\u671b\u6c47\u62a5\u4e00\u4e2a\u767e\u5206\u6bd4\u8fdb\u5ea6\uff0c\u90a3\u4e48\u4f7f\u7528 <code>double<\/code> \u7c7b\u578b\u5373\u53ef\uff1b\u7c7b\u4f3c\u5730\uff0c\u5982\u679c\u6211\u4eec\u5e0c\u671b\u6c47\u62a5\u4e00\u4e9b\u66f4\u52a0\u590d\u6742\u7684\u5185\u5bb9\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528 <code>string<\/code> \u751a\u81f3\u4e00\u4e9b\u81ea\u5b9a\u4e49\u7c7b\u4e0e\u7ed3\u6784\u4f53\u3002<\/p>\n<p>\u4e0b\u9762\u6211\u4eec\u5c31\u6765\u770b\u770b\u8be5\u5982\u4f55\u4f7f\u7528\u5427\u3002<\/p>\n<h2 id=\"\u642d\u5efa\u9879\u76ee\">\n\u642d\u5efa\u9879\u76ee\n<a href=\"#%e6%90%ad%e5%bb%ba%e9%a1%b9%e7%9b%ae\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u7b80\u6613\u7684 WPF \u9879\u76ee\u3002\u56e0\u4e3a\u8fd9\u6b21\u7684\u4efb\u52a1\u6bd4\u8f83\u7b80\u5355\uff0c\u6240\u4ee5\u6211\u4eec\u5c31\u4e0d\u9075\u5faa MVVM \u6a21\u5f0f\u4e86\uff0c\u800c\u662f\u4f7f\u7528\u6700\u4f20\u7edf\u7684 WPF \u4e8b\u4ef6\u6ce8\u518c\u7684\u65b9\u5f0f\u3002<\/p>\n<p>\u5b83\u7684 <code>MainWindow<\/code> \u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;StackPanel<\/span> <span class=\"na\">VerticalAlignment=<\/span><span class=\"s\">&#34;Center&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Button<\/span> <span class=\"na\">Width=<\/span><span class=\"s\">&#34;100&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Margin=<\/span><span class=\"s\">&#34;0,0,0,10&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Content=<\/span><span class=\"s\">&#34;Run&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Click=<\/span><span class=\"s\">&#34;Button_Click&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;ProgressBar<\/span> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;20&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">d:Value=<\/span><span class=\"s\">&#34;10&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Name=<\/span><span class=\"s\">&#34;progressBar&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/StackPanel&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u5728 <code>MainWindow.xaml.cs<\/code> \u4e2d\u5b9e\u73b0\u4e00\u4e9b\u7b80\u5355\u7684\u903b\u8f91\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainWindow<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Window<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainWindow<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">InitializeComponent<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kd\">async<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Button_Click<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">RoutedEventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">DoJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">CancellationToken<\/span><span class=\"p\">.<\/span><span class=\"n\">None<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">DoJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">CancellationToken<\/span> <span class=\"n\">token<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">.<\/span><span class=\"n\">IsCancellationRequested<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"p\">&lt;<\/span> <span class=\"m\">100<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span><span class=\"p\">++)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"m\">50<\/span><span class=\"p\">,<\/span> <span class=\"n\">token<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">progressBar<\/span><span class=\"p\">.<\/span><span class=\"n\">Value<\/span> <span class=\"p\">=<\/span> <span class=\"n\">i<\/span> <span class=\"p\">+<\/span> <span class=\"m\">1<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">.<\/span><span class=\"n\">IsCancellationRequested<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u5c06\u6309\u94ae\u6ce8\u518c\u7684 <code>Button_Click<\/code> \u65b9\u6cd5\u4fee\u6539\u4e3a <code>async void<\/code>\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u91cc\u9762\u7b49\u5f85\u4e00\u4e2a\u5f02\u6b65\u4efb\u52a1\u4e86\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u867d\u7136 <code>async void<\/code> \u662f\u4e00\u79cd\u975e\u5e38\u5371\u9669\u7684\u65b9\u5f0f\uff0c\u4f46\u56e0\u4e3a <code>Button<\/code> \u63a7\u4ef6\u7684 <code>Click<\/code> \u4e8b\u4ef6\u5bf9\u5e94\u59d4\u6258\u5bf9\u4e8e\u51fd\u6570\u4f20\u53c2\u53ca\u8fd4\u56de\u503c\u7684\u9650\u5236\uff0c\u8fd9\u91cc\u6211\u4eec\u4e0d\u5f97\u4e0d\u8fd9\u6837\u505a\u3002<\/div>\n<\/div>\n<p>\u7136\u540e\uff0c\u6211\u4eec\u5728 <code>DoJobAsync<\/code> \u4e2d\u5b9e\u73b0\u540e\u53f0\u7684\u5f02\u6b65\u4efb\u52a1\u3002\u8fd9\u91cc\u6211\u4eec\u7b80\u5355\u5730\u4f7f\u7528\u4e00\u4e2a <code>for<\/code> \u5faa\u73af\uff0c\u5e76\u5728\u5176\u4e2d\u4f7f\u7528 <code>Task.Delay<\/code>\uff0c\u4ece\u800c\u5b9e\u73b0\u4e00\u4e2a\u62e5\u6709\u8fdb\u5ea6\u7684\u5f02\u6b65\u4efb\u52a1\u3002\u7136\u540e\uff0c\u6211\u4eec\u5728\u6bcf\u6b21\u5faa\u73af\u4e2d\u76f4\u63a5\u4fee\u6539 <code>progressBar<\/code> \u63a7\u4ef6\u7684\u503c\u3002\u8fd0\u884c\u7a0b\u5e8f\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u770b\u5230\u6548\u679c\u4e86\uff1a<\/p>\n<p><img src=\"https:\/\/s2.loli.net\/2024\/05\/09\/F6o97PzSaO4kiDc.gif\"\nloading=\"lazy\"\nalt=\"\u52a8\u753b\"\n><\/p>\n<p>\u8fd9\u4e2a\u95ee\u9898\u96be\u9053\u5c31\u8fd9\u4e48\u8f7b\u677e\u5730\u5c31\u89e3\u51b3\u4e86\u5417\uff1f\u5176\u5b9e\u4e0d\u662f\u7684\uff0c\u56e0\u4e3a\u5728\u5f02\u6b65\u4efb\u52a1\u4e2d\uff0c\u5f88\u53ef\u80fd\u4f1a\u51fa\u73b0\u5728\u522b\u7684\u7ebf\u7a0b\u4e2d\u64cd\u4f5c UI \u7ebf\u7a0b\u7684\u8d44\u6e90\uff08\u4e5f\u5c31\u662f\u63a7\u4ef6\u53ca\u5176\u5c5e\u6027\uff09\uff0c\u8fd9\u79cd\u60c5\u51b5\u4e0b\u7a0b\u5e8f\u4f1a\u62a5\u9519\u3002\u6240\u4ee5\u5982\u679c\u4f7f\u7528\u8fd9\u6837\u7684\u65b9\u5f0f\uff0c\u901a\u5e38\u6211\u4eec\u8fd8\u9700\u8981\u4f7f\u7528\u8001\u5957\u7684 <code>Dispatcher.Invoke<\/code> \u7684\u65b9\u5f0f\u6765\u89c4\u907f\u8fd9\u4e2a\u95ee\u9898\u3002\u4f46\u8fd9\u6837\u5c31\u663e\u5f97\u4e0d\u591f\u4f18\u96c5\u4e86\u3002<\/p>\n<p>\u90a3\u4e48\u540c\u6837\u7684\u529f\u80fd\uff0c\u6211\u4eec\u8be5\u5982\u4f55\u4f7f\u7528 <code>Progress<\/code> \u7c7b\u6765\u5b9e\u73b0\u5462\uff1f<\/p>\n<h2 id=\"\u4f7f\u7528-progress-\u7c7b\">\n\u4f7f\u7528 Progress \u7c7b\n<a href=\"#%e4%bd%bf%e7%94%a8-progress-%e7%b1%bb\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u6211\u4eec\u9700\u8981\u7a0d\u7a0d\u4fee\u6539\u4e00\u4e0b <code>DoJobAsync<\/code> \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span> <span class=\"n\">DoJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">IProgress<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">double<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">reporter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CancellationToken<\/span> <span class=\"n\">token<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"p\">&lt;<\/span> <span class=\"m\">100<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span><span class=\"p\">++)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">.<\/span><span class=\"n\">IsCancellationRequested<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"m\">50<\/span><span class=\"p\">,<\/span> <span class=\"n\">token<\/span><span class=\"p\">).<\/span><span class=\"n\">ConfigureAwait<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">reporter<\/span><span class=\"p\">.<\/span><span class=\"n\">Report<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span> <span class=\"p\">+<\/span> <span class=\"m\">1<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">token<\/span><span class=\"p\">.<\/span><span class=\"n\">IsCancellationRequested<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\uff0c\u8fd9\u4e2a <code>Progress<\/code> \u7c7b\u7684\u5b9e\u4f8b\u6765\u81ea\u54ea\u513f\u5462\uff1f\u6211\u4eec\u518d\u4fee\u6539\u4e00\u4e0b <code>Button_Click<\/code> \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"kd\">async<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Button_Click<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">RoutedEventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">reporter<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Progress<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">double<\/span><span class=\"p\">&gt;(<\/span><span class=\"k\">value<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">progressBar<\/span><span class=\"p\">.<\/span><span class=\"n\">Value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">DoJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">reporter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CancellationToken<\/span><span class=\"p\">.<\/span><span class=\"n\">None<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5c31\u8fd9\u6837\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5728\u4f7f\u7528\u7684\u65f6\u5019\u5b9e\u4f8b\u5316\u4e00\u4e2a\u65b0\u7684\u5373\u53ef\u3002\u5b83\u9664\u4e86\u6211\u4eec\u524d\u9762\u63d0\u5230\u7684\u6cdb\u578b\uff0c\u8fd8\u4f20\u5165\u4e86\u4e00\u4e2a\u56de\u8c03\u51fd\u6570\uff0c\u8868\u793a\u6bcf\u6b21 <code>Report<\/code> \u65f6\u9700\u8981\u6267\u884c\u7684\u903b\u8f91\u3002\u8fd9\u91cc\u7684\u903b\u8f91\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u5c06\u4f20\u5165\u7684 <code>double<\/code> \u7c7b\u578b\u7684\u6570\u5b57\u8d4b\u503c\u7ed9\u8fdb\u5ea6\u6761\u7684 <code>Value<\/code> \u5c5e\u6027\u5373\u53ef\u3002<\/p>\n<p>\u90a3\u4e48\u95ee\u9898\u6765\u4e86\uff1a\u5b83\u662f\u5982\u4f55\u89c4\u907f\u4e86\u524d\u9762\u63d0\u5230\u7684\u7ebf\u7a0b\u95ee\u9898\u7684\u5462\uff1f\u6211\u4eec\u89c2\u5bdf <code>Progress<\/code> \u7c7b\u7684<a class=\"link\" href=\"https:\/\/source.dot.net\/#System.Private.CoreLib\/src\/libraries\/System.Private.CoreLib\/src\/System\/Progress.cs,d23df0450d3fd0d6\" target=\"_blank\" rel=\"noopener\"\n>\u6e90\u4ee3\u7801<\/a>\uff0c\u53ef\u4ee5\u53d1\u73b0\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"n\">Progress<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ Capture the current synchronization context.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ If there is no current context, we use a default instance targeting the ThreadPool.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_synchronizationContext<\/span> <span class=\"p\">=<\/span> <span class=\"n\">SynchronizationContext<\/span><span class=\"p\">.<\/span><span class=\"n\">Current<\/span> <span class=\"p\">??<\/span> <span class=\"n\">ProgressStatics<\/span><span class=\"p\">.<\/span><span class=\"n\">DefaultContext<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Debug<\/span><span class=\"p\">.<\/span><span class=\"n\">Assert<\/span><span class=\"p\">(<\/span><span class=\"n\">_synchronizationContext<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_invokeHandlers<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">SendOrPostCallback<\/span><span class=\"p\">(<\/span><span class=\"n\">InvokeHandlers<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u5b83\u7684\u6784\u9020\u51fd\u6570\u4e2d\uff0c\u62e5\u6709\u4e00\u4e2a <code>SynchronizationContext<\/code> \u5bf9\u8c61\uff0c\u5b83\u6301\u6709\u4e86\u5f53\u524d\u7684\u540c\u6b65\u4e0a\u4e0b\u6587\u3002\u5f53\u6211\u4eec\u5728 <code>Button_Click<\/code> \u65b9\u6cd5\u4e2d\u58f0\u660e\u5b83\u65f6\uff0c\u56e0\u4e3a\u8fd8\u5728 UI \u7ebf\u7a0b\uff0c\u6240\u4ee5\u5b83\u5c31\u4fdd\u5b58\u4e86\u8fd9\u4e2a\u4e0a\u4e0b\u6587\u3002\u7136\u540e\u5728\u5b83\u7684 <code>Report<\/code> \u65b9\u6cd5\u88ab\u8c03\u7528\u65f6\uff0c\u5c31\u4f1a\u5728\u6b63\u786e\u7684\u540c\u6b65\u4e0a\u4e0b\u6587\uff08\u4e5f\u5c31\u662f UI \u7ebf\u7a0b\uff09\u4e2d\u6267\u884c\u76f8\u5173\u903b\u8f91\u4e86\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u9664\u4e86\u7ed9\u6784\u9020\u51fd\u6570\u4f20\u56de\u8c03\uff0c<code>Progress<\/code> \u7c7b\u8fd8\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a <code>ProgressChanged<\/code> \u4e8b\u4ef6\u3002\u6ce8\u518c\u8fd9\u4e2a\u4e8b\u4ef6\u53ef\u4ee5\u5b9e\u73b0\u76f8\u540c\u7684\u6548\u679c\uff0c\u5e76\u4e14\u4e5f\u662f\u5728\u76f8\u540c\u7684\u540c\u6b65\u4e0a\u4e0b\u6587\u6267\u884c\u7684\u3002<\/div>\n<\/div>\n<h2 id=\"\u5b9e\u73b0\u81ea\u5b9a\u4e49-progress-\u7c7b\">\n\u5b9e\u73b0\u81ea\u5b9a\u4e49 Progress \u7c7b\n<a href=\"#%e5%ae%9e%e7%8e%b0%e8%87%aa%e5%ae%9a%e4%b9%89-progress-%e7%b1%bb\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5982\u679c\u6211\u4eec\u8fd8\u6709\u5176\u4ed6\u989d\u5916\u7684\u9700\u6c42\uff0c\u90a3\u4e48\u6211\u4eec\u8fd8\u53ef\u4ee5\u81ea\u5df1\u5b9e\u73b0\u63a5\u53e3\uff0c\u6216\u8005\u7ee7\u627f <code>Progress<\/code> \u7c7b\u3002\u5b98\u65b9\u7279\u610f\u6ca1\u6709\u5c06\u8fd9\u4e2a\u7c7b\u8bbe\u4e3a <code>sealed<\/code>\uff0c\u5e76\u4e14\u5c06 <code>OnReport<\/code> \u65b9\u6cd5\u8bbe\u4e3a <code>virtual<\/code>\uff0c\u5c31\u662f\u4e3a\u4e86\u6ee1\u8db3\u6211\u4eec\u7684\u8fd9\u4e9b\u9700\u6c42\u3002<\/p>\n<div class=\"notice note\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-sticky-note\" aria-hidden=\"true\"><\/i>Note\n<\/div>\n<div class=\"notice-content\">\u4f46\u662f\u5982\u679c\u6211\u4eec\u53bb\u7ee7\u627f\u8fd9\u4e2a <code>Progress<\/code> \u7c7b\uff0c\u4f1a\u53d1\u73b0\u5176\u5b9e\u6211\u4eec\u80fd\u81ea\u7531\u53d1\u6325\u7684\u7a7a\u95f4\u5e76\u4e0d\u5927\uff0c\u56e0\u4e3a\u5b83\u5176\u4e2d\u7684\u5f88\u591a\u5b57\u6bb5\uff08\u5c24\u5176\u662f\u540c\u6b65\u4e0a\u4e0b\u6587\uff09\u90fd\u662f <code>private<\/code> \u7684\uff0c\u6240\u4ee5\u6211\u4eec\u80fd\u505a\u7684\u4e8b\u60c5\u57fa\u672c\u4e0a\u4e5f\u53ea\u6709\u91cd\u5199 <code>OnReport<\/code> \u65b9\u6cd5\u4e86\u3002<\/div>\n<\/div>\n<p>\u6bd4\u5982\u8fd9\u91cc\u6211\u5199\u4e86\u4e00\u4e2a\u5b50\u7c7b\uff0c\u4ece\u800c\u53ef\u4ee5\u5728\u8fdb\u5ea6\u5b8c\u6210\u540e\u6267\u884c\u4e00\u4e2a\u56de\u8c03\u65b9\u6cd5\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyProgress<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Progress<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"k\">where<\/span> <span class=\"n\">T<\/span> <span class=\"p\">:<\/span> <span class=\"n\">notnull<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Action<\/span><span class=\"p\">?<\/span> <span class=\"n\">_complete<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">T<\/span> <span class=\"n\">_maximum<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">_isCompleted<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MyProgress<\/span><span class=\"p\">(<\/span><span class=\"n\">Action<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">handler<\/span><span class=\"p\">,<\/span> <span class=\"n\">Action<\/span><span class=\"p\">?<\/span> <span class=\"n\">complete<\/span><span class=\"p\">,<\/span> <span class=\"n\">T<\/span> <span class=\"n\">maximum<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">:<\/span> <span class=\"k\">base<\/span><span class=\"p\">(<\/span><span class=\"n\">handler<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_complete<\/span> <span class=\"p\">=<\/span> <span class=\"n\">complete<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_maximum<\/span> <span class=\"p\">=<\/span> <span class=\"n\">maximum<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">ProgressChanged<\/span> <span class=\"p\">+=<\/span> <span class=\"n\">CheckCompletion<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">protected<\/span> <span class=\"kd\">override<\/span> <span class=\"k\">void<\/span> <span class=\"n\">OnReport<\/span><span class=\"p\">(<\/span><span class=\"n\">T<\/span> <span class=\"k\">value<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_isCompleted<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">base<\/span><span class=\"p\">.<\/span><span class=\"n\">OnReport<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">CheckCompletion<\/span><span class=\"p\">(<\/span><span class=\"kt\">object?<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">T<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Equals<\/span><span class=\"p\">(<\/span><span class=\"n\">_maximum<\/span><span class=\"p\">)<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"p\">!<\/span><span class=\"n\">_isCompleted<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_isCompleted<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_complete<\/span><span class=\"p\">?.<\/span><span class=\"n\">Invoke<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u8fd9\u6837\u4f7f\u7528\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"kd\">async<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Button_Click<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">RoutedEventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">reporter<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MyProgress<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">double<\/span><span class=\"p\">&gt;(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">value<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">progressBar<\/span><span class=\"p\">.<\/span><span class=\"n\">Value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">progressBar<\/span><span class=\"p\">.<\/span><span class=\"n\">Visibility<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Visibility<\/span><span class=\"p\">.<\/span><span class=\"n\">Hidden<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"m\">100<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">await<\/span> <span class=\"n\">DoJobAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">reporter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CancellationToken<\/span><span class=\"p\">.<\/span><span class=\"n\">None<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u5b9e\u73b0\u7684\u6548\u679c\u662f\uff0c\u5f53\u5f02\u6b65\u4efb\u52a1\u5b8c\u6210\u540e\uff0c\u5c06\u4f1a\u9690\u85cf\u8fdb\u5ea6\u6761\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e0d\u77e5\u9053\u5927\u5bb6\u770b\u5b8c\u8fd9\u7bc7\u6587\u7ae0\u7684\u611f\u53d7\u5982\u4f55\u3002\u5176\u5b9e\u6211\u5728\u6700\u5f00\u59cb\u4e86\u89e3\u6587\u4e2d\u63d0\u5230\u7684 <code>IProgress<\/code> \u63a5\u53e3\u4ee5\u53ca <code>Progress<\/code> \u7c7b\u65f6\uff0c\u6700\u5927\u7684\u611f\u53d7\u662f\uff1a\u5fae\u8f6f\u7a76\u7adf\u4e3a\u6211\u4eec\u63d0\u524d\u51c6\u5907\u597d\u4e86\u591a\u5c11\u63a5\u53e3\u548c\u7c7b\u554a\ud83e\udd23\uff01<\/p>\n<p>.NET \u7c7b\u4e2d\u6709\u592a\u591a\u8fd9\u6837\u7684\u6807\u51c6\u5e93\u4e86\uff0c\u4f46\u6211\u4eec\u4e5f\u6ca1\u6709\u4ec0\u4e48\u529e\u6cd5\u53bb\u7cfb\u7edf\u5730\u6316\u6398\u4e0e\u603b\u7ed3\u3002\u6240\u4ee5\u53ea\u80fd\u4ef0\u4ed7\u5927\u5bb6\u4eca\u540e\u6301\u7eed\u4e0d\u65ad\u7684\u4ea4\u6d41\u4e0e\u5b66\u4e60\u4e86\u3002<\/p>\n<h2 id=\"\u53c2\u8003\">\n\u53c2\u8003\n<a href=\"#%e5%8f%82%e8%80%83\" class=\"anchor\">&para;<\/a>\n<\/h2><p><a class=\"link\" href=\"https:\/\/www.youtube.com\/watch?v=zQMNFEz5IVU\" target=\"_blank\" rel=\"noopener\"\n>How to Report Progress with Async\/Await in .NET Core 3 - YouTube<\/a><\/p>\n<p><a class=\"link\" href=\"https:\/\/www.youtube.com\/watch?v=ZTKGRJy5P2M\" target=\"_blank\" rel=\"noopener\"\n>C# Advanced Async - Getting progress reports, cancelling tasks, and more - YouTube<\/a><\/p>"},{"title":"\u5982\u4f55\u5728 WPF \u4e2d\u5b9e\u73b0\u7b26\u5408 MVVM \u6a21\u5f0f\u7684\u6587\u4ef6\u62d6\u5165\u529f\u80fd","link":"https:\/\/blog.coldwind.top\/posts\/drop-file-mvvm\/","pubDate":"Wed, 08 May 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/drop-file-mvvm\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/05\/08\/tw73xXjhTbN8pZQ.jpg\" alt=\"Featured image of post \u5982\u4f55\u5728 WPF \u4e2d\u5b9e\u73b0\u7b26\u5408 MVVM \u6a21\u5f0f\u7684\u6587\u4ef6\u62d6\u5165\u529f\u80fd\" \/><p>\u672c\u7bc7\u6587\u7ae0\u5bf9\u5e94\u7684\u6559\u5b66\u89c6\u9891\u94fe\u63a5\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1NF4m1A7SD\/\" target=\"_blank\" rel=\"noopener\"\n>WPF\u4e2d\u5982\u4f55\u5b9e\u73b0\u7b26\u5408MVVM\u6a21\u5f0f\u7684\u6587\u4ef6\u62d6\u5165\u529f\u80fd<\/a><\/p>\n<h2 id=\"\u539f\u59cb\u65b9\u5f0f\">\n\u539f\u59cb\u65b9\u5f0f\n<a href=\"#%e5%8e%9f%e5%a7%8b%e6%96%b9%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 WPF \u4e2d\uff0c\u5b9e\u73b0\u6587\u4ef6\u62d6\u5165\u529f\u80fd\u5e76\u4e0d\u96be\u3002\u7a0d\u5fae\u5728\u7f51\u4e0a\u641c\u7d22\u4e00\u4e0b\uff0c\u5c31\u80fd\u591f\u5f97\u5230\u7b54\u6848\u3002\u6bd4\u5982\u73b0\u5728\u6709\u4e00\u4e2a\u7a97\u53e3\uff0c\u6211\u4eec\u53ea\u9700\u8981\u8bbe\u7f6e\u5b83\u7684 <code>AllowDrop<\/code> \u5c5e\u6027\u4e3a <code>True<\/code>\uff0c\u7136\u540e\u5728 <code>Drop<\/code> \u4e8b\u4ef6\u4e2d\u5904\u7406\u5373\u53ef\u3002\u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">AllowDrop=<\/span><span class=\"s\">&#34;True&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Drop=<\/span><span class=\"s\">&#34;Window_Drop&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">partial<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainWindow<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Window<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">MainWindow<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">InitializeComponent<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Window_Drop<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">DragEventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Data<\/span><span class=\"p\">.<\/span><span class=\"n\">GetDataPresent<\/span><span class=\"p\">(<\/span><span class=\"n\">DataFormats<\/span><span class=\"p\">.<\/span><span class=\"n\">FileDrop<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">files<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">[])<\/span><span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Data<\/span><span class=\"p\">.<\/span><span class=\"n\">GetData<\/span><span class=\"p\">(<\/span><span class=\"n\">DataFormats<\/span><span class=\"p\">.<\/span><span class=\"n\">FileDrop<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5904\u7406\u62d6\u5165\u7684\u6587\u4ef6<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u6dfb\u52a0\u89c6\u56fe\u6a21\u578b\">\n\u6dfb\u52a0\u89c6\u56fe\u6a21\u578b\n<a href=\"#%e6%b7%bb%e5%8a%a0%e8%a7%86%e5%9b%be%e6%a8%a1%e5%9e%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4f46\u95ee\u9898\u662f\uff0c\u5982\u679c\u73b0\u5728 <code>Window<\/code> \u62e5\u6709\u4e00\u4e2a\u89c6\u56fe\u6a21\u578b\uff08ViewModel\uff09\uff0c\u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MainViewModel<\/span> <span class=\"p\">:<\/span> <span class=\"n\">ViewModelBase<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">string?<\/span> <span class=\"n\">_fileName<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string?<\/span> <span class=\"n\">FileName<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_fileName<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">set<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_fileName<\/span> <span class=\"p\">=<\/span> <span class=\"k\">value<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">OnPropertyChanged<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span> <span class=\"n\">nameof<\/span><span class=\"p\">(<\/span><span class=\"n\">FileName<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u8fd9\u91cc\u6211\u4eec\u5047\u5b9a\u5df2\u7ecf\u5b9e\u73b0\u4e86 <code>ViewModelBase<\/code> \u7c7b\uff0c\u5b83\u5b9e\u73b0\u4e86 <code>INotifyPropertyChanged<\/code> \u63a5\u53e3\uff0c\u5e76\u63d0\u4f9b\u4e86 <code>OnPropertyChanged<\/code> \u65b9\u6cd5\u4ee5\u4fbf\u4e8e\u901a\u77e5\u5c5e\u6027\u53d1\u751f\u4e86\u53d8\u5316\u3002<\/div>\n<\/div>\n<p>\u7136\u540e <code>Window<\/code> \u4e0a\u9762\u6709\u4e00\u4e2a <code>TextBox<\/code> \u7ed1\u5b9a\u4e86\u8fd9\u4e2a\u5c5e\u6027\uff0c\u8fd9\u53c8\u8be5\u600e\u4e48\u529e\u5462\uff1f<\/p>\n<p>\u8fd9\u91cc\u6709\u4e24\u79cd\u6bd4\u8f83\u7b80\u5355\u7c97\u66b4\u7684\u65b9\u5f0f\uff1a<\/p>\n<ol>\n<li>\u4e3a <code>TextBox<\/code> \u6dfb\u52a0\u4e00\u4e2a <code>Name<\/code>\uff0c\u7136\u540e\u5728 <code>Window<\/code> \u7684 <code>Drop<\/code> \u4e8b\u4ef6\u4e2d\u76f4\u63a5\u4fee\u6539 <code>TextBox<\/code> \u7684 <code>Text<\/code> \u5c5e\u6027\uff0c\u8fdb\u800c\u4f7f\u7528\u4f9d\u8d56\u5c5e\u6027\u7684\u4e00\u4e9b\u65b9\u6cd5\u6765\u901a\u77e5\u7ed1\u5b9a\u7684 ViewModel \u5c5e\u6027\u53d1\u751f\u4e86\u53d8\u5316<\/li>\n<li>\u5728 <code>Window<\/code> \u7684 <code>Drop<\/code> \u4e8b\u4ef6\u4e2d\u76f4\u63a5\u4fee\u6539 <code>ViewModel<\/code> \u7684\u5c5e\u6027\uff08\u83b7\u53d6 <code>Window.DataContext<\/code>\uff0c\u5e76\u5c06\u5176\u8f6c\u4e3a <code>MainViewModel<\/code> \u7c7b\u578b\uff09\uff0c\u7136\u540e\u5728 <code>ViewModel<\/code> \u4e2d\u5b9e\u73b0 <code>INotifyPropertyChanged<\/code> \u63a5\u53e3\uff0c\u8fdb\u800c\u901a\u77e5 <code>TextBox<\/code> \u7684 <code>Text<\/code> \u5c5e\u6027\u53d1\u751f\u4e86\u53d8\u5316<\/li>\n<\/ol>\n<p>\u8fd9\u4e24\u79cd\u65b9\u5f0f\u90fd\u5f88\u76f4\u63a5\uff0c\u800c\u4e14\u5176\u5b9e\u90fd\u4e0d\u8fdd\u80cc MVVM \u6a21\u5f0f\u3002\u4f46\u662f\u8fd9\u4e24\u79cd\u65b9\u5f0f\u5e76\u4e0d\u4f18\u96c5\uff0c\u6240\u4ee5\u8fd9\u91cc\u6211\u4eec\u501f\u52a9\u884c\u4e3a\uff08Behaviors\uff09\u6765\u5b9e\u73b0\u4e00\u4e2a\u66f4\u52a0\u4f18\u96c5\u4e14\u901a\u7528\u7684\u65b9\u5f0f\u3002<\/p>\n<h2 id=\"\u4f7f\u7528\u884c\u4e3a\">\n\u4f7f\u7528\u884c\u4e3a\n<a href=\"#%e4%bd%bf%e7%94%a8%e8%a1%8c%e4%b8%ba\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u5b89\u88c5 <code>Microsoft.Xaml.Behaviors.Wpf<\/code> \u5305\u3002\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a <code>DropFileBehavior<\/code> \u7c7b\uff0c\u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><span class=\"lnt\">30\n<\/span><span class=\"lnt\">31\n<\/span><span class=\"lnt\">32\n<\/span><span class=\"lnt\">33\n<\/span><span class=\"lnt\">34\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">DropFileBehavior<\/span> <span class=\"p\">:<\/span> <span class=\"n\">Behavior<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">FrameworkElement<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span><span class=\"p\">[]?<\/span> <span class=\"n\">Data<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">get<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">[]?)<\/span><span class=\"n\">GetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">FilesProperty<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">set<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">SetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">FilesProperty<\/span><span class=\"p\">,<\/span> <span class=\"k\">value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">DependencyProperty<\/span> <span class=\"n\">FilesProperty<\/span> <span class=\"p\">=<\/span> <span class=\"n\">DependencyProperty<\/span><span class=\"p\">.<\/span><span class=\"n\">Register<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">nameof<\/span><span class=\"p\">(<\/span><span class=\"n\">Data<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">[]),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">DropFileBehavior<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">UIPropertyMetadata<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">protected<\/span> <span class=\"kd\">override<\/span> <span class=\"k\">void<\/span> <span class=\"n\">OnAttached<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">AssociatedObject<\/span><span class=\"p\">.<\/span><span class=\"n\">AllowDrop<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">AssociatedObject<\/span><span class=\"p\">.<\/span><span class=\"n\">Drop<\/span> <span class=\"p\">+=<\/span> <span class=\"n\">DropHandler<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">protected<\/span> <span class=\"kd\">override<\/span> <span class=\"k\">void<\/span> <span class=\"n\">OnDetaching<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">AssociatedObject<\/span><span class=\"p\">.<\/span><span class=\"n\">Drop<\/span> <span class=\"p\">-=<\/span> <span class=\"n\">DropHandler<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">DropHandler<\/span><span class=\"p\">(<\/span><span class=\"kt\">object<\/span> <span class=\"n\">sender<\/span><span class=\"p\">,<\/span> <span class=\"n\">DragEventArgs<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Data<\/span><span class=\"p\">.<\/span><span class=\"n\">GetDataPresent<\/span><span class=\"p\">(<\/span><span class=\"n\">DataFormats<\/span><span class=\"p\">.<\/span><span class=\"n\">FileDrop<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Data<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">[])<\/span><span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Data<\/span><span class=\"p\">.<\/span><span class=\"n\">GetData<\/span><span class=\"p\">(<\/span><span class=\"n\">DataFormats<\/span><span class=\"p\">.<\/span><span class=\"n\">FileDrop<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u884c\u4e3a\u5927\u81f4\u5b9e\u73b0\u7684\u529f\u80fd\u662f\uff1a<\/p>\n<ol>\n<li>\u5f53\u9644\u52a0\u5230\u4e00\u4e2a <code>FrameworkElement<\/code> \u4e0a\u65f6\uff0c\u5c06\u5176 <code>AllowDrop<\/code> \u5c5e\u6027\u8bbe\u7f6e\u4e3a <code>True<\/code>\uff0c\u5e76\u6ce8\u518c <code>Drop<\/code> \u4e8b\u4ef6<\/li>\n<li>\u5f53\u62d6\u5165\u6587\u4ef6\u65f6\uff0c\u5c06\u6587\u4ef6\u8def\u5f84\u4fdd\u5b58\u5230 <code>Data<\/code> \u4f9d\u8d56\u5c5e\u6027\u4e2d<\/li>\n<\/ol>\n<p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 XAML \u4e2d\u4f7f\u7528\u8fd9\u4e2a\u884c\u4e3a\u4e86\uff08\u56e0\u4e3a\u8fd9\u91cc\u6211\u4eec\u58f0\u660e\u7684 <code>Data<\/code> \u5c5e\u6027\u662f\u4e00\u4e2a\u6570\u7ec4\uff0c\u6240\u4ee5\u6211\u4eec\u7a0d\u5fae\u4fee\u6539 <code>MainViewModel<\/code> \u4e2d\u76f8\u5173\u5c5e\u6027\u7684\u540d\u79f0\u53ca\u7c7b\u578b\uff0c\u4ece\u800c\u5b9e\u73b0\u7ed1\u5b9a\u529f\u80fd\uff09\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:i=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/xaml\/behaviors&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:local=<\/span><span class=\"s\">&#34;clr-namespace:YourNamespace&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;i:Interaction.Behaviors&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;local:DropFileBehavior<\/span> <span class=\"na\">Data=<\/span><span class=\"s\">&#34;{Binding FileNames, Mode=OneWayToSource}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/i:Interaction.Behaviors&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBox<\/span> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;{Binding FileNames[0]}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Window&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6ce8\u610f\u8fd9\u91cc\uff0c\u6211\u4eec\u5728\u4e66\u5199\u884c\u4e3a\u7684 <code>Data<\/code> \u5c5e\u6027\u7684\u7ed1\u5b9a\u65f6\uff0c\u4f7f\u7528\u4e86 <code>Mode=OneWayToSource<\/code>\uff0c\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u53ea\u9700\u8981\u5c06\u6570\u636e\u4ece\u89c6\u56fe\u4f20\u9012\u5230\u89c6\u56fe\u6a21\u578b\uff0c\u800c\u4e0d\u9700\u8981\u53cd\u5411\u4f20\u9012\u3002\u5e76\u4e14\u5982\u679c\u4e0d\u5199 <code>Mode<\/code>\uff0c\u5b83\u9ed8\u8ba4\u5c06\u4f1a\u662f <code>OneWay<\/code>\uff0c\u5bfc\u81f4\u53ef\u80fd\u65e0\u6cd5\u6b63\u786e\u901a\u77e5\u5230 <code>ViewModel<\/code>\u3002<\/p>\n<h2 id=\"\u5236\u4f5c\u754c\u9762\">\n\u5236\u4f5c\u754c\u9762\n<a href=\"#%e5%88%b6%e4%bd%9c%e7%95%8c%e9%9d%a2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u641e\u4e00\u4e2a\u201c\u9177\u70ab\u201d\u7684\u754c\u9762\uff0c\u5f62\u5982\uff1a<\/p>\n<img src=\"https:\/\/s2.loli.net\/2024\/05\/08\/ZNiGDOtz1AJTnXW.gif\" style=\"width:400px\" \/>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u7a97\u53e3\u4e2d\u6dfb\u52a0\u8fd9\u6837\u4e00\u4e2a\u7f6e\u4e8e\u4e0a\u65b9\u7684\u63a7\u4ef6\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Grid<\/span> <span class=\"na\">Name=<\/span><span class=\"s\">&#34;dropFilePanel&#34;<\/span> <span class=\"na\">Visibility=<\/span><span class=\"s\">&#34;Hidden&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Border<\/span> <span class=\"na\">Background=<\/span><span class=\"s\">&#34;White&#34;<\/span> <span class=\"na\">Opacity=<\/span><span class=\"s\">&#34;0.8&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;TextBlock<\/span> <span class=\"na\">HorizontalAlignment=<\/span><span class=\"s\">&#34;Center&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">VerticalAlignment=<\/span><span class=\"s\">&#34;Center&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Text=<\/span><span class=\"s\">&#34;\u5c06\u6587\u4ef6\u62d6\u653e\u5230\u6b64\u5904&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;Rectangle<\/span> <span class=\"na\">Width=<\/span><span class=\"s\">&#34;200&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Height=<\/span><span class=\"s\">&#34;100&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">Stroke=<\/span><span class=\"s\">&#34;Gray&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">RadiusX=<\/span><span class=\"s\">&#34;10&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">RadiusY=<\/span><span class=\"s\">&#34;10&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">StrokeDashArray=<\/span><span class=\"s\">&#34;3,4&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">StrokeThickness=<\/span><span class=\"s\">&#34;2&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;\/Grid&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u540c\u65f6\uff0c\u56e0\u4e3a\u6211\u4eec\u73b0\u5728\u6709\u4e86\u8fd9\u4e2a\u4e13\u95e8\u7684\u7528\u4e8e\u653e\u7f6e\u6587\u4ef6\u7684\u9762\u677f\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u5c06\u4e4b\u524d\u6dfb\u52a0\u7ed9\u7a97\u53e3\u7684\u884c\u4e3a\u8f6c\u79fb\u5230\u5b83\u8eab\u4e0a\uff0c\u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Grid<\/span> <span class=\"na\">Name=<\/span><span class=\"s\">&#34;dropFilePanel&#34;<\/span> <span class=\"na\">Visibility=<\/span><span class=\"s\">&#34;Hidden&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;i:Interaction.Behaviors&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;local:DropFileBehavior<\/span> <span class=\"na\">Data=<\/span><span class=\"s\">&#34;{Binding FileNames, Mode=OneWayToSource}&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/i:Interaction.Behaviors&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> ...\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u662f\u6211\u4eec\u8981\u63a7\u5236\u5b83\u5728\u5408\u9002\u7684\u65f6\u673a\u51fa\u73b0\u4e0e\u6d88\u5931\u3002\u8fd9\u91cc\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u89e6\u53d1\u5668\u4e0e\u884c\u4e3a\u6765\u5feb\u901f\u5730\u5b9e\u73b0\u8fd9\u4e00\u6548\u679c\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u7ed9\u7a97\u53e3\u6dfb\u52a0\u8fd9\u6837\u7684\u89e6\u53d1\u5668\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Window<\/span> <span class=\"err\">...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"na\">xmlns:b=<\/span><span class=\"s\">&#34;http:\/\/schemas.microsoft.com\/xaml\/behaviors&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;b:Interaction.Triggers&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;b:EventTrigger<\/span> <span class=\"na\">EventName=<\/span><span class=\"s\">&#34;DragEnter&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;b:ChangePropertyAction<\/span> <span class=\"na\">TargetObject=<\/span><span class=\"s\">&#34;{Binding ElementName=dropFilePanel}&#34;<\/span> <span class=\"na\">PropertyName=<\/span><span class=\"s\">&#34;Visibility&#34;<\/span> <span class=\"na\">Value=<\/span><span class=\"s\">&#34;Visible&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/b:EventTrigger&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;b:EventTrigger<\/span> <span class=\"na\">EventName=<\/span><span class=\"s\">&#34;DragLeave&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;b:ChangePropertyAction<\/span> <span class=\"na\">TargetObject=<\/span><span class=\"s\">&#34;{Binding ElementName=dropFilePanel}&#34;<\/span> <span class=\"na\">PropertyName=<\/span><span class=\"s\">&#34;Visibility&#34;<\/span> <span class=\"na\">Value=<\/span><span class=\"s\">&#34;Hidden&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/b:EventTrigger&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/b:Interaction.Triggers&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> ...\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\uff0c\u5f53\u9f20\u6807\u62d6\u5165\u7a97\u53e3\u65f6\uff0c<code>dropFilePanel<\/code> \u5c31\u4f1a\u663e\u793a\u51fa\u6765\uff1b\u5f53\u9f20\u6807\u62d6\u51fa\u7a97\u53e3\u65f6\uff0c<code>dropFilePanel<\/code> \u5c31\u4f1a\u88ab\u9690\u85cf\u3002<\/p>\n<p>\u5b9e\u9645\u6d4b\u8bd5\u540e\u4f1a\u53d1\u73b0\uff0c\u5f53\u6211\u4eec\u5c06\u6587\u4ef6\u62d6\u5230\u4e0a\u65b9\u5e76\u677e\u5f00\u5de6\u952e\u540e\uff0c\u867d\u7136\u884c\u4e3a\u5f97\u5230\u4e86\u6b63\u786e\u7684\u54cd\u5e94\uff0c\u4f46\u9762\u677f\u5e76\u6ca1\u6709\u6d88\u5931\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u4e0a\u9762\u5199\u7684\u89e6\u53d1\u5668\u53ea\u4f1a\u5728\u9f20\u6807\u62d6\u52a8\u72b6\u6001\u79bb\u5f00\u7a97\u53e3\u540e\u624d\u4f1a\u9690\u85cf\u9762\u677f\u3002\u6240\u4ee5\u8fd9\u91cc\uff0c\u6211\u4eec\u53ef\u4ee5\u518d\u4e3a\u9762\u677f\u6dfb\u52a0\u4e00\u4e2a\u89e6\u53d1\u5668\uff0c\u5e76\u5728\u5b83\u89e6\u53d1\u4e86 <code>Drop<\/code> \u4e8b\u4ef6\u540e\u5c06\u81ea\u8eab\u9690\u85cf\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-xml\" data-lang=\"xml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">&lt;Grid<\/span> <span class=\"na\">Name=<\/span><span class=\"s\">&#34;dropFilePanel&#34;<\/span> <span class=\"na\">Visibility=<\/span><span class=\"s\">&#34;Hidden&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;b:Interaction.Triggers&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;b:EventTrigger<\/span> <span class=\"na\">EventName=<\/span><span class=\"s\">&#34;Drop&#34;<\/span><span class=\"nt\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;b:ChangePropertyAction<\/span> <span class=\"na\">PropertyName=<\/span><span class=\"s\">&#34;Visibility&#34;<\/span> <span class=\"na\">Value=<\/span><span class=\"s\">&#34;Hidden&#34;<\/span> <span class=\"nt\">\/&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/b:EventTrigger&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&lt;\/b:Interaction.Triggers&gt;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\uff0c\u4e0a\u9762\u52a8\u56fe\u4e2d\u7684\u6548\u679c\u5c31\u5b9e\u73b0\u4e86\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>WPF \u5f00\u53d1\u5fc5\u7136\u4f1a\u7ecf\u5e38\u548c\u63a7\u4ef6\u7684\u4e8b\u4ef6\u6253\u4ea4\u9053\u3002\u4f46\u5f88\u591a\u65f6\u5019\uff0c\u5982\u679c\u6211\u4eec\u5e0c\u671b\u9075\u5faa MVVM \u6a21\u5f0f\uff0c\u53ef\u80fd\u5c31\u4f1a\u4e0d\u77e5\u6240\u63aa\u3002\u76f8\u4fe1\u5927\u5bb6\u901a\u8fc7\u8fd9\u7bc7\u6587\u7ae0\u7684\u4ee3\u7801\uff0c\u90fd\u80fd\u591f\u5145\u5206\u9886\u7565\u5230\u4f7f\u7528\u89e6\u53d1\u5668\u4e0e\u884c\u4e3a\u7684\u5f3a\u5927\u4e4b\u5904\u3002\u5f53\u7136\uff0c\u8fd9\u91cc\u53ea\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff0c\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u4e3a\u4e0a\u9762\u7684\u4f8b\u5b50\u6dfb\u52a0\u66f4\u591a\u4e30\u5bcc\u7684\u529f\u80fd\u53ca\u7279\u6548\u3002\u8fd9\u4e9b\u5c31\u6709\u5f85\u5927\u5bb6\u7684\u63a2\u7d22\u4e86\u3002<\/p>\n<p>\u5927\u5bb6\u5982\u679c\u6709\u4ec0\u4e48\u81ea\u5df1\u7684\u597d\u65b9\u6cd5\uff0c\u4e5f\u6b22\u8fce\u5728\u6587\u7ae0\u8bc4\u8bba\u533a\u7559\u8a00\uff0c\u5206\u4eab\u7ed9\u5927\u5bb6\u3002<\/p>"},{"title":"\u5982\u4f55\u4f7f\u7528 appsettings.json \u914d\u7f6e\u6587\u4ef6\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/how-to-use-appsettings\/","pubDate":"Mon, 22 Apr 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/how-to-use-appsettings\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/04\/22\/7ZhNX9B6CefQbuE.png\" alt=\"Featured image of post \u5982\u4f55\u4f7f\u7528 appsettings.json \u914d\u7f6e\u6587\u4ef6\uff1f\" \/><p>\u5728 .NET Core \u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>appsettings.json<\/code> \u914d\u7f6e\u6587\u4ef6\u6765\u5b58\u50a8\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\u4fe1\u606f\u3002\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u4f7f\u7528 <code>appsettings.json<\/code> \u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<p><code>appsettings.json<\/code> \u662f\u4e00\u4e2a\u76f8\u8f83\u4e8e <code>App.config<\/code> \u66f4\u52a0\u7075\u6d3b\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u662f .NET Core \u4ee5\u6765\u65b0\u589e\u7684\u4e00\u79cd\u914d\u7f6e\u65b9\u5f0f\uff0c\u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u7075\u6d3b\u6027\u3002<\/p>\n<h2 id=\"\u5feb\u901f\u5165\u95e8\">\n\u5feb\u901f\u5165\u95e8\n<a href=\"#%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6211\u4eec\u53ef\u4ee5\u5728\u9879\u76ee\u4e2d\u521b\u5efa\u4e00\u4e2a <code>appsettings.json<\/code> \u6587\u4ef6\uff0c\u7136\u5e76\u5c06\u5176\u751f\u6210\u64cd\u4f5c\u8bbe\u7f6e\u4e3a\u300c\u8f83\u65b0\u65f6\u590d\u5236\u300d\u6216\u300c\u603b\u662f\u590d\u5236\u300d\uff0c\u8fd9\u6837\u5728\u9879\u76ee\u6784\u5efa\u65f6\uff0c<code>appsettings.json<\/code> \u6587\u4ef6\u4f1a\u88ab\u590d\u5236\u5230\u8f93\u51fa\u76ee\u5f55\u4e2d\u3002<\/p>\n<p>\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u5728\u5176\u4e2d\u6dfb\u52a0\u5982\u4e0b\u5185\u5bb9\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-json\" data-lang=\"json\"><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;AppSettings&#34;<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;LogLevel&#34;<\/span><span class=\"p\">:<\/span><span class=\"s2\">&#34;Warning&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;ConnectionStrings&#34;<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;Default&#34;<\/span><span class=\"p\">:<\/span> <span class=\"s2\">&#34;this is the connection string&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5c1d\u8bd5\u8bfb\u53d6\u4e86\u3002\u6211\u4eec\u4f7f\u7528 NuGet \u5305\u7ba1\u7406\u5668\u5b89\u88c5 <code>Microsoft.Extensions.Configuration.Json<\/code> \u5305\u3002\u5b83\u4f1a\u9690\u5f0f\u5b89\u88c5 <code>Microsoft.Extensions.Configuration<\/code> \u7b49\u4f9d\u8d56\u9879\uff0c\u8fd9\u4e9b\u6211\u4eec\u4e0d\u9700\u8981\u663e\u5f0f\u5b89\u88c5\u3002<\/p>\n<p>\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u5728\u4ee3\u7801\u4e2d\u8bfb\u53d6\u914d\u7f6e\u6587\u4ef6\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">Microsoft.Extensions.Configuration<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ConfigurationBuilder<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">AddJsonFile<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;appsettings.json&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">optional<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span> <span class=\"n\">reloadOnChange<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Build<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u83b7\u53d6\u4e0a\u9762\u7684\u914d\u7f6e\u4fe1\u606f\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">logLevel<\/span> <span class=\"p\">=<\/span> <span class=\"n\">configuration<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;AppSettings:LogLevel&#34;<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">connectionString<\/span> <span class=\"p\">=<\/span> <span class=\"n\">configuration<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;AppSettings:ConnectionStrings:Default&#34;<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u7684\u5f62\u5982 <code>AppSettings.LogLevel<\/code> \u662f\u4e00\u79cd\u7279\u6b8a\u7684\u5199\u6cd5\uff0c\u7b80\u5355\u6765\u8bf4\u5c31\u662f\u501f\u52a9 <code>:<\/code> \u6765\u8868\u793a JSON \u4e2d\u7684\u5c42\u7ea7\u5173\u7cfb\u3002<\/p>\n<p>\u5982\u679c\u8981\u83b7\u53d6\u7684\u914d\u7f6e\u9879\u662f\u4e00\u4e2a\u6570\u5b57\uff0c\u6211\u4eec\u9664\u4e86\u53ef\u4ee5\u5148\u901a\u8fc7\u4e0a\u8ff0\u65b9\u5f0f\u83b7\u53d6\u5230\u5b57\u7b26\u4e32\uff0c\u8fdb\u800c\u4f7f\u7528 <code>int.Parse<\/code> \u6216 <code>Convert.ToInt32<\/code> \u7b49\u65b9\u6cd5\u8fdb\u884c\u8f6c\u6362\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528 <code>GetValue<\/code> \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f20\u7edf\u65b9\u6cd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">logLevel<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">int<\/span><span class=\"p\">.<\/span><span class=\"n\">Parse<\/span><span class=\"p\">(<\/span><span class=\"n\">configuration<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;AppSettings:LogLevel&#34;<\/span><span class=\"p\">]);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f7f\u7528 GetValue \u65b9\u6cd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">logLevel<\/span> <span class=\"p\">=<\/span> <span class=\"n\">configuration<\/span><span class=\"p\">.<\/span><span class=\"n\">GetValue<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;(<\/span><span class=\"s\">&#34;AppSettings:LogLevel&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5bf9\u4e8e\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528 <code>GetConnectionString<\/code> \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">connectionString<\/span> <span class=\"p\">=<\/span> <span class=\"n\">configuration<\/span><span class=\"p\">.<\/span><span class=\"n\">GetConnectionString<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Default&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u53ef\u9009\u4e0e\u81ea\u52a8\u91cd\u8f7d\">\n\u53ef\u9009\u4e0e\u81ea\u52a8\u91cd\u8f7d\n<a href=\"#%e5%8f%af%e9%80%89%e4%b8%8e%e8%87%aa%e5%8a%a8%e9%87%8d%e8%bd%bd\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u5230 <code>AddJsonFile<\/code> \u65b9\u6cd5\u6709\u4e24\u4e2a\u53c2\u6570\uff0c<code>optional<\/code> \u548c <code>reloadOnChange<\/code>\uff1a<\/p>\n<ul>\n<li><code>optional<\/code> \u53c2\u6570\u8868\u793a\u662f\u5426\u5141\u8bb8\u914d\u7f6e\u6587\u4ef6\u4e0d\u5b58\u5728\uff0c\u5982\u679c\u8bbe\u7f6e\u4e3a <code>false<\/code>\uff0c\u5219\u4f1a\u629b\u51fa\u5f02\u5e38\uff0c\u5426\u5219\u4f1a\u5ffd\u7565\u3002<\/li>\n<li><code>reloadOnChange<\/code> \u53c2\u6570\u8868\u793a\u662f\u5426\u5728\u914d\u7f6e\u6587\u4ef6\u53d1\u751f\u53d8\u5316\u65f6\u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\u3002\u5982\u679c\u8bbe\u7f6e\u4e3a <code>true<\/code>\uff0c\u5219\u4f1a\u5728\u914d\u7f6e\u6587\u4ef6\u53d1\u751f\u53d8\u5316\u65f6\u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\u3002<\/li>\n<\/ul>\n<p>\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u4f8b\u5b50\u6d4b\u8bd5\u81ea\u52a8\u91cd\u8f7d\u7684\u6548\u679c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ConfigurationBuilder<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">AddJsonFile<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;appsettings.json&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">optional<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span> <span class=\"n\">reloadOnChange<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Build<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">configuration<\/span><span class=\"p\">[<\/span><span class=\"s\">&#34;AppSettings:LogLevel&#34;<\/span><span class=\"p\">]);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"n\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"m\">1000<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u8fd0\u884c\u7a0b\u5e8f\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u4fee\u6539 <code>appsettings.json<\/code> \u6587\u4ef6\u4e2d\u7684 <code>LogLevel<\/code> \u914d\u7f6e\uff0c\u7136\u540e\u6211\u4eec\u4f1a\u53d1\u73b0\u7a0b\u5e8f\u4f1a\u81ea\u52a8\u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\u3002\u6ce8\u610f\u8fd9\u91cc\u6211\u4eec\u4fee\u6539\u7684\u662f\u8f93\u51fa\u76ee\u5f55\uff08\u4e5f\u5c31\u662f <code>.exe<\/code> \u6587\u4ef6\u6240\u5728\u4f4d\u7f6e\uff09\u4e0b\u7684 <code>appsettings.json<\/code> \u6587\u4ef6\uff0c\u800c\u4e0d\u662f\u9879\u76ee\u4e2d\u7684 <code>appsettings.json<\/code> \u6587\u4ef6\u3002<\/p>\n<h2 id=\"\u6dfb\u52a0\u591a\u4e2a-json-\u6587\u4ef6\">\n\u6dfb\u52a0\u591a\u4e2a JSON \u6587\u4ef6\n<a href=\"#%e6%b7%bb%e5%8a%a0%e5%a4%9a%e4%b8%aa-json-%e6%96%87%e4%bb%b6\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5982\u679c\u53ea\u80fd\u6dfb\u52a0\u4e00\u4e2a JSON \u6587\u4ef6\uff0c\u90a3\u4e48\u914d\u7f6e\u6587\u4ef6\u7684\u7075\u6d3b\u6027\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002\u4e8b\u5b9e\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u591a\u6b21\u8c03\u7528 <code>AddJsonFile<\/code> \u65b9\u6cd5\u6765\u6dfb\u52a0\u591a\u4e2a JSON \u6587\u4ef6\u3002\u4e00\u4e2a\u5178\u578b\u7684\u60c5\u5f62\u662f\u6dfb\u52a0\u4e00\u4e2a <code>appsettings.Development.json<\/code> \u6587\u4ef6\uff0c\u7528\u4e8e\u5b58\u50a8\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u4fe1\u606f\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ConfigurationBuilder<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">AddJsonFile<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;appsettings.json&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">optional<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span> <span class=\"n\">reloadOnChange<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">AddJsonFile<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;appsettings.Development.json&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">optional<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"n\">reloadOnChange<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Build<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 <code>appsettings.Development.json<\/code> \u6587\u4ef6\u4e2d\u5b58\u50a8\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u4fe1\u606f\uff0c\u800c\u5728 <code>appsettings.json<\/code> \u6587\u4ef6\u4e2d\u5b58\u50a8\u901a\u7528\u7684\u914d\u7f6e\u4fe1\u606f\u3002<\/p>\n<p>\u4e0d\u4ec5\u5982\u6b64\uff0c\u8fd9\u4e8c\u8005\u4e4b\u95f4\u5b58\u5728\u4f18\u5148\u7ea7\uff0c\u6216\u8005\u8bf4\u8986\u76d6\u5173\u7cfb\u3002\u5177\u4f53\u6765\u8bf4\uff1a<\/p>\n<ul>\n<li>\u5982\u679c <code>appsettings.json<\/code> \u548c <code>appsettings.Development.json<\/code> \u4e2d\u90fd\u6709\u76f8\u540c\u7684\u914d\u7f6e\u9879\uff0c\u90a3\u4e48 <code>appsettings.Development.json<\/code> \u4e2d\u7684\u914d\u7f6e\u9879\u4f1a\u8986\u76d6 <code>appsettings.json<\/code> \u4e2d\u7684\u914d\u7f6e\u9879<\/li>\n<li>\u5982\u679c <code>appsettings.Development.json<\/code> \u4e2d\u6ca1\u6709\u67d0\u4e2a\u914d\u7f6e\u9879\uff0c\u800c <code>appsettings.json<\/code> \u4e2d\u6709\uff0c\u90a3\u4e48\u4f1a\u4f7f\u7528 <code>appsettings.json<\/code> \u4e2d\u7684\u914d\u7f6e\u9879<\/li>\n<li>\u5982\u679c <code>appsettings.Development.json<\/code> \u4e2d\u6709\u67d0\u4e2a\u914d\u7f6e\u9879\uff0c\u800c <code>appsettings.json<\/code> \u4e2d\u6ca1\u6709\uff0c\u90a3\u4e48\u4f1a\u4f7f\u7528 <code>appsettings.Development.json<\/code> \u4e2d\u7684\u914d\u7f6e\u9879<\/li>\n<\/ul>\n<h2 id=\"\u4f7f\u7528\u5f3a\u7c7b\u578b\u914d\u7f6e\">\n\u4f7f\u7528\u5f3a\u7c7b\u578b\u914d\u7f6e\n<a href=\"#%e4%bd%bf%e7%94%a8%e5%bc%ba%e7%b1%bb%e5%9e%8b%e9%85%8d%e7%bd%ae\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528 <code>configuration[&quot;AppSettings:LogLevel&quot;]<\/code> \u6765\u83b7\u53d6\u914d\u7f6e\u4fe1\u606f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u662f\u4e00\u79cd\u5f31\u7c7b\u578b\u7684\u65b9\u5f0f\u3002\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528\u5f3a\u7c7b\u578b\u7684\u65b9\u5f0f\u6765\u83b7\u53d6\u914d\u7f6e\u4fe1\u606f\u3002<\/p>\n<p>\u6211\u4eec\u4fee\u6539\u4e00\u4e0b <code>appsettings.json<\/code> \u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u9879\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-json\" data-lang=\"json\"><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;UserSettings&#34;<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;Name&#34;<\/span><span class=\"p\">:<\/span> <span class=\"s2\">&#34;Alice&#34;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;Age&#34;<\/span><span class=\"p\">:<\/span> <span class=\"mi\">18<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;IsActive&#34;<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5b9a\u4e49\u4e00\u4e2a\u5f3a\u7c7b\u578b\u7684\u914d\u7f6e\u7c7b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">UserSettings<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Age<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">IsActive<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u83b7\u53d6\u914d\u7f6e\u524d\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u5b89\u88c5\u4e00\u4e2a NuGet \u5305\uff1a<code>Microsoft.Extensions.Options.ConfigurationExtensions<\/code>\u3002\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u8fd9\u6837\u83b7\u53d6\u914d\u7f6e\u4fe1\u606f\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">userSettings<\/span> <span class=\"p\">=<\/span> <span class=\"n\">configuration<\/span><span class=\"p\">.<\/span><span class=\"n\">GetSection<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;UserSettings&#34;<\/span><span class=\"p\">).<\/span><span class=\"n\">Get<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">UserSettings<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u83b7\u53d6\u5230 <code>UserSettings<\/code> \u5bf9\u8c61\u4e86\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u4f7f\u7528 <code>userSettings.Name<\/code>\u3001<code>userSettings.Age<\/code>\u3001<code>userSettings.IsActive<\/code> \u6765\u83b7\u53d6\u914d\u7f6e\u4fe1\u606f\u4e86\u3002<\/p>\n<p>\u4f46\u662f\u9700\u8981\u6ce8\u610f\uff0c\u56e0\u4e3a\u8fd9\u91cc\u7684 <code>userSettings<\/code> \u5b9e\u4f8b\u5df2\u7ecf\u521d\u59cb\u5316\uff0c\u6240\u4ee5\u524d\u9762\u63d0\u5230\u7684\u81ea\u52a8\u91cd\u8f7d\u529f\u80fd\u4e0d\u518d\u751f\u6548\u3002\u5982\u679c\u9700\u8981\u81ea\u52a8\u91cd\u8f7d\uff0c\u6211\u4eec\u9700\u8981\u91cd\u65b0\u83b7\u53d6 <code>userSettings<\/code> \u5bf9\u8c61\u3002<\/p>\n<h2 id=\"\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u548c\u547d\u4ee4\u884c\u53c2\u6570\">\n\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u548c\u547d\u4ee4\u884c\u53c2\u6570\n<a href=\"#%e6%b7%bb%e5%8a%a0%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f%e5%92%8c%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%8f%82%e6%95%b0\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 .NET Core \u4e2d\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u548c\u547d\u4ee4\u884c\u53c2\u6570\u6765\u8986\u76d6\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u4fe1\u606f\u3002\u6211\u4eec\u9700\u8981\u518d\u5b89\u88c5\u4e24\u4e2a NuGet \u5305\uff1a<\/p>\n<ul>\n<li><code>Microsoft.Extensions.Configuration.EnvironmentVariables<\/code><\/li>\n<li><code>Microsoft.Extensions.Configuration.CommandLine<\/code><\/li>\n<\/ul>\n<p>\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u548c\u547d\u4ee4\u884c\u53c2\u6570\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ConfigurationBuilder<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">AddJsonFile<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;appsettings.json&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">optional<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span> <span class=\"n\">reloadOnChange<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">AddEnvironmentVariables<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">AddCommandLine<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Build<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u548c\u547d\u4ee4\u884c\u53c2\u6570\u6765\u8986\u76d6\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u4fe1\u606f\u4e86\u3002<\/p>\n<p>\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a <code>.bat<\/code> \u6279\u5904\u7406\u6587\u4ef6\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bat\" data-lang=\"bat\"><span class=\"line\"><span class=\"cl\"><span class=\"p\">@<\/span><span class=\"k\">echo<\/span> off\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">set<\/span> <span class=\"nv\">UserSettings__Name<\/span><span class=\"p\">=<\/span>Bob\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">set<\/span> <span class=\"nv\">UserSettings__Age<\/span><span class=\"p\">=<\/span>20\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">.\\Demo.exe\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6216\u8005\u8fd8\u53ef\u4ee5\u4f7f\u7528 PowerShell\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-powershell\" data-lang=\"powershell\"><span class=\"line\"><span class=\"cl\"><span class=\"nv\">$env:UserSettings__Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">&#34;Bob&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nv\">$env:UserSettings__Age<\/span> <span class=\"p\">=<\/span> <span class=\"mf\">20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">.\\<\/span><span class=\"n\">Demo<\/span><span class=\"p\">.<\/span><span class=\"py\">exe<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u76f8\u4fe1\u901a\u8fc7\u8fd9\u7bc7\u6587\u7ae0\uff0c\u5927\u5bb6\u5df2\u7ecf\u8ba4\u8bc6\u5230\u4e86 <code>appsettings.json<\/code> \u914d\u7f6e\u6587\u4ef6\u7684\u5f3a\u5927\u4e4b\u5904\u3002\u5b83\u4e0d\u4ec5\u63d0\u4f9b\u4e86\u4e00\u79cd\u7075\u6d3b\u7684\u914d\u7f6e\u65b9\u5f0f\uff0c\u8fd8\u63d0\u4f9b\u4e86\u591a\u79cd\u914d\u7f6e\u65b9\u5f0f\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u66f4\u52a0\u7075\u6d3b\u5730\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>\u4f46\u662f\u5b83\u4e5f\u6709\u4e00\u4e9b\u5c40\u9650\u6027\u3002\u6700\u91cd\u8981\u7684\u4e00\u6761\u5c31\u662f\u5b83\u7684\u914d\u7f6e\u9879\u662f\u201c\u53ea\u8bfb\u201d\u7684\uff0c\u4e5f\u5c31\u662f\u4e0d\u80fd\u50cf <code>App.config<\/code> \u90a3\u6837\u5728\u8fd0\u884c\u65f6\u65b9\u4fbf\u5730\u4fee\u6539\u914d\u7f6e\u9879\u3002\u6bd5\u7adf\uff0c\u4e00\u4e2a\u9879\u76ee\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u914d\u7f6e\u9879\uff0c\u800c\u4e0d\u662f\u53ea\u6709\u4e00\u4e2a <code>appsettings.json<\/code> \u6587\u4ef6\u3002\u6b64\u65f6\u5982\u679c\u4fee\u6539\u4e86\uff0c\u8be5\u4fdd\u5b58\u5230\u54ea\u4e2a\u6587\u4ef6\u5462\uff1f<\/p>\n<p>\u5f53\u7136\uff0c\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\uff0c\u90a3\u4e48 <code>appsettings.json<\/code> \u662f\u4e00\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\u3002\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>Newtonsoft.Json<\/code> \u6765\u8f7b\u677e\u5730\u5199\u5165 JSON \u6587\u4ef6\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5b9e\u73b0\u914d\u7f6e\u9879\u7684\u4fee\u6539\u4e86\u3002<\/p>\n<p>\u6700\u540e\uff0c\u5176\u5b9e\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e76\u4e0d\u4f1a\u4f7f\u7528\u4e0a\u9762\u7684\u65b9\u5f0f\u8bfb\u53d6\u914d\u7f6e\u9879\uff0c\u800c\u662f\u4f1a\u66f4\u8fdb\u4e00\u6b65\uff0c\u4f7f\u7528 <code>Host<\/code> \u4f5c\u4e3a\u6574\u4e2a\u7a0b\u5e8f\u7684\u5165\u53e3\uff0c\u5e76\u8bfb\u53d6\u914d\u7f6e\u3001\u6ce8\u5165\u670d\u52a1\u7b49\u3002\u5728\u4e4b\u540e\u7684\u6587\u7ae0\u4e2d\uff0c\u6211\u4eec\u4f1a\u5b66\u4e60\u5982\u4f55\u4f7f\u7528 <code>Host<\/code> \u6765\u6784\u5efa\u4e00\u4e2a .NET \u5e94\u7528\u7a0b\u5e8f\u3002<\/p>"},{"title":"\u5982\u4f55\u7528 Rx.NET \u6765\u6a21\u62df\u60c5\u666f\u77ed\u5267\u300a\u6050\u60e7\u75c7\u7814\u8ba8\u4f1a\u300b","link":"https:\/\/blog.coldwind.top\/posts\/phobia-workshop\/","pubDate":"Sat, 20 Apr 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/phobia-workshop\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/04\/20\/tAq5BvYJUkQgReP.png\" alt=\"Featured image of post \u5982\u4f55\u7528 Rx.NET \u6765\u6a21\u62df\u60c5\u666f\u77ed\u5267\u300a\u6050\u60e7\u75c7\u7814\u8ba8\u4f1a\u300b\" \/><p>\u4e0d\u77e5\u9053\u5927\u5bb6\u6709\u6ca1\u6709\u770b\u8fc7\u8fd9\u6837\u4e00\u4e2a\u89c6\u9891\uff1a<\/p>\n<div class=\"video-wrapper\">\n<iframe src=\"https:\/\/player.bilibili.com\/player.html?as_wide=1&amp;high_quality=1&amp;page=1&bvid=BV1js411z7wf&mute=0&autoplay=0\"\nscrolling=\"no\"\nframeborder=\"no\"\nframespacing=\"0\"\nallowfullscreen=\"true\"\n>\n<\/iframe>\n<\/div>\n<p>\uff08\u6216\u8005\u4e5f\u53ef\u4ee5\u770b\u6cb9\u7ba1\u4e0a\u7684 <a class=\"link\" href=\"https:\/\/www.youtube.com\/watch?v=koNwUeG-iKE\" target=\"_blank\" rel=\"noopener\"\n>\u539f\u7248\u89c6\u9891<\/a>\uff09<\/p>\n<p>\u6211\u4eec\u8fd9\u6b21\u5c31\u6765\u73a9\u4e00\u73a9\uff0c\u5982\u4f55\u4f7f\u7528 Rx.NET \u6765\u6a21\u62df\u8fd9\u4e2a\u60c5\u666f\u77ed\u5267\u3002<\/p>\n<h2 id=\"\u7b80\u5355\u5206\u6790\u6bcf\u4e2a\u4eba\u7684\u7279\u70b9\">\n\u7b80\u5355\u5206\u6790\u6bcf\u4e2a\u4eba\u7684\u7279\u70b9\n<a href=\"#%e7%ae%80%e5%8d%95%e5%88%86%e6%9e%90%e6%af%8f%e4%b8%aa%e4%ba%ba%e7%9a%84%e7%89%b9%e7%82%b9\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u901a\u8fc7\u89c2\u770b\u89c6\u9891\uff0c\u6211\u4eec\u53d1\u73b0\u4e00\u5171\u6709\u4e94\u4e2a\u4eba\uff0c\u4e14\u8fd9\u4e94\u4e2a\u4eba\u5404\u6709\u7279\u70b9\uff0c\u6216\u8005\u8bf4\u5404\u81ea\u4f1a\u5728\u7279\u5b9a\u60c5\u51b5\u4e0b\u89e6\u53d1\u81ea\u5df1\u7684\u6050\u60e7\u75c7\uff0c\u8fdb\u800c\u53d1\u51fa\u5c16\u53eb\u3002\u5177\u4f53\u6765\u8bf4\uff1a<\/p>\n<ul>\n<li>Lee\uff1a\u5bf9\u4e8e\u201cAAGH!\u201d\uff08\u4e5f\u5c31\u662f\u201c\u554a\uff01\u201d\uff09\u8fd9\u4e2a\u8bcd\u5f88\u6050\u60e7\n<ul>\n<li>\u4e14\u8fd9\u4e2a\u8bcd\u5fc5\u987b\u662f\u522b\u4eba\u53d1\u51fa\u7684<\/li>\n<\/ul>\n<\/li>\n<li>Jim\uff1a\u5bf9\u4e8e\u9053\u6b49\uff08\u6216\u8005\u8bf4\u201cSorry\u201d\u8fd9\u4e2a\u8bcd\uff09\u5f88\u6050\u60e7\n<ul>\n<li>\u81ea\u5df1\u8bf4\u7684\u8fd9\u4e2a\u8bcd\u4e5f\u662f\u53ef\u4ee5\u89e6\u53d1\u81ea\u5df1\u7684\u6050\u60e7\u7684<\/li>\n<\/ul>\n<\/li>\n<li>Karen\uff1a\u5bf9\u4e8e\u91cd\u590d\u7684\u8bdd\u5f88\u6050\u60e7\n<ul>\n<li>\u4e24\u53e5\u91cd\u590d\u7684\u8bdd\u5fc5\u987b\u90fd\u662f\u522b\u4eba\u8bf4\u7684<\/li>\n<li>\uff08\u4ece\u89c6\u9891\u4e2d\u6765\u770b\uff0c\u4e24\u53e5\u91cd\u590d\u7684\u8bdd\u751a\u81f3\u53ef\u4ee5\u95f4\u9694\u5f88\u4e45\uff0c\u4f46\u8fd9\u79cd\u60c5\u51b5\u96be\u4ee5\u6982\u62ec\uff0c\u4e14\u89c6\u9891\u4e2d\u5176\u4ed6\u65f6\u5019\u4e5f\u6709\u91cd\u590d\u7684\u8bdd\uff0c\u4f46\u5e76\u672a\u89e6\u53d1\uff0c\u6240\u4ee5\u5b58\u5728 BUG\uff0c\u6682\u4e0d\u8003\u8651\uff09<\/li>\n<\/ul>\n<\/li>\n<li>Ronnie\uff1a\u5bf9\u4e8e\u201c\u5c34\u5c2c\u7684\u6c89\u9ed8\u201d\u5f88\u6050\u60e7\n<ul>\n<li>\u4e5f\u5c31\u662f\u8bf4\uff0c\u5982\u679c\u6709\u4eba\u8bf4\u4e86\u4e00\u53e5\u8bdd\uff0c\u7136\u540e\u6ca1\u6709\u4eba\u56de\u5e94\uff0c\u90a3\u4e48\u5c31\u4f1a\u89e6\u53d1<\/li>\n<li>\u524d\u63d0\u662f\u5fc5\u987b\u6709\u4eba\u5148\u8bf4\u4e86\u4ec0\u4e48\uff0c\u800c\u4e0d\u662f\u6253\u4e00\u5f00\u59cb\u5c31\u6ca1\u6709\u4efb\u4f55\u4eba\u8bf4\u8bdd<\/li>\n<\/ul>\n<\/li>\n<li>Tim\uff1a\u5bf9\u4e8e\u522b\u4eba\u56e0\u6050\u60e7\u800c\u53d1\u51fa\u5c16\u53eb\u8fd9\u4ef6\u4e8b\u60c5\u611f\u5230\u6050\u60e7\uff0c\u5e76\u4e14\u4f1a\u5413\u51fa\u72d7\u53eb\n<ul>\n<li>\u5f53\u5176\u4ed6\u6709\u4eba\u53d1\u51fa\u4e86\u6050\u60e7\u7684\u5c16\u53eb\uff0c\u4e14\u4e4b\u540e\u4e0d\u518d\u4f1a\u6709\u4eba\u5c16\u53eb\u65f6\uff0c\u4ed6\u4f1a\u53d1\u51fa\u72d7\u53eb<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u5927\u5bb6\u53ef\u4ee5\u591a\u770b\u51e0\u904d\u89c6\u9891\uff0c\u5c24\u5176\u662f\u9760\u8fd1\u540e\u9762\u7684\u5730\u65b9\uff0c\u4ed6\u4eec\u8fde\u7eed\u76f8\u7ee7\u53d1\u51fa\u5c16\u53eb\u58f0\u7684\u7247\u6bb5\uff0c\u770b\u770b\u6211\u4e0a\u9762\u603b\u7ed3\u7684\u662f\u5426\u6b63\u786e\u3002<\/p>\n<p>\u90a3\u4e48\u73b0\u5728\uff0c\u6211\u4eec\u5c31\u6765\u6a21\u62df\u8fd9\u4e2a\u60c5\u666f\u77ed\u5267\u5427\u3002<\/p>\n<h2 id=\"\u5b9e\u73b0\u6d88\u606f\u603b\u7ebf\">\n\u5b9e\u73b0\u6d88\u606f\u603b\u7ebf\n<a href=\"#%e5%ae%9e%e7%8e%b0%e6%b6%88%e6%81%af%e6%80%bb%e7%ba%bf\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u6a21\u62df\u6bcf\u4e2a\u4eba\u4e4b\u524d\uff0c\u6211\u4eec\u9996\u5148\u9700\u8981\u6709\u4e00\u4e2a\u6d88\u606f\u603b\u7ebf\uff08Message Bus\uff09\u3002\u6709\u4e86\u8fd9\u4e2a\u603b\u7ebf\uff0c\u6211\u4eec\u624d\u53ef\u4ee5\u65e2\u8ba9\u6240\u6709\u4eba\u90fd\u80fd\u591f\u6536\u542c\uff08\u6216\u8005\u8bf4\u8ba2\u9605\uff09\u8fd9\u4e2a\u603b\u7ebf\uff0c\u53c8\u53ef\u4ee5\u5411\u603b\u7ebf\u4e2d\u53d1\u9001\u6d88\u606f\u3002<\/p>\n<p>\u5728 Rx.NET \u4e2d\uff0c<code>Subject<\/code> \u8fd9\u4e2a\u7c7b\u578b\u5c31\u662f\u5178\u578b\u7684\u80fd\u591f\u5b9e\u73b0\u8fd9\u4e00\u6548\u679c\u7684\u7c7b\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5b9e\u73b0\u4e00\u4e2a\u6d88\u606f\u603b\u7ebf\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MessageBus<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IDisposable<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5185\u90e8\u4f7f\u7528\u4e00\u4e2a Subject \u5bf9\u8c61<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">Subject<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Message<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_subject<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5f53\u7528\u4e8e\u8ba2\u9605\u65f6\uff0c\u8fd4\u56de\u4e00\u4e2a IObservable&lt;Message&gt; \u5bf9\u8c61\uff0c\u4ece\u800c\u5c01\u88c5\u7c7b\u4e2d\u5176\u4ed6\u529f\u80fd<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">IObservable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Message<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Messages<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">_subject<\/span><span class=\"p\">.<\/span><span class=\"n\">AsObservable<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ \u5f53\u5411\u603b\u7ebf\u4e2d\u53d1\u9001\u6d88\u606f\u65f6\uff0c\u5e95\u5c42\u4f1a\u8c03\u7528 Subject \u7684 OnNext \u65b9\u6cd5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">SendMessage<\/span><span class=\"p\">(<\/span><span class=\"n\">Message<\/span> <span class=\"n\">message<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">message<\/span><span class=\"p\">.<\/span><span class=\"n\">Content<\/span> <span class=\"p\">==<\/span> <span class=\"s\">&#34;exit&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_subject<\/span><span class=\"p\">.<\/span><span class=\"n\">OnCompleted<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">else<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_subject<\/span><span class=\"p\">.<\/span><span class=\"n\">OnNext<\/span><span class=\"p\">(<\/span><span class=\"n\">message<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Dispose<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_subject<\/span><span class=\"p\">.<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u540c\u65f6\uff0c\u6211\u4eec\u4e5f\u9700\u8981\u4e00\u4e2a <code>Message<\/code> \u7c7b\u578b\uff0c\u4ece\u800c\u66f4\u597d\u5730\u8ba9\u63a5\u4e0b\u6765\u7684\u6bcf\u4e00\u4e2a\u4eba\u90fd\u80fd\u591f\u5224\u65ad\u81ea\u5df1\u662f\u5426\u5e94\u8be5\u53d1\u51fa\u5c16\u53eb\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">record<\/span> <span class=\"nc\">Message<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">Sender<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Content<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u662f\u7684\uff0c\u4e00\u4e2a\u7b80\u5355\u7684\u8bb0\u5f55\u7c7b\u5c31\u53ef\u4ee5\u6ee1\u8db3\u6211\u4eec\u7684\u9700\u6c42\u4e86\u3002\u4e0a\u9762\u7684\u6bcf\u4e00\u4e2a\u4eba\uff0c\u5b83\u4eec\u90fd\u53ea\u9700\u8981\u77e5\u9053\u662f\u8c01\u8bf4\u7684\uff0c\u4ee5\u53ca\u8bf4\u4e86\u4ec0\u4e48\uff0c\u5c31\u8db3\u591f\u5904\u7406\u5404\u81ea\u7684\u903b\u8f91\u4e86\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5728 <a class=\"link\" href=\"https:\/\/github.com\/reactiveui\/ReactiveUI\" target=\"_blank\" rel=\"noopener\"\n>ReactiveUI<\/a> \u4e2d\u4e5f\u6709\u4e00\u4e2a\u6d88\u606f\u603b\u7ebf\u7c7b\u578b\uff0c\u540d\u53eb <code>MessageBus<\/code>\u3002\u5b83\u5e95\u5c42\u5176\u5b9e\u5c31\u662f\u501f\u52a9\u4e86\u4e00\u4e2a <code>Subject<\/code> \u6765\u5b9e\u73b0\u7684\u3002\u5f53\u7136\u5b9e\u9645\u4e0a\u66f4\u590d\u6742\u4e00\u4e9b\uff0c\u56e0\u4e3a\u8fd8\u6709\u4e0e <code>Scheduler<\/code> \u76f8\u5173\u7684\u4e00\u4e9b\u989d\u5916\u7684\u529f\u80fd\uff0c\u6240\u4ee5\u5b83\u989d\u5916\u5b9e\u73b0\u4e86\u4e00\u4e2a\u540d\u4e3a <a class=\"link\" href=\"https:\/\/github.com\/reactiveui\/ReactiveUI\/blob\/main\/src\/ReactiveUI\/Scheduler\/ScheduledSubject.cs\" target=\"_blank\" rel=\"noopener\"\n><code>ScheduledSubject<\/code><\/a> \u7684\u7c7b\u3002<\/div>\n<\/div>\n<h2 id=\"\u6a21\u62df\u6bcf\u4e00\u4e2a\u4eba\u7684\u884c\u4e3a\">\n\u6a21\u62df\u6bcf\u4e00\u4e2a\u4eba\u7684\u884c\u4e3a\n<a href=\"#%e6%a8%a1%e6%8b%9f%e6%af%8f%e4%b8%80%e4%b8%aa%e4%ba%ba%e7%9a%84%e8%a1%8c%e4%b8%ba\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e0b\u9762\u6211\u4eec\u5c31\u6839\u636e\u51fa\u573a\u987a\u5e8f\uff0c\u6765\u9010\u4e2a\u6a21\u62df\u6bcf\u4e2a\u4eba\u7684\u903b\u8f91\u5427\u3002\u8fd9\u91cc\u4e3a\u4e86\u7b80\u5355\u8d77\u89c1\uff0c\u6211\u4eec\u7edf\u4e00\u4f7f\u7528\u5c0f\u5199\uff0c\u5e76\u4e14\u4e3a\u6240\u6709\u4eba\u8bbe\u5b9a\u4e86\u4e00\u4e2a\u56fa\u5b9a\u7684\u5ef6\u8fdf\u3002\u6b64\u5916\uff0c\u8fd8\u9700\u8981\u7ed9\u4e24\u4e2a\u4eba\u989d\u5916\u7684\u65f6\u95f4\uff1a<\/p>\n<ul>\n<li>\u7ed9 Ronnie \u4e00\u4e2a\u65f6\u95f4\u9608\u503c\uff0c\u8868\u793a\u591a\u4e45\u4e4b\u540e\u624d\u4f1a\u88ab\u5979\u5224\u5b9a\u4e3a\u957f\u65f6\u95f4\u7684\u201c\u5c34\u5c2c\u7684\u6c89\u9ed8\u201d<\/li>\n<li>\u7ed9 Tim \u4e00\u4e2a\u76f8\u5bf9\u66f4\u957f\u4e00\u70b9\u7684\u5ef6\u8fdf\uff0c\u4ece\u800c\u8ba9\u4ed6\u80fd\u591f\u5728\u786e\u4fdd\u5176\u4ed6\u4eba\u90fd\u4e0d\u518d\u5c16\u53eb\u4e4b\u540e\uff0c\u624d\u53d1\u51fa\u81ea\u5df1\u7684\u72d7\u53eb<\/li>\n<\/ul>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">reactionDelay<\/span> <span class=\"p\">=<\/span> <span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"m\">0.25<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">ronnieSilenceThreshold<\/span> <span class=\"p\">=<\/span> <span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"m\">3<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">timReactionDelay<\/span> <span class=\"p\">=<\/span> <span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"m\">0.3<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u540c\u65f6\uff0c\u6211\u4eec\u8fd8\u8981\u58f0\u660e\u524d\u9762\u5b9a\u4e49\u597d\u7684\u6d88\u606f\u603b\u7ebf\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">bus<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MessageBus<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\uff0c\u6bcf\u4e2a\u4eba\u90fd\u80fd\u591f\u6536\u542c\u8fd9\u4e2a\u603b\u7ebf\uff0c\u5e76\u4e14\u81ea\u5df1\u53d1\u51fa\u7684\u5c16\u53eb\u4e5f\u8981\u4f20\u9012\u7ed9\u8fd9\u4e2a\u603b\u7ebf\u3002<\/p>\n<h3 id=\"lee\">\nLee\n<a href=\"#lee\" class=\"anchor\">&para;<\/a>\n<\/h3><p>Lee \u7684\u903b\u8f91\u5f88\u7b80\u5355\uff0c\u53ea\u8981\u542c\u5230\u4e86\u522b\u4eba\u8bf4\u7684 \u201cAAGH!\u201d\u8fd9\u4e2a\u8bcd\uff0c\u5c31\u4f1a\u53d1\u51fa\u5c16\u53eb\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">agent1<\/span> <span class=\"p\">=<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">Messages<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">m<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">m<\/span><span class=\"p\">.<\/span><span class=\"n\">Content<\/span> <span class=\"p\">==<\/span> <span class=\"s\">&#34;aagh&#34;<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">m<\/span><span class=\"p\">.<\/span><span class=\"n\">Sender<\/span> <span class=\"p\">!=<\/span> <span class=\"s\">&#34;agent1&#34;<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ \u522b\u4eba\u8bf4\u7684 aagh<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"n\">reactionDelay<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Subscribe<\/span><span class=\"p\">(<\/span><span class=\"n\">_<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">SendMessage<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;agent1&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;aagh&#34;<\/span><span class=\"p\">)));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"jim\">\nJim\n<a href=\"#jim\" class=\"anchor\">&para;<\/a>\n<\/h3><p>Jim \u7684\u903b\u8f91\u4e5f\u5f88\u7b80\u5355\uff0c\u53ea\u8981\u542c\u5230\u4e86 \u201cSorry\u201d \u8fd9\u4e2a\u8bcd\uff08\u4e0d\u7528\u7ba1\u662f\u8c01\u53d1\u51fa\u7684\uff09\uff0c\u5c31\u4f1a\u53d1\u51fa\u5c16\u53eb\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">agent2<\/span> <span class=\"p\">=<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">Messages<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">m<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">m<\/span><span class=\"p\">.<\/span><span class=\"n\">Content<\/span> <span class=\"p\">==<\/span> <span class=\"s\">&#34;sorry&#34;<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ \u65e0\u8bba\u662f\u8c01\u8bf4\u7684 sorry<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"n\">reactionDelay<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Subscribe<\/span><span class=\"p\">(<\/span><span class=\"n\">_<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">SendMessage<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;agent2&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;aagh&#34;<\/span><span class=\"p\">)));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"karen\">\nKaren\n<a href=\"#karen\" class=\"anchor\">&para;<\/a>\n<\/h3><p>Karen \u7684\u903b\u8f91\u7a0d\u5fae\u590d\u6742\u4e00\u70b9\uff0c\u56e0\u4e3a\u5979\u9700\u8981\u5224\u65ad\u4e24\u53e5\u8bdd\u662f\u5426\u91cd\u590d\uff0c\u4e14\u90fd\u662f\u522b\u4eba\u8bf4\u7684\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">agent3<\/span> <span class=\"p\">=<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">Messages<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Buffer<\/span><span class=\"p\">(<\/span><span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">1<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">ms<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">ms<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">==<\/span> <span class=\"m\">2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">ms<\/span><span class=\"p\">[<\/span><span class=\"m\">0<\/span><span class=\"p\">].<\/span><span class=\"n\">Content<\/span> <span class=\"p\">==<\/span> <span class=\"n\">ms<\/span><span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">].<\/span><span class=\"n\">Content<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">ms<\/span><span class=\"p\">[<\/span><span class=\"m\">0<\/span><span class=\"p\">].<\/span><span class=\"n\">Sender<\/span> <span class=\"p\">!=<\/span> <span class=\"s\">&#34;agent3&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">ms<\/span><span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">].<\/span><span class=\"n\">Sender<\/span> <span class=\"p\">!=<\/span> <span class=\"s\">&#34;agent3&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"n\">reactionDelay<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Subscribe<\/span><span class=\"p\">(<\/span><span class=\"n\">_<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">SendMessage<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;agent3&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;aagh&#34;<\/span><span class=\"p\">)));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"ronnie\">\nRonnie\n<a href=\"#ronnie\" class=\"anchor\">&para;<\/a>\n<\/h3><p>Ronnie \u7684\u903b\u8f91\u4e5f\u6bd4\u8f83\u7b80\u5355\uff0c\u53ea\u8981\u6709\u4eba\u8bf4\u4e86\u8bdd\uff0c\u7136\u540e\u6ca1\u6709\u4eba\u56de\u5e94\uff0c\u5c31\u4f1a\u53d1\u51fa\u5c16\u53eb\u3002\u90a3\u4e48 Rx \u4e2d\u7684 <code>Throttle<\/code> \u65b9\u6cd5\u7b80\u76f4\u5c31\u662f\u4e3a\u5979\u91cf\u8eab\u6253\u9020\u7684\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">agent4<\/span> <span class=\"p\">=<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">Messages<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Throttle<\/span><span class=\"p\">(<\/span><span class=\"n\">ronnieSilenceThreshold<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ .Delay(reactionDelay) \/\/ \u8fd9\u53e5\u4e5f\u53ef\u4ee5\u4e0d\u5199<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Subscribe<\/span><span class=\"p\">(<\/span><span class=\"n\">_<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">SendMessage<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;agent4&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;aagh&#34;<\/span><span class=\"p\">)));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"tim\">\nTim\n<a href=\"#tim\" class=\"anchor\">&para;<\/a>\n<\/h3><p>Tim \u5176\u5b9e\u4e0e Ronnie \u7c7b\u4f3c\uff0c\u53ea\u8981\u6709\u4eba\u53d1\u51fa\u4e86\u5c16\u53eb\uff0c\u7136\u540e\u4e4b\u540e\u6ca1\u6709\u4eba\u518d\u53d1\u51fa\u5c16\u53eb\uff0c\u4ed6\u5c31\u4f1a\u53d1\u51fa\u72d7\u53eb\u3002\u6240\u4ee5\u6211\u4eec\u540c\u6837\u53ef\u4ee5\u4f7f\u7528 <code>Throttle<\/code> \u65b9\u6cd5\u6765\u5b9e\u73b0\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">agent5<\/span> <span class=\"p\">=<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">Messages<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">m<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">m<\/span><span class=\"p\">.<\/span><span class=\"n\">Content<\/span> <span class=\"p\">==<\/span> <span class=\"s\">&#34;aagh&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Throttle<\/span><span class=\"p\">(<\/span><span class=\"n\">timReactionDelay<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Subscribe<\/span><span class=\"p\">(<\/span><span class=\"n\">_<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">SendMessage<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;agent5&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;woof&#34;<\/span><span class=\"p\">)));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u653e\u5728\u4e00\u8d77\">\n\u653e\u5728\u4e00\u8d77\n<a href=\"#%e6%94%be%e5%9c%a8%e4%b8%80%e8%b5%b7\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\uff0c\u6211\u4eec\u5c06\u4e0a\u9762\u7684\u4ee3\u7801\u653e\u5728\u4e00\u8d77\u3002\u4e3a\u4e86\u80fd\u591f\u4fbf\u4e8e\u89c2\u5bdf\u6548\u679c\uff0c\u6211\u4eec\u4f7f\u7528 LINQPad \u6765\u7b80\u5355\u5730\u642d\u5efa\u8fd9\u6bb5\u4ee3\u7801\uff0c\u5e76\u4e14\u989d\u5916\u6dfb\u52a0\u4e00\u4e2a <code>agent<\/code>\uff0c\u4ee3\u8868\u7528\u6237\u7684\u8f93\u5165\u3002\u8fd9\u6837\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u8f93\u5165\u6765\u6a21\u62df\u6bcf\u4e2a\u4eba\u7684\u53d1\u8a00\u4e86\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">bool<\/span> <span class=\"n\">isCompleted<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">Messages<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">.<\/span><span class=\"n\">Subscribe<\/span><span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">m<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">$&#34;[{DateTime.Now: mm:ss.fff}] {m.Sender}: {m.Content}&#34;<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">isCompleted<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">while<\/span> <span class=\"p\">(!<\/span><span class=\"n\">isCompleted<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">input<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Util<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadLine<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">bus<\/span><span class=\"p\">.<\/span><span class=\"n\">SendMessage<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;user&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">input<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5b8c\u6574\u7248\u4ee3\u7801\u53ef\u4ee5\u67e5\u770b<a class=\"link\" href=\"https:\/\/gist.github.com\/BYJRK\/6912c2df1e6dd5b705400c006b6be627\" target=\"_blank\" rel=\"noopener\"\n>\u8fd9\u4e2a Gist<\/a>\u3002<\/p>\n<p>\u8fd0\u884c\u770b\u4e00\u4e0b\u6548\u679c\u3002\u8f93\u5165\u201caagh\u201d\u4f1a\u770b\u5230\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">[55:26.812] user: aagh\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:27.112] agent1: aagh\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:27.362] agent3: aagh\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:27.625] agent1: aagh\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:27.941] agent5: woof\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8f93\u5165\u201csorry\u201d\u4f1a\u770b\u5230\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">[55:34.985] user: sorry\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:35.236] agent2: aagh\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:35.499] agent1: aagh\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:35.763] agent3: aagh\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:36.027] agent1: aagh\n<\/span><\/span><span class=\"line\"><span class=\"cl\">[55:36.339] agent5: woof\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u901a\u8fc7\u8fd9\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0cRx.NET \u7684\u5f3a\u5927\u4e4b\u5904\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u7b80\u5355\u7684\u7c7b\u4f3c LINQ \u4e00\u6837\u7684\u67e5\u8be2\uff0c\u5c31\u80fd\u591f\u5b9e\u73b0\u590d\u6742\u7684\u903b\u8f91\u3002\u8fd9\u79cd\u65b9\u5f0f\u4e0d\u4ec5\u7b80\u6d01\uff0c\u800c\u4e14\u6613\u4e8e\u7406\u89e3\uff0c\u540c\u65f6\u4e5f\u80fd\u591f\u5f88\u597d\u5730\u5904\u7406\u5f02\u6b65\u7684\u60c5\u51b5\u3002\u8bd5\u60f3\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u4eec\u4f7f\u7528\u4f20\u7edf\u7684\u591a\u7ebf\u7a0b\u6216\u5f02\u6b65\u7f16\u7a0b\u6765\u5b9e\u73b0\u76f8\u540c\u7684\u6548\u679c\uff0c\u90a3\u4e48\u4ee3\u7801\u4f1a\u53d8\u5f97\u591a\u4e48\u590d\u6742\u3002<\/p>\n<p>\u4e4b\u540e\u6211\u4eec\u8fd8\u4f1a\u7ee7\u7eed\u63a2\u8ba8 Rx.NET \u7684\u66f4\u591a\u7528\u6cd5\uff0c\u7528\u66f4\u591a\u5b9e\u9645\u4e14\u751f\u52a8\u7684\u4f8b\u5b50\uff0c\u6765\u5e2e\u52a9\u5927\u5bb6\u66f4\u597d\u5730\u7406\u89e3\u8fd9\u4e2a\u5e93\u3002<\/p>"},{"title":"\u4e3a\u4ec0\u4e48 IEnumerable \u5bf9\u8c61\u6ca1\u6709 ForEach \u65b9\u6cd5\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/why-ienumerable-no-foreach\/","pubDate":"Wed, 17 Apr 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/why-ienumerable-no-foreach\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/04\/17\/diwtgBYmexonr14.jpg\" alt=\"Featured image of post \u4e3a\u4ec0\u4e48 IEnumerable \u5bf9\u8c61\u6ca1\u6709 ForEach \u65b9\u6cd5\uff1f\" \/><h2 id=\"\u4fbf\u6377\u7684-foreach-\u65b9\u6cd5\">\n\u4fbf\u6377\u7684 ForEach \u65b9\u6cd5\n<a href=\"#%e4%be%bf%e6%8d%b7%e7%9a%84-foreach-%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>C# \u4e2d\uff0c<code>List<\/code> \u7c7b\u578b\uff08\u5176\u4ed6\u8fd8\u5305\u62ec <code>ImmutableList<\/code> \u7b49\uff09\u62e5\u6709\u4e00\u4e2a\u540d\u4e3a <code>ForEach<\/code> \u7684\u65b9\u6cd5\u3002\u5b83\u7684\u4f5c\u7528\u53ef\u4ee5\u7406\u89e3\u4e3a\u4f20\u7edf <code>foreach<\/code> \u8bed\u53e5\u7684\u53e6\u4e00\u79cd\u51fd\u6570\u5f0f\u7684\u5199\u6cd5\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">list<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">3<\/span><span class=\"p\">,<\/span> <span class=\"m\">4<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f20\u7edf\u7684 foreach \u8bed\u53e5<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">n<\/span> <span class=\"k\">in<\/span> <span class=\"n\">list<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4fbf\u6377\u7684 ForEach \u65b9\u6cd5\u53ef\u4ee5\u5b9e\u73b0\u76f8\u540c\u7684\u6548\u679c<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">ForEach<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\uff08One-liner \u72c2\u559c\uff09<\/p>\n<p>\u6b64\u5916\uff0c<code>Array<\/code> \u7c7b\u8fd8\u62e5\u6709\u4e00\u4e2a <code>ForEach<\/code> \u9759\u6001\u65b9\u6cd5\uff0c\u540c\u6837\u53ef\u4ee5\u5b9e\u73b0\u7c7b\u4f3c\u7684\u529f\u80fd\u3002\u4f46\u5f88\u5feb\u6211\u4eec\u5c31\u4f1a\u53d1\u73b0\uff0c\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u597d\u7528\u7684\u65b9\u6cd5\uff0c\u6211\u4eec\u5374\u4e0d\u80fd\u7528\u5728\u4e00\u4e2a <code>IEnumerable<\/code> \uff08\u8fd9\u91cc\u6307\u7684\u662f\u6cdb\u578b\u63a5\u53e3 <code>IEnumerable&lt;T&gt;<\/code>\uff0c\u4e0b\u9762\u4e0d\u518d\u8d58\u8ff0\uff09\u63a5\u53e3\u7c7b\u578b\u4e0a\u5462\uff1f<\/p>\n<div class=\"notice note\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-sticky-note\" aria-hidden=\"true\"><\/i>Note\n<\/div>\n<div class=\"notice-content\">\u5728\u67d0\u4e9b\u8bfb\u8005\u53ef\u80fd\u4f1a\u53d1\u95ee\u4e4b\u524d\uff0c\u6211\u628a\u201c\u4e11\u8bdd\u8bf4\u5728\u524d\u9762\u201d\uff1a\u5c06\u4e00\u4e2a <code>IEnumerable<\/code> \u7c7b\u578b\u4f7f\u7528 <code>ToList()<\/code> \u65b9\u6cd5\u8f6c\u4e3a <code>List<\/code>\uff0c\u53ea\u4e3a\u4f7f\u7528 <code>ForEach()<\/code> \u7edd\u5bf9\u4e0d\u662f\u4e00\u4e2a\u597d\u4e3b\u610f\uff0c\u56e0\u4e3a\u8fd9\u5f88\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u6d88\u8017 LINQ \u8bed\u53e5\uff0c\u521b\u5efa\u65b0\u5bf9\u8c61\uff0c\u4ee5\u53ca\u9010\u4e2a\u586b\u5145\u5143\u7d20\u7b49\u3002<\/div>\n<\/div>\n<p>\u5176\u5b9e\u8fd9\u6837\u8bbe\u8ba1\u662f\u6709\u539f\u56e0\u7684\u3002\u6211\u5927\u6982\u603b\u7ed3\u4e86\u8fd9\u4e48\u51e0\u6761\uff0c\u5927\u5bb6\u542c\u4e00\u542c\u662f\u4e0d\u662f\u8fd9\u4e48\u4e2a\u9053\u7406\u3002<\/p>\n<h2 id=\"\u6dfb\u52a0-foreach-\u65b9\u6cd5\u7684\u540e\u679c\">\n\u6dfb\u52a0 ForEach \u65b9\u6cd5\u7684\u540e\u679c\n<a href=\"#%e6%b7%bb%e5%8a%a0-foreach-%e6%96%b9%e6%b3%95%e7%9a%84%e5%90%8e%e6%9e%9c\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"\u7834\u574f\u63a5\u53e3\u7684\u7eaf\u7cb9\u6027\">\n\u7834\u574f\u63a5\u53e3\u7684\u7eaf\u7cb9\u6027\n<a href=\"#%e7%a0%b4%e5%9d%8f%e6%8e%a5%e5%8f%a3%e7%9a%84%e7%ba%af%e7%b2%b9%e6%80%a7\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u8fd9\u53e5\u8bdd\u5982\u679c\u8bf4\u5f97\u518d\u201c\u4e13\u4e1a\u201d\u4e00\u70b9\uff0c\u5c31\u662f\u8fdd\u80cc\u4e86 SOLID \u539f\u5219\u4e2d\u7684\u201c\u5355\u4e00\u804c\u8d23\u539f\u5219\u201d\uff08Single responsibility principle\uff09\u4ee5\u53ca\u201c\u63a5\u53e3\u9694\u79bb\u539f\u5219\u201d\uff08Interface segregation principle\uff09\u3002<\/p>\n<p>\u600e\u4e48\u8bb2\uff1f\u6211\u4eec\u53ef\u4ee5\u770b\u4e00\u4e0b <code>IEnumerable<\/code> \u63a5\u53e3\u7684\u5b9a\u4e49\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">namespace<\/span> <span class=\"nn\">System.Collections.Generic<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">interface<\/span> <span class=\"nc\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"k\">out<\/span> <span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IEnumerable<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">new<\/span> <span class=\"n\">IEnumerator<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">GetEnumerator<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u975e\u5e38\u5730\u5e72\u51c0\u3002\u5c31\u8fde\u5b83\u7684\u540d\u5b57\u4e5f\u8868\u660e\u4e86\uff0c\u5b83\u53ea\u662f\u8868\u660e\u4e00\u4e2a\u5bf9\u8c61\u62e5\u6709\u201c\u88ab\u679a\u4e3e\u201d\u7684\u80fd\u529b\u3002\u4f46\u662f <code>ForEach<\/code> \u65b9\u6cd5\u901a\u5e38\u4f1a\u4f34\u968f\u7740\u4e00\u4e9b\u6267\u884c\u903b\u8f91\uff0c\u8fd9\u53ef\u80fd\u5c31\u4e0e\u63a5\u53e3\u7684\u521d\u8877\u4e0d\u7b26\u4e86\u3002<\/p>\n<p>\u4e0d\u540c\u4e8e LINQ \u4e2d\u7684 <code>Select<\/code>\u3001<code>Where<\/code>\u3001<code>OrderBy<\/code> \u7b49\uff0c\u5b83\u4eec\u90fd\u662f\u5bf9\u4e8e\u6570\u636e\u7684\u6620\u5c04\u3001\u7b5b\u9009\u3001\u6392\u5e8f\u7b49\uff0c\u901a\u5e38\u4e0d\u4f1a\u5305\u542b\u4ec0\u4e48\u903b\u8f91\u64cd\u4f5c\u3002\u8bd5\u60f3\uff0c\u5982\u679c LINQ \u4e2d\u5305\u542b\u4e86\u903b\u8f91\u64cd\u4f5c\uff0c\u5c24\u5176\u8fd8\u662f\u8017\u65f6\u7684\u64cd\u4f5c\uff08\u6bd4\u5982\u5360\u7528 CPU \u7684\u590d\u6742\u8ba1\u7b97\u3001IO \u64cd\u4f5c\u7b49\uff09\u65f6\uff0cLINQ \u7684\u4f7f\u7528\u5c06\u4f1a\u53d8\u5f97\u4e0d\u90a3\u4e48\u53ef\u9760\u3002<\/p>\n<p>\u6240\u4ee5\uff0c\u5047\u5982 <code>ForEach<\/code> \u65b9\u6cd5\u4e2d\u4e5f\u5b58\u5728\u8fd9\u6837\u7684\u8017\u65f6\u64cd\u4f5c\uff0c\u6211\u4eec\u66f4\u5e94\u8be5\u8003\u8651\u7684\u505a\u6cd5\u662f\u4f7f\u7528\u5f02\u6b65\u7f16\u7a0b\uff08\u6bd4\u5982\u521b\u5efa\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\uff0c\u7136\u540e\u4f7f\u7528 <code>Task.WhenAll<\/code> \u65b9\u6cd5\u8fdb\u884c\u7b49\u5f85\uff09\uff0c\u4f7f\u7528 <code>Parallel<\/code> \u7c7b\u6216\u8005 PLINQ \u7b49\uff0c\u4ece\u800c\u4f7f\u5f97\u6211\u4eec\u7684 <code>IEnumerable<\/code> \u5bf9\u8c61\u53ea\u5305\u542b\u6570\u636e\u5e8f\u5217\uff0c\u4e0d\u5305\u542b\u4e0d\u53ef\u63a7\u7684\u64cd\u4f5c\u903b\u8f91\u3002<\/p>\n<p>\u8fd9\u91cc\u7ed9\u51fa\u4e00\u4e2a\u7b80\u5355\u7684\u4f7f\u7528\u5f02\u6b65\u7684\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">items<\/span> <span class=\"p\">=<\/span> <span class=\"p\">...;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">tasks<\/span> <span class=\"p\">=<\/span> <span class=\"n\">items<\/span><span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">CalculateValueAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">await<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">WhenAll<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">results<\/span> <span class=\"p\">=<\/span> <span class=\"n\">tasks<\/span><span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">t<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">t<\/span><span class=\"p\">.<\/span><span class=\"n\">Result<\/span><span class=\"p\">).<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"\u65b9\u6cd5\u5e26\u6765\u7684\u526f\u4f5c\u7528\">\n\u65b9\u6cd5\u5e26\u6765\u7684\u526f\u4f5c\u7528\n<a href=\"#%e6%96%b9%e6%b3%95%e5%b8%a6%e6%9d%a5%e7%9a%84%e5%89%af%e4%bd%9c%e7%94%a8\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u8bda\u7136\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u5df1\u5199\u4e00\u4e2a\u6269\u5c55\u65b9\u6cd5\uff0c\u4ece\u800c\u8ba9 <code>IEnumerable<\/code> \u5bf9\u8c61\u80fd\u591f\u50cf <code>List<\/code> \u90a3\u6837\u4f7f\u7528 <code>ForEach<\/code> \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">EnumerableExtensions<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"k\">void<\/span> <span class=\"n\">ForEach<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;(<\/span><span class=\"k\">this<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">items<\/span><span class=\"p\">,<\/span> <span class=\"n\">Action<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">action<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">item<\/span> <span class=\"k\">in<\/span> <span class=\"n\">items<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">action<\/span><span class=\"p\">.<\/span><span class=\"n\">Invoke<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u8fd9\u53ef\u80fd\u4f1a\u9020\u6210\u5bf9 LINQ \u73b0\u6709\u529f\u80fd\u7684\u6c61\u67d3\u3002\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u8bf4\u5462\uff1f<\/p>\n<p>\u6211\u4eec\u6765\u60f3\u4e00\u60f3\uff0cLINQ \u63d0\u4f9b\u7684\u529f\u80fd\u4e3b\u8981\u662f\u505a\u4ec0\u4e48\u7684\uff1f\u5176\u5b9e\u4e3b\u8981\u662f\u5bf9\u4e8e\u6570\u636e\u7684\u6620\u5c04\u3001\u7b5b\u9009\u3001\u6392\u5e8f\u7b49\u3002\u8fd9\u4e9b\u65b9\u6cd5\u901a\u5e38\u90fd\u88ab\u8ba4\u4e3a\u4e0d\u4f1a\u5bf9\u539f\u59cb\u6570\u636e\u9020\u6210\u5f71\u54cd\uff0c\u6216\u8005\u4fee\u6539\u3002\u867d\u7136\u8fd9\u4e9b\u65b9\u6cd5\u4e5f\u4f1a\u63a5\u6536\u4e00\u4e2a\u56de\u8c03\uff0c\u4f46\u662f\u8fd9\u4e2a\u56de\u8c03\u4e00\u5b9a\u662f\u4e2a <code>Func<\/code>\uff0c\u4ece\u800c\u8fd4\u56de\u6620\u5c04\u540e\u7684\u5bf9\u8c61\u3001\u7b5b\u9009\u53ca\u6392\u5e8f\u7684\u4f9d\u636e\u7b49\u3002<\/p>\n<p>\u4f46\u662f <code>ForEach<\/code> \u65b9\u6cd5\u5219\u4e0d\u540c\uff0c\u5b83\u63a5\u6536\u7684\u662f\u4e00\u4e2a <code>Action<\/code>\uff0c\u90a3\u5c31\u662f\u8bf4\u8fd9\u4e2a\u56de\u8c03\u5e76\u4e0d\u9700\u8981\u8fd4\u56de\u4ec0\u4e48\u3002\u6b64\u65f6\u6211\u4eec\u7684\u64cd\u4f5c\u901a\u5e38\u5c31\u6709\u53ef\u80fd\u4f1a\u5bf9\u539f\u59cb\u6570\u636e\u4ea7\u751f\u5f71\u54cd\u4e86\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Employee<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">employees<\/span> <span class=\"p\">=<\/span> <span class=\"p\">...;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">employees<\/span><span class=\"p\">.<\/span><span class=\"n\">ForEach<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">IsPromoted<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ \u5982\u679c\u5458\u5de5\u664b\u5347\uff0c\u5219\u6da8\u85aa<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"n\">Salary<\/span> <span class=\"p\">+=<\/span> <span class=\"m\">1000<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">})<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6240\u4ee5\uff0c\u4f7f\u7528 <code>ForEach<\/code> \u65f6\u6211\u4eec\u662f\u503e\u5411\u4e8e\u5bf9\u4e8e\u539f\u672c\u7684\u6570\u636e\u8fdb\u884c\u4e00\u5b9a\u7684\u64cd\u4f5c\u7684\u3002<\/p>\n<p>\u5f53\u7136\u8fd9\u91cc\u4ec5\u4ec5\u8868\u793a\u4e00\u79cd\u63a8\u6d4b\uff0c\u5b9e\u9645\u7684\u7528\u6cd5\u5e76\u4e0d\u7edd\u5bf9\u3002\u5373\u4fbf\u6211\u4eec\u4f7f\u7528 LINQ \u4e2d\u7684 <code>Select<\/code> \u7b49\u65b9\u6cd5\uff0c\u4e5f\u540c\u6837\u662f\u53ef\u4ee5\u505a\u5230\u5bf9\u4e8e\u6570\u636e\u7684\u4fee\u6539\u7684\uff0c\u8fd9\u4e00\u70b9 LINQ \u5e76\u6ca1\u6709\u529e\u6cd5\u963b\u6b62\u6211\u4eec\u3002\u6240\u4ee5\u8fd9\u91cc\u4e3b\u8981\u8fd8\u662f\u4e00\u4e2a\u201c\u8f7b\u91cd\u201d\u5173\u7cfb\u3002\u76f8\u8f83\u4e8e LINQ \u7684\u65b9\u6cd5\uff0c<code>ForEach<\/code> \u662f\u66f4\u503e\u5411\u4e8e\u4f1a\u5bf9\u6570\u636e\u8fdb\u884c\u64cd\u4f5c\u7684\u3002<\/p>\n<h3 id=\"\u6027\u80fd\u548c\u8d44\u6e90\u7b49\u65b9\u9762\u7684\u8003\u8651\">\n\u6027\u80fd\u548c\u8d44\u6e90\u7b49\u65b9\u9762\u7684\u8003\u8651\n<a href=\"#%e6%80%a7%e8%83%bd%e5%92%8c%e8%b5%84%e6%ba%90%e7%ad%89%e6%96%b9%e9%9d%a2%e7%9a%84%e8%80%83%e8%99%91\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u8fd8\u6709\u4e00\u4e2a\u70b9\uff0c\u5c31\u662f \u62e5\u6709 <code>ForEach<\/code> \u65b9\u6cd5\u7684 <code>List<\/code>\uff08\u7c7b\u4f3c\u7684\u8fd8\u6709 <code>Array.ForEach<\/code> \u9759\u6001\u65b9\u6cd5\uff09\uff0c\u5b83\u4eec\u88ab\u64cd\u4f5c\u7684\u5bf9\u8c61\u90fd\u6709\u4e00\u4e2a\u663e\u8457\u7279\u70b9\uff1a\u5143\u7d20\u6570\u91cf\u662f\u5df2\u77e5\uff08\u6216\u8005\u8bf4\u6709\u9650\uff09\u7684\u3002\u8fd9\u4e00\u70b9\u975e\u5e38\u91cd\u8981\uff0c\u56e0\u4e3a\u4e00\u4e2a <code>IEnumerable<\/code> \u5bf9\u8c61\u5b8c\u5168\u6709\u53ef\u80fd\u662f\u65e0\u9650\u7684\uff01<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-c#\" data-lang=\"c#\"><span class=\"line\"><span class=\"cl\"><span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">GenerateNumbers<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">yield<\/span> <span class=\"k\">return<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u8003\u8651\uff0c\u5bf9\u4e00\u4e2a\u5bb9\u91cf\u672a\u77e5\u7684\u96c6\u5408\u8f7b\u6613\u5f00\u5c55 <code>ForEach<\/code> \u8fd9\u6837\u7684\u64cd\u4f5c\uff0c\u5176\u5b9e\u662f\u5145\u6ee1\u98ce\u9669\u7684\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c<code>ForEach<\/code> \u65b9\u6cd5\u4e0d\u50cf\u662f <code>foreach<\/code> \u8bed\u53e5\u90a3\u6837\uff0c\u53ef\u4ee5\u5728\u5176\u4e2d\u4e66\u5199 <code>continue<\/code>\u3001<code>break<\/code> \u6216 <code>return<\/code> \u7b49\u8bed\u53e5\uff0c\u8fd9\u5c31\u610f\u5473\u7740\u5b83\u4e00\u65e6\u5f00\u59cb\uff0c\u5c31\u53ea\u80fd\u5c06\u6574\u4e2a\u96c6\u5408\u4e2d\u7684\u5168\u90e8\u5143\u7d20\u9010\u4e2a\u6765\u4e00\u904d\u624d\u884c\u4e86\u3002<\/p>\n<p>\u6240\u4ee5\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u8003\u8651\uff0c\u4e0d\u7ed9 <code>IEnumerable<\/code> \u5bf9\u8c61\u63d0\u4f9b\u8fd9\u6837\u7684\u6269\u5c55\u65b9\u6cd5\uff0c\u4f3c\u4e4e\u662f\u975e\u5e38\u6709\u9053\u7406\u7684\u3002\u5f53\u7136\uff0c\u4f60\u4f9d\u65e7\u53ef\u4ee5\u8bf4\uff0cLINQ \u7684\u65b9\u6cd5\u9047\u5230\u8fd9\u6837\u7684\u6781\u7aef\u60c5\u51b5\uff0c\u540c\u6837\u675f\u624b\u65e0\u7b56\u5440\uff1f\u7684\u786e\uff0c\u4f46 LINQ \u9488\u5bf9\u7684\u5c31\u662f <code>IEnumerable<\/code> \u7c7b\u578b\uff0c\u8fd9\u662f\u65e0\u6cd5\u907f\u514d\u7684\uff0c\u53ea\u80fd\u5e0c\u671b\u5f00\u53d1\u8005\u6e05\u695a\u81ea\u5df1\u9762\u5bf9\u7684\u96c6\u5408\u662f\u6709\u9650\u7684\u8fd8\u662f\u65e0\u9650\u7684\u3002<\/p>\n<p><strong>\uff1c2024 \u5e74 5 \u6708 7 \u65e5\u66f4\u65b0\uff1e<\/strong><\/p>\n<p>\u6700\u8fd1 Nick Chapsas \u5728\u4ed6\u7684<a class=\"link\" href=\"https:\/\/www.youtube.com\/watch?v=0iTMIxZeyXg\" target=\"_blank\" rel=\"noopener\"\n>\u4e00\u671f\u89c6\u9891<\/a>\u4e2d\u8ba8\u8bba\u4e86 <code>ForEach<\/code> \u65b9\u6cd5\u7684\u6027\u80fd\u3002\u901a\u8fc7 Benchmark\uff08\u5728\u89c6\u9891\u7684\u7ea6 5:45 \u5904\uff09\u53ef\u4ee5\u770b\u51fa\uff0c\u5b83\u7684\u6027\u80fd\u662f\u663e\u8457\u4f4e\u4e8e\u4f20\u7edf\u7684 <code>for<\/code> \u4ee5\u53ca <code>foreach<\/code> \u7684\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">| Method | Mean | Allocation |\n<\/span><\/span><span class=\"line\"><span class=\"cl\">| ------- | ---------- | ---------- |\n<\/span><\/span><span class=\"line\"><span class=\"cl\">| for | 424.9 us | - |\n<\/span><\/span><span class=\"line\"><span class=\"cl\">| foreach | 426.4 us | - |\n<\/span><\/span><span class=\"line\"><span class=\"cl\">| ForEach | 1,785.0 us | 88 B |\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\"><p>\u5173\u4e8e\u4e0a\u9762\u7684\u8868\u683c\uff0c\u6709\u4e00\u4e9b\u9700\u8981\u989d\u5916\u8865\u5145\u7684\u5185\u5bb9\uff1a<\/p>\n<ol>\n<li>\u4e0a\u9762\u7684\u8868\u683c\u7701\u53bb\u4e86\u4e00\u4e9b\u5217\uff0c\u53ea\u4fdd\u7559\u4e86\u4e3b\u8981\u90e8\u5206<\/li>\n<li>\u6d4b\u8bd5\u73af\u5883\u662f\u6700\u65b0\u7684 .NET 9\uff08\u9884\u89c8\u7248\uff09\uff0c\u6240\u4ee5 <code>foreach<\/code> \u4e0e <code>for<\/code> \u62e5\u6709\u8fd1\u4e4e\u4e00\u6837\u7684\u6027\u80fd\uff0c\u4e14\u6ca1\u6709\u5185\u5b58\u5f00\u9500<\/li>\n<li><code>ForEach<\/code> \u901f\u5ea6\u6162\u4e86\u7ea6 4 \u500d\uff0c\u4e14\u62e5\u6709\u5185\u5b58\u5f00\u9500\uff08\u56e0\u4e3a\u5b58\u5728\u59d4\u6258\u548c\u76f8\u5e94\u7684\u95ed\u5305\uff09<\/li>\n<\/ol><\/div>\n<\/div>\n<p>\u6240\u4ee5\u8fd9\u66f4\u52a0\u8bc1\u660e\u4e86\uff0c<code>ForEach<\/code> \u65b9\u6cd5\u5e76\u4e0d\u662f\u4e00\u4e2a\u9ad8\u6027\u80fd\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u5bf9\u4e00\u4e2a\u96c6\u5408\u8fdb\u884c\u904d\u5386\uff0c\u8fd8\u662f\u5e94\u8be5\u4f7f\u7528\u4f20\u7edf\u7684 <code>for<\/code> \u6216 <code>foreach<\/code>\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u603b\u7684\u6765\u8bf4\uff0c\u867d\u7136\u4e3a <code>IEnumerable&lt;T&gt;<\/code> \u6dfb\u52a0\u4e00\u4e2a <code>ForEach<\/code> \u65b9\u6cd5\u5728\u6280\u672f\u4e0a\u662f\u53ef\u884c\u7684\uff0c\u4f46\u7531\u4e8e\u8bbe\u8ba1\u54f2\u5b66\u3001\u6e05\u6670\u7684\u4ee3\u7801\u7ef4\u62a4\u3001\u6027\u80fd\u8003\u8651\u548c\u6f5c\u5728\u7684\u526f\u4f5c\u7528\uff0c.NET \u6846\u67b6\u8bbe\u8ba1\u8005\u9009\u62e9\u4e0d\u5728 <code>IEnumerable&lt;T&gt;<\/code> \u4e2d\u76f4\u63a5\u63d0\u4f9b\u8fd9\u6837\u7684\u65b9\u6cd5\u3002\u4e0d\u8fc7\uff0c\u5927\u5bb6\u5982\u679c\u9700\u8981\uff0c\u53ef\u4ee5\u81ea\u5b9a\u4e49\u6269\u5c55\u65b9\u6cd5\u6765\u5b9e\u73b0\u8fd9\u4e00\u529f\u80fd\u3002\u4f46\u524d\u63d0\u662f\u8981\u6e05\u695a\u8fd9\u6837\u505a\u53ef\u80fd\u4f1a\u5e26\u6765\u7684\u540e\u679c\u3002<\/p>"},{"title":"\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981 ValueTask\uff1f","link":"https:\/\/blog.coldwind.top\/posts\/why-we-need-valuetask\/","pubDate":"Fri, 12 Apr 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/why-we-need-valuetask\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/04\/14\/P4HJMlIpSxY6CDn.jpg\" alt=\"Featured image of post \u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981 ValueTask\uff1f\" \/><blockquote>\n<p>\u672c\u6587\u6709\u5bf9\u5e94\u7684\u89c6\u9891\u6559\u7a0b\uff1a<a class=\"link\" href=\"https:\/\/www.bilibili.com\/video\/BV1dm421j72Y\/\" target=\"_blank\" rel=\"noopener\"\n>\u54d4\u54e9\u54d4\u54e9<\/a><\/p>\n<\/blockquote>\n<p>\u81ea\u4ece C# 5.0 \u5f15\u5165\u4e86 <code>async<\/code> \u548c <code>await<\/code> \u8bed\u6cd5\u4ee5\u540e\uff0c\u5f02\u6b65\u7f16\u7a0b\u53d8\u5f97\u975e\u5e38\u7b80\u5355\uff0c\u800c Task \u7c7b\u578b\u4e5f\u5728\u5f00\u53d1\u4e2d\u626e\u6f14\u7740\u76f8\u5f53\u91cd\u8981\u7684\u89d2\u8272\uff0c\u5b58\u5728\u611f\u6781\u9ad8\u3002\u4f46\u662f\u5728 .NET Core 2.0 \u8fd9\u4e2a\u7248\u672c\uff0c\u5fae\u8f6f\u5f15\u5165\u4e86\u4e00\u4e2a\u65b0\u7684\u7c7b\u578b <code>ValueTask<\/code>\uff0c\u90a3\u4e48\u8fd9\u4e2a\u7c7b\u578b\u662f\u4ec0\u4e48\uff1f\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981\u5b83\uff1f\u4ec0\u4e48\u60c5\u51b5\u4e0b\u5e94\u8be5\u4f7f\u7528\u5b83\uff1f\u6211\u4eec\u4eca\u5929\u5c31\u6765\u63a2\u8ba8\u4e00\u4e0b\u3002<\/p>\n<h2 id=\"\u7b80\u5355\u56de\u987e-task-\u7c7b\u578b\">\n\u7b80\u5355\u56de\u987e <code>Task<\/code> \u7c7b\u578b\n<a href=\"#%e7%ae%80%e5%8d%95%e5%9b%9e%e9%a1%be-task-%e7%b1%bb%e5%9e%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u5f02\u6b65\u7f16\u7a0b\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4f1a\u4f7f\u7528 <code>Task<\/code> \u7c7b\u578b\u6765\u8868\u793a\u4e00\u4e2a\u5f02\u6b65\u64cd\u4f5c\u6216\u8005\u8bf4\u5f02\u6b65\u4efb\u52a1\u3002\u76f8\u8f83\u4e8e\u5176\u4ed6\u4e00\u4e9b\u4e3b\u6d41\u7f16\u7a0b\u8bed\u8a00\uff0cC# \u4e2d\u7684\u5f02\u6b65\u4efb\u52a1\u5176\u5b9e\u5f00\u9500\u5f88\u5c0f\u3002\u6bd4\u5982\u77e5\u4e4e\u4e0a\u7684\u5927\u4f6c hez2010 \u5728\u4ed6\u7684<a class=\"link\" href=\"https:\/\/www.zhihu.com\/question\/509501955\/answer\/3225113571\" target=\"_blank\" rel=\"noopener\"\n>\u8fd9\u4e2a\u56de\u7b54<\/a>\u4e2d\u63d0\u5230\uff0cC# \u7684 Task \u7c7b\u578b\u901a\u5e38\u53ea\u5360\u7528 64~136 B \u7684\u5185\u5b58\uff0c\u800c Go \u8bed\u8a00\u7684\u4e00\u4e2a goroutine \u81f3\u5c11\u5360\u7528 2 KB \u7684\u5185\u5b58\u3002<\/p>\n<p>\u4e0d\u4ec5\u5982\u6b64\uff0cTask \u8fd8\u6709\u8bb8\u591a\u4f18\u5316\u6280\u5de7\uff0c\u6bd4\u5982\uff1a<\/p>\n<ol>\n<li>\u5982\u679c\u60f3\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2a\u7ed3\u679c\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>Task.FromResult<\/code> \u65b9\u6cd5<\/li>\n<li>\u5982\u679c\u60f3\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2a\u5df2\u7ecf\u5b8c\u6210\u7684\u4efb\u52a1\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>Task.CompletedTask<\/code><\/li>\n<li>\u5982\u679c\u60f3\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2a\u5df2\u7ecf\u53d6\u6d88\u7684\u4efb\u52a1\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>Task.FromCanceled<\/code><\/li>\n<li>\u5982\u679c\u60f3\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2a\u5df2\u7ecf\u5931\u8d25\u7684\u4efb\u52a1\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>Task.FromException<\/code><\/li>\n<\/ol>\n<p>\u7b49\u7b49\u3002\u6240\u4ee5\u4ece C# 5.0\uff08\u5927\u6982\u662f .NET Framework 4 \u65f6\u4ee3\uff09\u5f00\u59cb\uff0c\u76f4\u5230 .NET Core 2.0 \u4e4b\u524d\uff0c\u4e00\u76f4\u76f8\u5b89\u65e0\u4e8b\u3002<\/p>\n<h2 id=\"\u4f20\u7edf-task-\u7c7b\u578b\u7684\u95ee\u9898\">\n\u4f20\u7edf <code>Task<\/code> \u7c7b\u578b\u7684\u95ee\u9898\n<a href=\"#%e4%bc%a0%e7%bb%9f-task-%e7%b1%bb%e5%9e%8b%e7%9a%84%e9%97%ae%e9%a2%98\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4f46\u662f\uff0c\u968f\u7740 .NET \u5f00\u59cb\u8de8\u5e73\u53f0\uff0c\u80fd\u4f7f\u7528 C# \u7684\u573a\u666f\u8d8a\u6765\u8d8a\u591a\uff0c\u5fae\u8f6f\u7684\u201c\u91ce\u5fc3\u201d\u4e5f\u8d8a\u6765\u8d8a\u5927\uff0c\u5f00\u59cb\u4ece\u5404\u79cd\u89d2\u5ea6\u4f18\u5316 C# \u7684\u6027\u80fd\uff0c\u4ece\u800c\u4f7f .NET \u80fd\u591f\u80dc\u4efb\u5404\u79cd\u4efb\u52a1\u573a\u666f\u3002\u9664\u4e86\u5f15\u5165 <code>Span<\/code>\u3001<code>Memory<\/code>\u3001<code>ref struct<\/code> \u7b49\u65b0\u7279\u6027\u5916\uff0c\u8fd8\u5f15\u5165\u4e86 <code>ValueTask<\/code>\u3002\u90a3\u4e48\uff0c\u4f20\u7edf\u7684 <code>Task<\/code> \u7c7b\u578b\u6709\u4ec0\u4e48\u95ee\u9898\u5462\uff1f<\/p>\n<p>\u9996\u5148\u6211\u4eec\u8981\u77e5\u9053\uff0c<code>Task<\/code> \u5305\u542b\u6cdb\u578b\u7248\u672c\u548c\u975e\u6cdb\u578b\u7248\u672c\uff0c\u5206\u522b\u5bf9\u5e94\u6709\u65e0\u8fd4\u56de\u503c\u7684\u5f02\u6b65\u4efb\u52a1\u3002\u800c <code>ValueTask<\/code> \u5728\u8bde\u751f\u4e4b\u521d\uff0c\u53ea\u6709\u4e00\u4e2a\u6cdb\u578b\u7248\u672c\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u8bbe\u8ba1\u8005\u8ba4\u4e3a\uff0c<code>ValueTask<\/code> \u5e94\u5f53\u53ea\u9002\u7528\u4e8e\u6709\u8fd4\u56de\u503c\u7684\u5f02\u6b65\u4efb\u52a1\u3002\u6240\u4ee5\u8fd9\u91cc\u6211\u4eec\u6765\u770b\u4e00\u4e2a\u5178\u578b\u7684\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ConcurrentDictionary<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_cache<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">async<\/span> <span class=\"n\">Task<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">GetMessageAsync<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">id<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_cache<\/span><span class=\"p\">.<\/span><span class=\"n\">TryGetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"k\">out<\/span> <span class=\"kt\">var<\/span> <span class=\"n\">message<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">message<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">message<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">GetMessageFromDatabaseAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_cache<\/span><span class=\"p\">.<\/span><span class=\"n\">TryAdd<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">message<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">message<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5728\u4e0a\u9762\u7684 <code>GetMessageAsync<\/code> \u65b9\u6cd5\u4e2d\uff0c\u6211\u4eec\u9996\u5148\u5c1d\u8bd5\u4ece\u7f13\u5b58\u4e2d\u83b7\u53d6\u6d88\u606f\uff0c\u5982\u679c\u6ca1\u6709\u627e\u5230\uff0c\u5c31\u518d\u5c1d\u8bd5\u4ece\u6570\u636e\u5e93\u4e2d\u83b7\u53d6\u3002\u4f46\u8fd9\u91cc\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u5982\u679c\u7f13\u5b58\u4e2d\u6709\u6570\u636e\uff0c\u90a3\u4e48\u867d\u7136\u6211\u4eec\u597d\u50cf\u4f1a\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2a\u503c\u3002\u4f46\u662f\uff0c\u7531\u4e8e <code>GetMessageAsync<\/code> \u65b9\u6cd5\u662f\u4e00\u4e2a\u5f02\u6b65\u65b9\u6cd5\uff0c\u6240\u4ee5\u5b9e\u9645\u4e0a\u4f1a\u8fd4\u56de\u4e00\u4e2a <code>Task&lt;string&gt;<\/code> \u7c7b\u578b\u7684\u5bf9\u8c61\u3002\u8fd9\u5c31\u610f\u5473\u7740\uff0c\u5373\u4fbf\u6211\u4eec\u672c\u53ef\u4ee5\u53ea\u8fd4\u56de\u4e00\u4e2a\u503c\uff0c\u6211\u4eec\u4f9d\u65e7\u4f1a\u591a\u521b\u5efa\u4e00\u4e2a <code>Task<\/code> \u5bf9\u8c61\uff0c\u8fd9\u5c31\u5bfc\u81f4\u4e86\u65e0\u7aef\u7684\u5185\u5b58\u5f00\u9500\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u8fd9\u79cd\u5728\u5f02\u6b65\u4efb\u52a1\u4e2d\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2a\u503c\u7684\u60c5\u51b5\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u201c\u540c\u6b65\u5b8c\u6210\u201d\uff0c\u6216\u8005\u201c\u8fd4\u56de\u540c\u6b65\u7ed3\u679c\u201d\u3002\u7ebf\u7a0b\u8fdb\u5165\u8fd9\u4e2a\u5f02\u6b65\u4efb\u52a1\u540e\uff0c\u5e76\u6ca1\u6709\u78b0\u5230 <code>await<\/code> \u5173\u952e\u5b57\uff0c\u800c\u662f\u76f4\u63a5\u8fd4\u56de\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8fd9\u4e2a\u5f02\u6b65\u4efb\u52a1\u81ea\u59cb\u81f3\u7ec8\u90fd\u662f\u5728\u540c\u4e00\u4e2a\u7ebf\u7a0b\u4e0a\u6267\u884c\u7684\u3002<\/div>\n<\/div>\n<h2 id=\"valuetask-\u7b80\u4ecb\">\n<code>ValueTask<\/code> \u7b80\u4ecb\n<a href=\"#valuetask-%e7%ae%80%e4%bb%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6240\u4ee5\uff0c<code>ValueTask<\/code> \u7684\u4e3b\u8981\u4f5c\u7528\u5c31\u662f\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u5b83\u5728 .NET Core 2.0 \u88ab\u6b63\u5f0f\u5f15\u5165\uff0c\u5e76\u5728 .NET Core 2.1 \u5f97\u5230\u4e86\u589e\u5f3a\uff08\u65b0\u589e\u4e86 <code>IValueTaskSource&lt;T&gt;<\/code> \u63a5\u53e3\uff0c\u4ece\u800c\u4f7f\u5b83\u53ef\u4ee5\u62e5\u6709\u8bf8\u5982 <code>IsCompleted<\/code> \u7b49\u5c5e\u6027\uff09\uff0c\u5e76\u4e14\u8fd8\u6dfb\u52a0\u4e86\u975e\u6cdb\u578b\u7684 <code>ValueTask<\/code> \u7c7b\u578b\uff08\u8fd9\u4e2a\u6211\u4eec\u7a0d\u540e\u518d\u8bf4\uff09\u3002<\/p>\n<p><code>ValueTask<\/code> \u6211\u4eec\u5148\u4e0d\u8981\u53bb\u601d\u8003\u5b83\u662f\u5426\u4e3a\u503c\u7c7b\u578b\uff0c\u800c\u662f\u53ef\u4ee5\u8fd9\u4e48\u7406\u89e3\uff1a<strong>\u5b83\u9002\u7528\u4e8e\u53ef\u80fd\u8fd4\u56de\u4e00\u4e2a <code>Value<\/code>\uff0c\u4e5f\u53ef\u80fd\u8fd4\u56de\u4e00\u4e2a <code>Task<\/code> \u7684\u60c5\u5f62<\/strong>\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5b83\u975e\u5e38\u9002\u5408\u4e0a\u9762\u7684\u201c\u7f13\u5b58\u547d\u4e2d\u201d\u7684\u5178\u578b\u573a\u666f\u3002\u6211\u4eec\u53ef\u4ee5\u628a\u4e0a\u9762\u7684\u4ee3\u7801\u4fee\u6539\u4e3a\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"kd\">async<\/span> <span class=\"n\">ValueTask<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">GetMessageAsync<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">id<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_cache<\/span><span class=\"p\">.<\/span><span class=\"n\">TryGetValue<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"k\">out<\/span> <span class=\"kt\">var<\/span> <span class=\"n\">message<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">message<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">message<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">GetMessageFromDatabaseAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">_cache<\/span><span class=\"p\">.<\/span><span class=\"n\">TryAdd<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">message<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">message<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6b64\u65f6\uff0c\u5982\u679c\u7f13\u5b58\u4e2d\u6709\u6570\u636e\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u8fd4\u56de\u4e00\u4e2a <code>ValueTask&lt;T&gt;<\/code> \u5bf9\u8c61\uff0c\u800c\u4e0d\u9700\u8981\u518d\u521b\u5efa\u4e00\u4e2a <code>Task&lt;T&gt;<\/code> \u5bf9\u8c61\u3002\u8fd9\u6837\u5c31\u907f\u514d\u4e86\u65e0\u7aef\u7684\u5806\u5185\u5b58\u5f00\u9500\uff1b\u5426\u5219\uff0c\u6211\u4eec\u624d\u4f1a\u521b\u5efa <code>Task&lt;T&gt;<\/code> \u5bf9\u8c61\u3002\u6216\u8005\u8bf4\uff0c\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c<code>ValueTask<\/code> \u7684\u6027\u80fd\u4f1a\u9000\u5316\u4e3a <code>Task<\/code>\uff08\u751a\u81f3\u53ef\u80fd\u8fd8\u7a0d\u5fae\u4f4e\u4e00\u4e01\u70b9\uff0c\u56e0\u4e3a\u6d89\u53ca\u5230\u66f4\u591a\u7684\u5b57\u6bb5\uff0c\u4ee5\u53ca\u503c\u62f7\u8d1d\u7b49\uff09\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u81f3\u4e8e\u975e\u6cdb\u578b\u7248\u672c\u7684 <code>ValueTask<\/code>\uff0c\u5b83\u7684\u4f7f\u7528\u60c5\u5f62\u5c31\u66f4\u5c11\u4e86\u3002\u5b83\u53ea\u6709\u5728\u5373\u4f7f\u5f02\u6b65\u5b8c\u6210\u4e5f\u53ef\u4ee5\u65e0\u9700\u5206\u914d\u5185\u5b58\u7684\u60c5\u51b5\u4e0b\u624d\u4f1a\u6d3e\u4e0a\u7528\u573a\u3002<code>ValueTask<\/code> \u7684\u201c\u53d1\u660e\u8005\u201dStephen Toub \u5728<a class=\"link\" href=\"https:\/\/devblogs.microsoft.com\/dotnet\/understanding-the-whys-whats-and-whens-of-valuetask\/\" target=\"_blank\" rel=\"noopener\"\n>\u4ed6\u7684\u6587\u7ae0<\/a>\u4e2d\u63d0\u5230\uff0c\u9664\u975e\u4f60\u501f\u52a9 profiling \u5de5\u5177\u786e\u8ba4 <code>Task<\/code> \u7684\u8fd9\u4e00\u4e01\u70b9\u5f00\u9500\u4f1a\u6210\u4e3a\u74f6\u9888\uff0c\u5426\u5219\u4e0d\u9700\u8981\u8003\u8651\u4f7f\u7528 <code>ValueTask<\/code>\u3002<\/div>\n<\/div>\n<p>\u8fd9\u65f6\u5019\u6211\u4eec\u518d\u6765\u601d\u8003\u5b83\u7684\u6027\u80fd\u7a76\u7adf\u5982\u4f55\uff1a<\/p>\n<p>\u987e\u540d\u601d\u4e49\uff0c<code>ValueTask<\/code> \u662f\u4e00\u4e2a\u503c\u7c7b\u578b\uff0c\u53ef\u4ee5\u5728\u6808\u4e0a\u5206\u914d\uff0c\u800c\u4e0d\u9700\u8981\u5728\u5806\u4e0a\u5206\u914d\u3002\u4e0d\u4ec5\u5982\u6b64\uff0c\u5b83\u56e0\u4e3a\u5b9e\u73b0\u4e86\u4e00\u4e9b\u63a5\u53e3\uff0c\u4ece\u800c\u4f7f\u5b83\u53ef\u4ee5\u50cf <code>Task<\/code> \u4e00\u6837\u88ab\u7528\u4e8e\u5f02\u6b65\u7f16\u7a0b\u3002\u6240\u4ee5\uff0c\u7167\u7406\u8bf4\uff0c<code>ValueTask<\/code> \u7684\u6027\u80fd\u8981\u6bd4 <code>Task<\/code> \u66f4\u597d\u5f88\u591a\uff08\u5c31\u5982\u540c <code>ValueTuple<\/code> \u4e4b\u4e8e <code>Tuple<\/code>\u3001<code>Span<\/code> \u4e4b\u4e8e <code>Array<\/code> \u4e00\u6837\uff09\u3002<\/p>\n<p>\u4f46\u662f\uff0c<code>ValueTask<\/code> \u771f\u7684\u8fd9\u4e48\u7f8e\u597d\u5417\uff1f\u5b83\u662f\u4e0d\u662f\u53ef\u4ee5\u5b8c\u5168\u66ff\u4ee3 <code>Task<\/code> \u5462\uff1f\u4e8b\u60c5\u6050\u6015\u5e76\u6ca1\u6709\u8fd9\u4e48\u7b80\u5355\u3002<\/p>\n<h2 id=\"valuetask-\u7684\u6ce8\u610f\u4e8b\u9879\">\n<code>ValueTask<\/code> \u7684\u6ce8\u610f\u4e8b\u9879\n<a href=\"#valuetask-%e7%9a%84%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u73b0\u5728\uff0c\u6211\u4eec\u8be5\u8c08\u4e00\u8c08 <code>ValueTask<\/code> \u5728\u4f7f\u7528\u65f6\u9700\u8981\u6ce8\u610f\u7684\u5730\u65b9\u4e86\u3002<\/p>\n<h3 id=\"valuetask-\u4e0d\u80fd\u88ab\u591a\u6b21\u7b49\u5f85await\">\n<code>ValueTask<\/code> \u4e0d\u80fd\u88ab\u591a\u6b21\u7b49\u5f85\uff08<code>await<\/code>\uff09\n<a href=\"#valuetask-%e4%b8%8d%e8%83%bd%e8%a2%ab%e5%a4%9a%e6%ac%a1%e7%ad%89%e5%be%85await\" class=\"anchor\">&para;<\/a>\n<\/h3><p><code>ValueTask<\/code> \u5e95\u5c42\u4f1a\u4f7f\u7528\u4e00\u4e2a\u5bf9\u8c61\u5b58\u50a8\u5f02\u6b65\u64cd\u4f5c\u7684\u72b6\u6001\uff0c\u800c\u5b83\u5728\u88ab <code>await<\/code> \u540e\uff08\u53ef\u4ee5\u8ba4\u4e3a\u6b64\u65f6\u5f02\u6b65\u64cd\u4f5c\u5df2\u7ecf\u7ed3\u675f\uff09\uff0c\u8fd9\u4e2a\u5bf9\u8c61\u53ef\u80fd\u5df2\u7ecf\u88ab\u56de\u6536\uff0c\u751a\u81f3\u6709\u53ef\u80fd\u5df2\u7ecf\u88ab\u7528\u5728\u522b\u5904\uff08\u6216\u8005\u8bf4\uff0c<code>ValueTask<\/code> \u53ef\u80fd\u4f1a\u4ece\u5df2\u5b8c\u6210\u72b6\u6001\u53d8\u6210\u672a\u5b8c\u6210\u72b6\u6001\uff09\u3002\u800c <code>Task<\/code> \u662f\u7edd\u5bf9\u4e0d\u53ef\u80fd\u53d1\u751f\u8fd9\u79cd\u60c5\u51b5\u7684\uff0c\u6240\u4ee5\u53ef\u4ee5\u88ab\u591a\u6b21\u7b49\u5f85\u3002<\/p>\n<h3 id=\"\u4e0d\u8981\u963b\u585e-valuetask\">\n\u4e0d\u8981\u963b\u585e <code>ValueTask<\/code>\n<a href=\"#%e4%b8%8d%e8%a6%81%e9%98%bb%e5%a1%9e-valuetask\" class=\"anchor\">&para;<\/a>\n<\/h3><p><code>ValueTask<\/code> \u6240\u5bf9\u5e94\u7684 <code>IValueTaskSource<\/code> \u5e76\u4e0d\u9700\u8981\u652f\u6301\u5728\u4efb\u52a1\u672a\u5b8c\u6210\u65f6\u963b\u585e\u7684\u529f\u80fd\uff0c\u5e76\u4e14\u901a\u5e38\u4e5f\u4e0d\u4f1a\u8fd9\u6837\u505a\u3002\u8fd9\u610f\u5473\u7740\uff0c\u4f60\u65e0\u6cd5\u50cf\u4f7f\u7528 <code>Task<\/code> \u90a3\u6837\u5728 <code>ValueTask<\/code> \u4e0a\u8c03\u7528 <code>Wait<\/code>\u3001<code>Result<\/code>\u3001<code>GetAwaiter().GetResult()<\/code> \u7b49\u65b9\u6cd5\u3002<\/p>\n<p>\u4f46\u6362\u53e5\u8bdd\u8bf4\uff0c\u5982\u679c\u4f60\u53ef\u4ee5\u786e\u5b9a\u4e00\u4e2a <code>ValueTask<\/code> \u5df2\u7ecf\u5b8c\u6210\uff08\u901a\u8fc7\u5224\u65ad <code>IsCompleted<\/code> \u7b49\u5c5e\u6027\u7684\u503c\uff09\uff0c\u90a3\u4e48\u4f60\u53ef\u4ee5\u901a\u8fc7 <code>Result<\/code> \u5c5e\u6027\u6765\u5b89\u5168\u5730\u83b7\u53d6 <code>ValueTask<\/code> \u7684\u7ed3\u679c\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u5fae\u8f6f\u4e13\u95e8\u6dfb\u52a0\u4e86\u4e00\u4e2a\u4e0e\u8fd9\u4e2a\u6709\u5173\u7684\u8b66\u544a\uff1a<a class=\"link\" href=\"https:\/\/learn.microsoft.com\/zh-cn\/dotnet\/fundamentals\/code-analysis\/quality-rules\/ca2012\" target=\"_blank\" rel=\"noopener\"\n>CA2012<\/a><\/div>\n<\/div>\n<h3 id=\"\u4e0d\u8981\u5728\u591a\u4e2a\u7ebf\u7a0b\u4e0a\u540c\u65f6\u7b49\u5f85\u4e00\u4e2a-valuetask\">\n\u4e0d\u8981\u5728\u591a\u4e2a\u7ebf\u7a0b\u4e0a\u540c\u65f6\u7b49\u5f85\u4e00\u4e2a <code>ValueTask<\/code>\n<a href=\"#%e4%b8%8d%e8%a6%81%e5%9c%a8%e5%a4%9a%e4%b8%aa%e7%ba%bf%e7%a8%8b%e4%b8%8a%e5%90%8c%e6%97%b6%e7%ad%89%e5%be%85%e4%b8%80%e4%b8%aa-valuetask\" class=\"anchor\">&para;<\/a>\n<\/h3><p><code>ValueTask<\/code> \u5728\u8bbe\u8ba1\u4e4b\u521d\u5c31\u53ea\u662f\u7528\u6765\u89e3\u51b3 <code>Task<\/code> \u5728\u4e2a\u522b\u60c5\u51b5\u4e0b\u7684\u5f00\u9500\u95ee\u9898\uff0c\u800c\u4e0d\u662f\u6253\u7b97\u5168\u9762\u53d6\u4ee3 <code>Task<\/code>\u3002\u56e0\u6b64\uff0c<code>Task<\/code> \u7684\u5f88\u591a\u4f18\u79c0\u4e14\u4fbf\u6377\u7684\u7279\u6027\u5b83\u90fd\u4e0d\u7528\u6709\u3002\u5176\u4e2d\u4e00\u4e2a\u5c31\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u7b49\u5f85\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4\uff0c<code>ValueTask<\/code> \u5e95\u5c42\u7684\u5bf9\u8c61\u88ab\u8bbe\u8ba1\u4e3a\u53ea\u5e0c\u671b\u88ab\u4e00\u4e2a\u6d88\u8d39\u8005\uff08\u6216\u7ebf\u7a0b\uff09\u7b49\u5f85\uff0c\u56e0\u6b64\u5e76\u6ca1\u6709\u5f15\u5165\u7ebf\u7a0b\u5b89\u5168\u7b49\u673a\u5236\u3002\u5c1d\u8bd5\u540c\u65f6\u7b49\u5f85\u5b83\u53ef\u80fd\u5f88\u5bb9\u6613\u5f15\u5165\u7ade\u6001\u6761\u4ef6\u548c\u5fae\u5999\u7684\u7a0b\u5e8f\u9519\u8bef\u3002\u800c <code>Task<\/code> \u652f\u6301\u4efb\u610f\u6570\u91cf\u7684\u5e76\u53d1\u7b49\u5f85\u3002<\/p>\n<h2 id=\"\u5982\u4f55\u514b\u670d-valuetask-\u7684\u5c40\u9650\u6027\">\n\u5982\u4f55\u514b\u670d <code>ValueTask<\/code> \u7684\u5c40\u9650\u6027\n<a href=\"#%e5%a6%82%e4%bd%95%e5%85%8b%e6%9c%8d-valuetask-%e7%9a%84%e5%b1%80%e9%99%90%e6%80%a7\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u5b9e\u9645\u4f7f\u7528\u8fc7\u7a0b\u4e2d\uff0c\u96be\u514d\u9047\u5230\u9700\u8981\u7a81\u7834\u5b83\u7684\u4e0a\u8ff0\u9650\u5236\u7684\u60c5\u51b5\u3002\u90a3\u4e48\u6211\u4eec\u8be5\u600e\u4e48\u529e\u5462\uff1f\u8fd9\u91cc\u7ed9\u51fa\u51e0\u79cd\u5e38\u89c1\u60c5\u51b5\u7684\u5bf9\u5e94\u65b9\u5f0f\uff1a<\/p>\n<ol>\n<li>\u5982\u679c\u5e0c\u671b\u7528\u963b\u585e\u7684\u65b9\u5f0f\uff08<code>Result<\/code> \u4e0e <code>.GetAwaiter().GetResult()<\/code>\uff09\u83b7\u53d6 <code>ValueTask&lt;T&gt;<\/code> \u7684\u7ed3\u679c\uff0c\u53ef\u4ee5\u5148\u5224\u65ad <code>IsCompleted<\/code> \u6216 <code>IsCompletedSuccessfully<\/code> \u7b49\u5c5e\u6027\u7684\u503c\uff0c\u786e\u8ba4\u5b83\u5df2\u7ecf\u5b8c\u6210\uff0c\u7136\u540e\u518d\u83b7\u53d6\u7ed3\u679c<\/li>\n<li>\u5982\u679c\u5e0c\u671b\u7b49\u5f85\u591a\u6b21\uff0c\u6216\u5728\u591a\u4e2a\u7ebf\u7a0b\u4e2d\u7b49\u5f85\u7b49\uff0c\u90a3\u4e48\u53ef\u4ee5\u4f7f\u7528 <code>AsTask()<\/code> \u65b9\u6cd5\u5c06\u5176\u8f6c\u4e3a\u4e00\u4e2a\u666e\u901a\u7684 <code>Task<\/code>\uff0c\u8fdb\u800c\u518d\u8fdb\u884c\u5404\u79cd <code>Task<\/code> \u7684\u5e38\u7528\u64cd\u4f5c<\/li>\n<\/ol>\n<p>\u57fa\u4e8e <code>ValueTask<\/code> \u7684\u539f\u7406\u53ca\u9650\u5236\uff0c\u4e00\u4e2a\u666e\u904d\u8ba4\u540c\u7684\u63a8\u8350\u7528\u6cd5\u662f\uff1a<\/p>\n<div class=\"notice tip\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-lightbulb\" aria-hidden=\"true\"><\/i>Tip\n<\/div>\n<div class=\"notice-content\">\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u90fd\u63a8\u8350\u76f4\u63a5\u4f7f\u7528 <code>await<\/code> \u5173\u952e\u5b57\u6765\u7b49\u5f85\u4e00\u4e2a\u8fd4\u56de\u503c\u4e3a <code>ValueTask&lt;T&gt;<\/code> \u7684\u5f02\u6b65\u4efb\u52a1\u5e76\u83b7\u53d6\u7ed3\u679c\uff0c<strong>\u800c\u4e0d\u662f\u8bd5\u56fe\u5c06\u5176\u8fd4\u56de\u503c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cf<\/strong>\uff08\u6700\u591a\u662f\u642d\u914d <code>ConfigureAwait()<\/code> \u8fdb\u884c\u4f7f\u7528\uff09\uff1b\u5426\u5219\uff0c\u5efa\u8bae\u4f7f\u7528 <code>AsTask()<\/code> \u65b9\u6cd5\u5c06\u5176\u8f6c\u4e3a\u4f20\u7edf\u7684 <code>Task<\/code>\uff0c\u518d\u8fdb\u884c\u5e38\u89c4\u64cd\u4f5c\u3002<\/div>\n<\/div>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u603b\u7684\u6765\u8bf4\uff0c<code>ValueTask<\/code> \u786e\u5b9e\u6709\u5f88\u591a\u95ea\u5149\u70b9\uff0c\u6bd4\u5982\u5728\u6808\u4e0a\u5206\u914d\u6765\u907f\u514d\u5806\u5206\u914d\u7684\u6027\u80fd\u5f00\u9500\uff0c\u4f46\u5b83\u4e5f\u6709\u4e00\u4e9b\u8ba9\u4eba\u5934\u75bc\u7684\u9650\u5236\uff0c\u6bd4\u5982\u4e0d\u80fd\u88ab\u591a\u6b21\u7b49\u5f85\u3002\u4f7f\u7528\u5b83\u5c31\u50cf\u662f\u5728\u8d70\u94a2\u4e1d\uff0c\u4e00\u4e0d\u5c0f\u5fc3\u5c31\u53ef\u80fd\u6389\u8fdb\u6027\u80fd\u4f18\u5316\u7684\u9677\u9631\u91cc\u3002\u4f46\u522b\u62c5\u5fc3\uff0c\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u8fd8\u662f\u53ef\u4ee5\u5b89\u5168\u5730\u4f7f\u7528 <code>await<\/code> \u6765\u7b49\u5f85 <code>ValueTask&lt;T&gt;<\/code> \u7684\uff0c\u53ea\u8981\u6211\u4eec\u4e0d\u8bd5\u56fe\u628a\u5b83\u5f53\u4f5c <code>Task<\/code> \u7684\u66ff\u4ee3\u54c1\u6765\u7528\u5c31\u597d\u3002<\/p>\n<p>\u5e0c\u671b\u770b\u4e86\u8fd9\u7bc7\u6587\u7ae0\u4e4b\u540e\uff0c\u5927\u5bb6\u80fd\u591f\u6b63\u786e\u4f7f\u7528 <code>ValueTask<\/code>\u3002<\/p>\n<h2 id=\"\u53c2\u8003\u94fe\u63a5\">\n\u53c2\u8003\u94fe\u63a5\n<a href=\"#%e5%8f%82%e8%80%83%e9%93%be%e6%8e%a5\" class=\"anchor\">&para;<\/a>\n<\/h2><ul>\n<li><a class=\"link\" href=\"https:\/\/source.dot.net\/#System.Private.CoreLib\/src\/libraries\/System.Private.CoreLib\/src\/System\/Threading\/Tasks\/ValueTask.cs,77a292425839ae85\" target=\"_blank\" rel=\"noopener\"\n>ValueTask Source Code<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/devblogs.microsoft.com\/dotnet\/understanding-the-whys-whats-and-whens-of-valuetask\/\" target=\"_blank\" rel=\"noopener\"\n>Understanding the Whys, Whats, and Whens of ValueTask | .NET Blog<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/www.codeguru.com\/csharp\/c-sharp-valuetask\/\" target=\"_blank\" rel=\"noopener\"\n>Working with ValueTask in C# | CodeGuru.com<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/www.youtube.com\/watch?v=dCj7-KvaIJ0\" target=\"_blank\" rel=\"noopener\"\n>Task vs ValueTask: When Should I use ValueTask? | YouTube.com<\/a><\/li>\n<li><a class=\"link\" href=\"https:\/\/www.youtube.com\/watch?v=fj-LVS8hqIE\" target=\"_blank\" rel=\"noopener\"\n>Understanding how to use Task and ValueTask | YouTube.com<\/a><\/li>\n<\/ul>"},{"title":"Using \u8bed\u53e5\u7684\u9677\u9631","link":"https:\/\/blog.coldwind.top\/posts\/using-statement-trap\/","pubDate":"Thu, 11 Apr 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/using-statement-trap\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/04\/11\/lbxw86NGjKJyqAv.jpg\" alt=\"Featured image of post Using \u8bed\u53e5\u7684\u9677\u9631\" \/><p><code>using<\/code> \u8bed\u53e5\u5728 C# \u4e2d\u6709\u5f88\u591a\u79cd\u7528\u6cd5\uff0c\u6bd4\u5982\u5f15\u5165\u547d\u540d\u7a7a\u95f4\uff0c\u4e3a\u7c7b\u578b\u8d77\u522b\u540d\uff0c\u6216\u8005\u91ca\u653e\u8d44\u6e90\u7b49\u3002\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u4e3b\u8981\u8ba8\u8bba <code>using<\/code> \u8bed\u53e5\u5728\u91ca\u653e\u8d44\u6e90\u65f6\u7684\u9677\u9631\u3002<\/p>\n<h2 id=\"using-\u4ee5\u524d\u7684\u4f7f\u7528\u65b9\u5f0f\">\nusing \u4ee5\u524d\u7684\u4f7f\u7528\u65b9\u5f0f\n<a href=\"#using-%e4%bb%a5%e5%89%8d%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e5%bc%8f\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u5f88\u4e45\u5f88\u4e45\u4ee5\u524d\uff0c\u6211\u4eec\u5982\u679c\u60f3\u8981\u8bfb\u53d6\u4e00\u4e2a\u5916\u90e8\u6587\u672c\u6587\u4ef6\u7684\u5185\u5bb9\uff0c\u53ef\u80fd\u4f1a\u8fd9\u6837\u5199\uff08\u4e0d\u8003\u8651\u66f4\u7b80\u6d01\u6613\u7528\u7684 <code>File.ReadAllText()<\/code> \u7b49\u65b9\u6cd5\uff09\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">stream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileStream<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileMode<\/span><span class=\"p\">.<\/span><span class=\"n\">Open<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">reader<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StreamReader<\/span><span class=\"p\">(<\/span><span class=\"n\">stream<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">content<\/span> <span class=\"p\">=<\/span> <span class=\"n\">reader<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadToEnd<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">content<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u5b9e\u4e0a\u9762\u7684\u4ee3\u7801\uff0c\u662f\u53ef\u4ee5\u51cf\u5c11\u4e00\u5c42\u7f29\u8fdb\u7684\uff0c\u5e76\u4e14\u8fd9\u4e5f\u662f\u5404\u79cd IDE \u63a8\u8350\u7684\u5199\u6cd5\uff0c\u5f62\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">stream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileStream<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileMode<\/span><span class=\"p\">.<\/span><span class=\"n\">Open<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">reader<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StreamReader<\/span><span class=\"p\">(<\/span><span class=\"n\">stream<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">content<\/span> <span class=\"p\">=<\/span> <span class=\"n\">reader<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadToEnd<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">content<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a\u5176\u5b9e\u5f88\u6709\u610f\u601d\uff0c\u56e0\u4e3a\u4e00\u822c\u6211\u4eec\u90fd\u8ba4\u4e3a\uff0c\u5373\u4fbf\u5916\u5c42\u7684\u8bed\u53e5\u7701\u7565\u4e86\u82b1\u62ec\u53f7\uff0c\u5185\u5c42\u7684\u8bed\u53e5\u4f9d\u65e7\u4f1a\u4fdd\u6301\u7f29\u8fdb\uff0c\u5c31\u6bd4\u5982\u591a\u5c42 <code>if<\/code> \u8bed\u53e5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">condition1<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">condition2<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ do something<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4f46\u662f\u4e0a\u9762\u5c55\u793a\u7684 <code>using<\/code> \u7684\u7701\u7565\u5916\u5c42\u82b1\u62ec\u53f7\u7684\u65b0\u8bed\u6cd5\uff0c\u5185\u5c42\u7684\u8bed\u53e5\u5e76\u4e0d\u4f1a\u989d\u5916\u6dfb\u52a0\u7f29\u8fdb\uff0c\u800c\u662f\u4f1a\u4e0e\u5916\u5c42\u4fdd\u6301\u540c\u4e00\u5c42\u7ea7\u3002\u4e0d\u4fe1\u7684\u8bdd\uff0c\u53ef\u4ee5\u4f7f\u7528\u4efb\u610f\u4e00\u4e2a\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u6bd4\u5982 Visual Studio \u7684 <code>Ctrl+K, Ctrl+D<\/code>\uff0c\u683c\u5f0f\u5316\u4e00\u4e0b\u4e0a\u9762\u7684\u4ee3\u7801\uff0c\u770b\u770b\u4f1a\u662f\u4ec0\u4e48\u6837\u5b50\u3002<\/p>\n<h2 id=\"using-\u7684\u65b0\u8bed\u6cd5\">\nusing \u7684\u65b0\u8bed\u6cd5\n<a href=\"#using-%e7%9a%84%e6%96%b0%e8%af%ad%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h2><p>C# 8.0 \u4e3a\u6211\u4eec\u5e26\u6765\u4e86\u4e00\u4e2a\u65b0\u7684 <code>using<\/code> \u8bed\u53e5\u7684\u7528\u6cd5\uff0c\u53ef\u4ee5\u51cf\u5c11\u4e00\u5c42\u7f29\u8fdb\uff0c\u8ba9\u4ee3\u7801\u770b\u8d77\u6765\u66f4\u7b80\u6d01\u3002\u540c\u6837\u662f\u4e0a\u9762\u7684\u4ee3\u7801\uff0c\u73b0\u5728\u53ef\u4ee5\u5199\u6210\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">filename<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;test.txt&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">stream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileStream<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileMode<\/span><span class=\"p\">.<\/span><span class=\"n\">Open<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">reader<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StreamReader<\/span><span class=\"p\">(<\/span><span class=\"n\">stream<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">content<\/span> <span class=\"p\">=<\/span> <span class=\"n\">reader<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadToEnd<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">content<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0a\u9762\u7684\u4ee3\u7801\u5b9e\u9645\u4e0a\u4f1a\u88ab\u7f16\u8bd1\u4e3a\u8fd9\u6837\u7684 low-level C# \u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">path<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;test.txt&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">FileStream<\/span> <span class=\"n\">fileStream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileStream<\/span><span class=\"p\">(<\/span><span class=\"n\">path<\/span><span class=\"p\">,<\/span> <span class=\"n\">FileMode<\/span><span class=\"p\">.<\/span><span class=\"n\">Open<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">try<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">StreamReader<\/span> <span class=\"n\">streamReader<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">StreamReader<\/span><span class=\"p\">(<\/span><span class=\"n\">fileStream<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">try<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">string<\/span> <span class=\"k\">value<\/span> <span class=\"p\">=<\/span> <span class=\"n\">streamReader<\/span><span class=\"p\">.<\/span><span class=\"n\">ReadToEnd<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"k\">value<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">finally<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">streamReader<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">((<\/span><span class=\"n\">IDisposable<\/span><span class=\"p\">)<\/span><span class=\"n\">streamReader<\/span><span class=\"p\">).<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">finally<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">fileStream<\/span> <span class=\"p\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">((<\/span><span class=\"n\">IDisposable<\/span><span class=\"p\">)<\/span><span class=\"n\">fileStream<\/span><span class=\"p\">).<\/span><span class=\"n\">Dispose<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0d\u96be\u770b\u51fa\uff0c<code>using<\/code> \u8bed\u53e5\u7528\u4e8e\u8d44\u6e90\u91ca\u653e\u65f6\uff0c\u5176\u5b9e\u662f\u901a\u8fc7 <code>try-finally<\/code> \u8bed\u53e5\u6765\u5b9e\u73b0\u7684\u3002\u5f53\u5b58\u5728\u591a\u5c42\u7684 <code>using<\/code> \u8bed\u53e5\u65f6\uff0c\u6bcf\u4e00\u5c42\u90fd\u4f1a\u5bf9\u5e94\u4e00\u4e2a <code>try-finally<\/code> \u8bed\u53e5\uff0c\u4e5f\u5c31\u53d8\u6210\u4e86\u4e0a\u9762\u7684\u6837\u5b50\u3002<\/p>\n<p>\u65b0\u7684\u8bed\u6cd5\u4f1a\u5c06 <code>using<\/code> \u8bed\u53e5\u4e0b\u9762\u7684\u5185\u5bb9\uff08\u51c6\u786e\u5730\u8bf4\uff0c\u662f\u5f53\u524d\u4f5c\u7528\u57df\u4e2d\u5269\u4e0b\u7684\u4ee3\u7801\uff09\u5305\u88c5\u5728 <code>try-finally<\/code> \u8bed\u53e5\u4e2d\uff0c\u4ece\u800c\u4fdd\u8bc1\u4ee3\u7801\u5728\u79bb\u5f00\u4f5c\u7528\u57df\u524d\uff0c\u4f1a\u91ca\u653e\u8d44\u6e90\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\">\u4ed4\u7ec6\u89c2\u5bdf\u8fd8\u53ef\u4ee5\u53d1\u73b0\uff0c<code>Dispose<\/code> \u7684\u987a\u5e8f\u662f\u4ece\u5185\u5230\u5916\u7684\uff0c\u6216\u8005\u8bf4\u5148\u88ab <code>using<\/code> \u7684\u5bf9\u8c61\u4f1a\u540e\u88ab\u91ca\u653e\u3002<\/div>\n<\/div>\n<h2 id=\"\u65b0\u8bed\u6cd5\u7684\u9677\u9631\">\n\u65b0\u8bed\u6cd5\u7684\u9677\u9631\n<a href=\"#%e6%96%b0%e8%af%ad%e6%b3%95%e7%9a%84%e9%99%b7%e9%98%b1\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5b66\u4e86\u8fd9\u4e2a\u65b0\u8bed\u6cd5\u4e4b\u540e\uff0c\u76f8\u4fe1\u5f88\u591a\u4eba\u90fd\u6253\u7b97\u5168\u9762\u66ff\u4ee3\u6389\u65e7\u65b9\u6cd5\uff0c\u6bd5\u7adf\u5c11\u5199\u4e86\u82b1\u62ec\u53f7\uff0c\u800c\u4e14\u51cf\u5c11\u4e86\u7f29\u8fdb\uff0c\u6548\u679c\u8fd8\u4e00\u6a21\u4e00\u6837\u3002\u4f46\u5b9e\u9645\u4e0a\uff0c\u8fd9\u79cd\u65b0\u8bed\u6cd5\u5e76\u4e0d\u662f\u9002\u7528\u4e8e\u6240\u6709\u60c5\u51b5\u7684\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u6548\u679c\u672a\u5fc5\u4e00\u6a21\u4e00\u6837\u3002\u6bd4\u5982\u4e4b\u524d\u6211\u5c31\u8e29\u4e86\u4e00\u4e2a\u5751\u3002<\/p>\n<p>\u5f53\u65f6\u7684\u60c5\u51b5\u662f\uff0c\u6211\u5728\u4f7f\u7528 <code>System.IO.Compression<\/code> \u547d\u540d\u7a7a\u95f4\u4e0b\u7684 <code>GZipStream<\/code> \u6765\u538b\u7f29\u4e00\u4e2a\u6587\u672c\uff0c\u5e76\u8f93\u51fa\u538b\u7f29\u540e\u7684\u5185\u5bb9\u3002\u6211\u4f7f\u7528\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.IO.Compression<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">System.Text<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">string<\/span> <span class=\"n\">input<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;text to be compressed.&#34;<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">outputStream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">inputStream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">(<\/span><span class=\"n\">Encoding<\/span><span class=\"p\">.<\/span><span class=\"n\">UTF8<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"n\">input<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">compressor<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">GZipStream<\/span><span class=\"p\">(<\/span><span class=\"n\">outputStream<\/span><span class=\"p\">,<\/span> <span class=\"n\">CompressionLevel<\/span><span class=\"p\">.<\/span><span class=\"n\">Optimal<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">inputStream<\/span><span class=\"p\">.<\/span><span class=\"n\">CopyTo<\/span><span class=\"p\">(<\/span><span class=\"n\">compressor<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">compressed<\/span> <span class=\"p\">=<\/span> <span class=\"n\">outputStream<\/span><span class=\"p\">.<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">compressed<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd0\u884c\u540e\uff0c\u8f93\u51fa\u4e86\u538b\u7f29\u540e\u7684\u5185\u5bb9\u957f\u5ea6\u4e3a <code>10<\/code>\u3002<\/p>\n<p>\u4f46\u662f\u5f53\u6211\u4fee\u6539\u4e86 <code>input<\/code> \u7684\u5b57\u7b26\u4e32\u5185\u5bb9\u540e\uff0c\u53d1\u73b0\u8f93\u51fa\u7684\u957f\u5ea6\u4f9d\u65e7\u662f <code>10<\/code>\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u53ef\u80fd\u7684\u3002\u6211\u68c0\u67e5\u4e86\u4e00\u4e0b\u4ee3\u7801\uff0c\u53d1\u73b0\u95ee\u9898\u51fa\u5728\u4e86 <code>using<\/code> \u8bed\u53e5\u4e0a\u3002\u53ea\u8981\u628a\u4e0a\u9762\u7684\u4ee3\u7801\u4fee\u6539\u6210\u8fd9\u6837\uff0c\u5c31\u80fd\u5f97\u5230\u6b63\u786e\u7684\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">outputStream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">inputStream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MemoryStream<\/span><span class=\"p\">(<\/span><span class=\"n\">Encoding<\/span><span class=\"p\">.<\/span><span class=\"n\">UTF8<\/span><span class=\"p\">.<\/span><span class=\"n\">GetBytes<\/span><span class=\"p\">(<\/span><span class=\"n\">input<\/span><span class=\"p\">)))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">compressor<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">GZipStream<\/span><span class=\"p\">(<\/span><span class=\"n\">outputStream<\/span><span class=\"p\">,<\/span> <span class=\"n\">CompressionLevel<\/span><span class=\"p\">.<\/span><span class=\"n\">Optimal<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">inputStream<\/span><span class=\"p\">.<\/span><span class=\"n\">CopyTo<\/span><span class=\"p\">(<\/span><span class=\"n\">compressor<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">compressed<\/span> <span class=\"p\">=<\/span> <span class=\"n\">outputStream<\/span><span class=\"p\">.<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">compressed<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u9020\u6210\u8fd9\u4e00\u73b0\u8c61\u7684\u539f\u56e0\u662f\uff0c\u5982\u679c\u60f3\u8981\u5f97\u5230\u6b63\u786e\u7684\u538b\u7f29\u540e\u7684\u5185\u5bb9\uff0c\u9700\u8981\u4fdd\u8bc1 <code>GZipStream<\/code> \u5df2\u7ecf\u88ab\u91ca\u653e\u3002\u4f46\u662f\u5982\u679c\u6211\u4eec\u4e0d\u52a0\u58f0\u660e <code>GZipStream<\/code> \u8fd9\u4e00\u884c\u7684\u82b1\u62ec\u53f7\uff0c\u4f1a\u5bfc\u81f4\u5b83\u76f4\u5230\u79bb\u5f00\u4f5c\u7528\u57df\u65f6\u624d\u88ab\u91ca\u653e\uff0c\u800c\u4e0d\u662f\u5728 <code>inputStream.CopyTo(compressor)<\/code> \u4e4b\u540e\u7acb\u5373\u91ca\u653e\u3002<\/p>\n<p>\u6240\u4ee5\uff0c\u5927\u5bb6\u5728\u4f7f\u7528\u65b0\u7684 <code>using<\/code> \u8bed\u53e5\u65f6\uff0c\u4e00\u5b9a\u8981\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u6765\u5224\u65ad\u662f\u5426\u9002\u7528\uff0c\u4e0d\u8981\u65e0\u8111\u66ff\u6362\u6389\u4ee5\u524d\u7684\u65e7\u5199\u6cd5\u3002<\/p>"},{"title":"C# \u9e2d\u5b50\u7c7b\u578b\u6c47\u603b","link":"https:\/\/blog.coldwind.top\/posts\/csharp-duck-types\/","pubDate":"Thu, 04 Apr 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/csharp-duck-types\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/04\/11\/SIRUGn7OflgEWsr.jpg\" alt=\"Featured image of post C# \u9e2d\u5b50\u7c7b\u578b\u6c47\u603b\" \/><h2 id=\"\u4ec0\u4e48\u662f\u9e2d\u5b50\u7c7b\u578b\">\n\u4ec0\u4e48\u662f\u201c\u9e2d\u5b50\u7c7b\u578b\u201d\uff1f\n<a href=\"#%e4%bb%80%e4%b9%88%e6%98%af%e9%b8%ad%e5%ad%90%e7%b1%bb%e5%9e%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9e2d\u5b50\u7c7b\u578b\u7684\u540d\u5b57\u6765\u6e90\u4e8e\u4e00\u53e5\u4fda\u8bed\uff1a<\/p>\n<blockquote>\n<p>\u5982\u679c\u5b83\u8d70\u8d77\u6765\u50cf\u9e2d\u5b50\uff0c\u53eb\u8d77\u6765\u50cf\u9e2d\u5b50\uff0c\u90a3\u4e48\u5b83\u5c31\u662f\u9e2d\u5b50\u3002<\/p>\n<\/blockquote>\n<p>\u8fd9\u53e5\u8bdd\u7684\u610f\u601d\u662f\uff0c\u5982\u679c\u4e00\u4e2a\u5bf9\u8c61\u5177\u6709\u67d0\u4e2a\u65b9\u6cd5\u6216\u5c5e\u6027\uff0c\u90a3\u4e48\u5b83\u5c31\u53ef\u4ee5\u88ab\u5f53\u4f5c\u62e5\u6709\u8fd9\u4e2a\u65b9\u6cd5\u6216\u5c5e\u6027\u7684\u7c7b\u578b\u6765\u4f7f\u7528\uff0c\u800c\u4e0d\u9700\u8981\u4e25\u683c\u5730\u9075\u5faa\u4e00\u4e9b\u89c4\u5b9a\u4e0e\u8981\u6c42\u3002<\/p>\n<p>\u5728 C# \u4e2d\uff0c\u901a\u5e38\u6211\u4eec\u4f1a\u8ba4\u4e3a\uff0c\u5982\u679c\u60f3\u8981\u4f7f\u7528\u4e00\u4e9b\u8bed\u6cd5\uff0c\u9700\u8981\u5b9e\u73b0\u4e00\u4e9b\u63a5\u53e3\u3002\u6bd4\u5982\u4f60\u5f88\u53ef\u80fd\u4f1a\u89c9\u5f97\uff1a<\/p>\n<ul>\n<li>\u5982\u679c\u60f3\u8981\u4f7f\u7528 <code>foreach<\/code> \u8bed\u53e5\uff0c\u9700\u8981\u5b9e\u73b0 <code>IEnumerable<\/code> \u63a5\u53e3<\/li>\n<li>\u5982\u679c\u60f3\u8981\u4f7f\u7528 <code>await<\/code> \u8bed\u53e5\uff0c\u9700\u8981\u4e0e <code>Task<\/code> \u7c7b\u6216\u4e00\u4e9b\u5e95\u5c42\u63a5\u53e3\u626f\u4e0a\u5173\u7cfb<\/li>\n<li>\u5982\u679c\u60f3\u8981\u4f7f\u7528 <code>using<\/code> \u8bed\u53e5\u91ca\u653e\u8d44\u6e90\uff0c\u9700\u8981\u5b9e\u73b0 <code>IDisposable<\/code> \u63a5\u53e3<\/li>\n<\/ul>\n<p>\u5b9e\u9645\u4e0a\u771f\u7684\u5982\u6b64\u5417\uff1f\u8fd9\u7bc7\u6587\u7ae0\u6211\u4eec\u5c31\u6765\u603b\u7ed3\u4e00\u4e0b C# \u4e2d\u7684\u90a3\u4e9b\u4e0d\u4e3a\u4eba\u77e5\u7684\u9e2d\u5b50\u7c7b\u578b\u3002<\/p>\n<h2 id=\"c-\u4e2d\u7684\u9e2d\u5b50\u7c7b\u578b\">\nC# \u4e2d\u7684\u9e2d\u5b50\u7c7b\u578b\n<a href=\"#c-%e4%b8%ad%e7%9a%84%e9%b8%ad%e5%ad%90%e7%b1%bb%e5%9e%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"foreach-\u8bed\u53e5\">\n<code>foreach<\/code> \u8bed\u53e5\n<a href=\"#foreach-%e8%af%ad%e5%8f%a5\" class=\"anchor\">&para;<\/a>\n<\/h3><p>C# \u6807\u51c6\u5e93\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u5927\u91cf\u7684\u96c6\u5408\u7c7b\u578b\uff0c\u6bd4\u5982 <code>List<\/code>\u3001<code>Stack<\/code>\u3001<code>Queue<\/code>\u3001<code>ObservableCollection<\/code> \u7b49\u7b49\u3002\u8fd9\u4e9b\u96c6\u5408\u7c7b\u578b\u90fd\u5b9e\u73b0\u4e86 <code>IEnumerable<\/code> \u63a5\u53e3\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>foreach<\/code> \u8bed\u6cd5\u6765\u904d\u5386\u5b83\u4eec\u3002<\/p>\n<p>\u4f46\u5b9e\u9645\u4e0a\uff0c<code>foreach<\/code> \u8bed\u6cd5\u5e76\u4e0d\u8981\u6c42\u7c7b\u5fc5\u987b\u5b9e\u73b0 <code>IEnumerable<\/code> \u63a5\u53e3\u3002\u53ea\u8981\u7c7b\u4e2d\u6709\u4e00\u4e2a\u540d\u4e3a <code>GetEnumerator<\/code> \u7684\u65b9\u6cd5\uff0c\u8fd4\u56de\u4e00\u4e2a <code>IEnumerator<\/code> \u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 <code>foreach<\/code> \u8bed\u6cd5\u3002\u6bd4\u5982\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">c<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MyEnumerableClass<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">item<\/span> <span class=\"k\">in<\/span> <span class=\"n\">c<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">MyEnumerableClass<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span><span class=\"p\">[]<\/span> <span class=\"n\">items<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">[]<\/span> <span class=\"p\">{<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">3<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">IEnumerator<\/span> <span class=\"n\">GetEnumerator<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">items<\/span><span class=\"p\">.<\/span><span class=\"n\">GetEnumerator<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u8fd8\u53ef\u4ee5\u73a9\u4e00\u4e9b\u201c\u82b1\u6d3b\u201d\u3002\u4e8b\u5b9e\u4e0a\uff0c\u8fd9\u4e2a <code>GetEnumerator<\/code> \u65b9\u6cd5\u5176\u5b9e\u90fd\u4e0d\u9700\u8981\u76f4\u63a5\u51fa\u81ea\u8fd9\u4e2a\u7c7b\u578b\uff0c\u751a\u81f3\u53ef\u4ee5\u662f\u4e00\u4e2a\u6269\u5c55\u65b9\u6cd5\u3002\u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u4e00\u4e9b\u6211\u4eec\u65e0\u6cd5\u4fee\u6539\u7684\u7c7b\u6dfb\u52a0\u6269\u5c55\u65b9\u6cd5\uff0c\u4ece\u800c\u4f7f\u5b83\u4eec\u53d8\u5f97\u53ef\u4ee5\u88ab <code>foreach<\/code> \u8bed\u6cd5\u904d\u5386\u3002\u6bd4\u5982 C# 8.0 \u5f15\u5165\u4e86 <code>Range<\/code> \u4e0e <code>Index<\/code> \u4e24\u4e2a\u7c7b\u578b\uff0c\u8868\u793a\u6570\u7ec4\u7684\u8303\u56f4\u4e0e\u7d22\u5f15\u3002<\/p>\n<div class=\"notice info\">\n<div class=\"notice-title\">\n<i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"><\/i>Info\n<\/div>\n<div class=\"notice-content\"><p>\u901a\u5e38\u6211\u4eec\u4e0d\u4f1a\u76f4\u63a5\u58f0\u660e\u4e00\u4e2a <code>Range<\/code> \u5bf9\u8c61\uff0c\u800c\u662f\u4f1a\u4f7f\u7528\u5f62\u5982 <code>array[1..5]<\/code> \u8fd9\u6837\u7684\u8bed\u6cd5\u6765\u8868\u793a\u4e00\u4e2a\u8303\u56f4\u3002\u5728\u5e95\u5c42\uff0c\u8fd9\u4e2a <code>1..5<\/code> \u4f1a\u88ab\u8f6c\u6362\u4e3a\u4e00\u4e2a <code>Range<\/code> \u5bf9\u8c61\u3002<\/p>\n<p>\u4f60\u751a\u81f3\u53ef\u4ee5\u4e0d\u5728\u6570\u7ec4\u7684\u7d22\u5f15\u5668\u4e2d\u4f7f\u7528\u8fd9\u4e2a\u8bed\u6cd5\uff0c\u800c\u662f\u76f4\u63a5\u58f0\u660e\u4e00\u4e2a\u53d8\u91cf\u5e76\u8fd9\u6837\u8fdb\u884c\u8d4b\u503c\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">range<\/span> <span class=\"p\">=<\/span> <span class=\"m\">1.<\/span><span class=\"p\">.<\/span><span class=\"m\">5<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">range<\/span><span class=\"p\">.<\/span><span class=\"n\">GetType<\/span><span class=\"p\">().<\/span><span class=\"n\">Name<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ Range<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><\/div>\n<\/div>\n<p>\u6211\u4eec\u53ef\u4ee5\u4e3a <code>Range<\/code> \u7c7b\u578b\u6dfb\u52a0\u4e00\u4e2a\u6269\u5c55\u65b9\u6cd5\uff0c\u4f7f\u5f97\u5b83\u4eec\u53ef\u4ee5\u88ab <code>foreach<\/code> \u8bed\u6cd5\u904d\u5386\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">MyExtensions<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">IEnumerator<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">GetEnumerator<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span> <span class=\"n\">Range<\/span> <span class=\"n\">range<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"n\">range<\/span><span class=\"p\">.<\/span><span class=\"n\">Start<\/span><span class=\"p\">.<\/span><span class=\"n\">Value<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"p\">&lt;=<\/span> <span class=\"n\">range<\/span><span class=\"p\">.<\/span><span class=\"n\">End<\/span><span class=\"p\">.<\/span><span class=\"n\">Value<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span><span class=\"p\">++)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">yield<\/span> <span class=\"k\">return<\/span> <span class=\"n\">i<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u5c31\u53ef\u4ee5\u8fd9\u6837\u73a9\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">i<\/span> <span class=\"k\">in<\/span> <span class=\"m\">1.<\/span><span class=\"p\">.<\/span><span class=\"m\">3<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ 1..3 \u662f\u4e00\u4e2a Range \u7c7b\u578b<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u8f93\u51fa\uff1a<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ 3<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"await-\u8bed\u53e5\">\n<code>await<\/code> \u8bed\u53e5\n<a href=\"#await-%e8%af%ad%e5%8f%a5\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u7c7b\u4f3c\u5730\uff0c<code>await<\/code> \u8bed\u6cd5\u4e5f\u4e0d\u8981\u6c42\u7c7b\u5fc5\u987b\u7ee7\u627f <code>Task<\/code> \u7c7b\u6216\u5b9e\u73b0\u4e00\u4e9b\u5e95\u5c42\u63a5\u53e3\u3002\u53ea\u8981\u7c7b\u4e2d\u6709\u4e00\u4e2a\u540d\u4e3a <code>GetAwaiter<\/code> \u7684\u65b9\u6cd5\uff0c\u8fd4\u56de\u4e00\u4e2a <code>IAwaiter<\/code> \u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 <code>await<\/code> \u8bed\u6cd5\u3002\u5e76\u4e14\u4e0e\u4e0a\u9762 <code>foreach<\/code> \u7684\u4f8b\u5b50\u76f8\u540c\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u628a <code>GetAwaiter<\/code> \u65b9\u6cd5\u5b9a\u4e49\u4e3a\u4e00\u4e2a\u6269\u5c55\u65b9\u6cd5\uff0c\u4ece\u800c\u201c\u6269\u5c55\u201d\u4e00\u4e9b\u6211\u4eec\u65e0\u6cd5\u4fee\u6539\u7684\u7c7b\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Extensions<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">TaskAwaiter<\/span> <span class=\"n\">GetAwaiter<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span> <span class=\"n\">TimeSpan<\/span> <span class=\"n\">ts<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"n\">ts<\/span><span class=\"p\">).<\/span><span class=\"n\">GetAwaiter<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">TaskAwaiter<\/span> <span class=\"n\">GetAwaiter<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span> <span class=\"kt\">double<\/span> <span class=\"n\">sec<\/span><span class=\"p\">)<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Task<\/span><span class=\"p\">.<\/span><span class=\"n\">Delay<\/span><span class=\"p\">(<\/span><span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"n\">sec<\/span><span class=\"p\">)).<\/span><span class=\"n\">GetAwaiter<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u4e0a\u9762\u7684\u9759\u6001\u7c7b\u4e2d\u58f0\u660e\u4e86\u4e24\u4e2a\u6269\u5c55\u65b9\u6cd5\uff0c\u5206\u522b\u4e3a <code>TimeSpan<\/code> \u4e0e <code>double<\/code> \u7c7b\u578b\u6dfb\u52a0\u4e86 <code>GetAwaiter<\/code> \u65b9\u6cd5\u3002\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u8fd9\u6837\u4f7f\u7528 <code>await<\/code> \u8bed\u6cd5\u4e86\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">await<\/span> <span class=\"n\">TimeSpan<\/span><span class=\"p\">.<\/span><span class=\"n\">FromSeconds<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">await<\/span> <span class=\"m\">1.0<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u662f\u4e0d\u662f\u611f\u89c9\u8d8a\u6765\u8d8a\u79bb\u8c31\u4e86\uff1f\u4e0d\u8fc7\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u8f7b\u6613\u8fd8\u662f\u4e0d\u8981\u4f7f\u7528\u8fd9\u6837\u7684\u6280\u5de7\uff0c\u56e0\u4e3a\u8fd9\u4f1a\u4e25\u91cd\u6c61\u67d3\u5e38\u7528\u7684\u7c7b\u578b\uff0c\u53ef\u4ee5\u8bf4\u662f\u6709\u767e\u5bb3\u800c\u65e0\u4e00\u5229\u3002<\/p>\n<h3 id=\"using-\u8bed\u53e5\">\n<code>using<\/code> \u8bed\u53e5\n<a href=\"#using-%e8%af%ad%e5%8f%a5\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u5982\u679c\u4f60\u8ba4\u4e3a <code>using<\/code> \u8bed\u53e5\u53ea\u80fd\u7528\u4e8e\u5b9e\u73b0\u4e86 <code>IDisposable<\/code> \u63a5\u53e3\u7684\u7c7b\uff0c\u90a3\u4f60\u7ec8\u4e8e\u57fa\u672c\u4e0a\u5bf9\u4e86\u4e00\u6b21\ud83d\ude02\u3002\u7684\u786e\uff0c\u5bf9\u4e8e\u4e00\u4e2a <code>class<\/code> \u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u5982\u679c\u5b83\u6ca1\u6709\u5b9e\u73b0 <code>IDisposable<\/code> \u63a5\u53e3\uff0c\u90a3\u4e48\u5373\u4fbf\u5b83\u62e5\u6709 <code>public void Dispose()<\/code> \u65b9\u6cd5\uff0c\u5b83\u4ecd\u7136\u662f\u65e0\u6cd5\u4f7f\u7528 <code>using<\/code> \u8bed\u53e5\u7684\uff08\u7f16\u8bd1\u5668\u4f1a\u63d0\u793a\uff0c\u8fd9\u4e2a\u5bf9\u8c61\u5fc5\u987b\u53ef\u4ee5\u9690\u5f0f\u8f6c\u6362\u4e3a <code>IDisposable<\/code> \u5bf9\u8c61\uff09\u3002<\/p>\n<p>\u4f46\u662f\uff01<\/p>\n<p>C# \u4e2d\u8fd8\u6709\u4e00\u4e2a\u4e0d\u592a\u5e38\u7528\u7684 <code>ref struct<\/code> \u7c7b\u578b\u3002\u8fd9\u79cd\u7c7b\u578b\u7684\u5bf9\u8c61\u5728\u79bb\u5f00\u4f5c\u7528\u57df\u65f6\u4f1a\u81ea\u52a8\u88ab\u9500\u6bc1\uff0c\u6240\u4ee5\u5b83\u4eec\u4e0d\u9700\u8981\u5b9e\u73b0 <code>IDisposable<\/code> \u63a5\u53e3\u3002\u5373\u4fbf\u5982\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4e3a\u8fd9\u79cd\u7c7b\u578b\u7684\u5bf9\u8c61\u6dfb\u52a0\u4e00\u4e2a <code>Dispose<\/code> \u65b9\u6cd5\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528 <code>using<\/code> \u8bed\u53e5\u6765\u91ca\u653e\u8d44\u6e90\u4e86\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><span class=\"lnt\">8\n<\/span><span class=\"lnt\">9\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">ref<\/span> <span class=\"k\">struct<\/span> <span class=\"nc\">MyDisposableStructType<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Dispose<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyDisposableStructType Disposed.&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">s<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MyDisposableStructType<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u6837\u7684\u8bdd\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u4e00\u4e2a\u6ca1\u6709\u5b9e\u73b0 <code>IDisposable<\/code> \u63a5\u53e3\u7684\u5bf9\u8c61\u4f7f\u7528 <code>using<\/code> \u8bed\u53e5\u4e86\u3002<\/p>\n<h3 id=\"\u96c6\u5408\u521d\u59cb\u5316\u5668\">\n\u96c6\u5408\u521d\u59cb\u5316\u5668\n<a href=\"#%e9%9b%86%e5%90%88%e5%88%9d%e5%a7%8b%e5%8c%96%e5%99%a8\" class=\"anchor\">&para;<\/a>\n<\/h3><p>C# \u4e2d\u7684\u5f88\u591a\u96c6\u5408\u7c7b\u578b\u90fd\u652f\u6301\u96c6\u5408\u521d\u59cb\u5316\u5668\u8bed\u6cd5 <code>{ }<\/code> \u6765\u521d\u59cb\u5316\u96c6\u5408\u5bf9\u8c61\u3002\u6bd4\u5982 <code>List<\/code> \u7c7b\u578b\u53ef\u4ee5\u8fd9\u6837\u521d\u59cb\u5316\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">list<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">3<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5b9e\u9645\u4e0a\uff0c\u53ea\u8981\u7c7b\u5b9e\u73b0\u4e86 <code>IEnumerable<\/code> \u63a5\u53e3\uff0c\u5e76\u4e14\u5305\u542b\u4e00\u4e2a\u540d\u4e3a <code>Add<\/code> \u7684\u65b9\u6cd5\uff0c\u90a3\u4e48\u8fd9\u4e2a\u7c7b\u5c31\u53ef\u4ee5\u4f7f\u7528\u96c6\u5408\u521d\u59cb\u5316\u5668\u8bed\u6cd5\u3002\u6bd4\u5982\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">PlanetCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IEnumerable<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">T<\/span><span class=\"p\">[]<\/span> <span class=\"n\">Planets<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">init<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">_index<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">PlanetCollection<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">count<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Planets<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">T<\/span><span class=\"p\">[<\/span><span class=\"n\">count<\/span><span class=\"p\">];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">T<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_index<\/span> <span class=\"p\">&gt;=<\/span> <span class=\"n\">Planets<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IndexOutOfRangeException<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Planets<\/span><span class=\"p\">[<\/span><span class=\"n\">_index<\/span><span class=\"p\">++]<\/span> <span class=\"p\">=<\/span> <span class=\"n\">item<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">IEnumerator<\/span> <span class=\"n\">GetEnumerator<\/span><span class=\"p\">()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Planets<\/span><span class=\"p\">.<\/span><span class=\"n\">GetEnumerator<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u8fd9\u6837\u521d\u59cb\u5316\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">collection<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">PlanetCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;(<\/span><span class=\"m\">8<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s\">&#34;mercury&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;venus&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;earth&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;mars&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;jupiter&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;saturn&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;uranus&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;neptune&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f1a\u88ab\u7f16\u8bd1\u4e3a\uff1a<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">PlanetCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">source<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">PlanetCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;(<\/span><span class=\"m\">8<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;mercury&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;venus&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;earth&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;mars&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;jupiter&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;saturn&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;uranus&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;neptune&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"\u5143\u7ec4\u62c6\u5206\">\n\u5143\u7ec4\u62c6\u5206\n<a href=\"#%e5%85%83%e7%bb%84%e6%8b%86%e5%88%86\" class=\"anchor\">&para;<\/a>\n<\/h3><p>C# \u5728\u5f15\u5165\u4e86\u5143\u7ec4\u540e\uff0c\u4e5f\u5f15\u5165\u4e86\u5143\u7ec4\u62c6\u5206\u8bed\u6cd5\u3002\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u5199\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">)<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">c<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">d<\/span><span class=\"p\">)<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"m\">3<\/span><span class=\"p\">,<\/span> <span class=\"m\">4<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5f88\u591a\u539f\u751f\u7684\u7c7b\u578b\u4e5f\u652f\u6301\u5143\u7ec4\u62c6\u5206\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">pair<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">KeyValuePair<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span><span class=\"p\">&gt;(<\/span><span class=\"s\">&#34;key&#34;<\/span><span class=\"p\">,<\/span> <span class=\"m\">42<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"p\">(<\/span><span class=\"n\">key<\/span><span class=\"p\">,<\/span> <span class=\"k\">value<\/span><span class=\"p\">)<\/span> <span class=\"p\">=<\/span> <span class=\"n\">pair<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">dt<\/span> <span class=\"p\">=<\/span> <span class=\"n\">DateTime<\/span><span class=\"p\">.<\/span><span class=\"n\">Now<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"p\">(<\/span><span class=\"n\">year<\/span><span class=\"p\">,<\/span> <span class=\"n\">month<\/span><span class=\"p\">,<\/span> <span class=\"n\">day<\/span><span class=\"p\">)<\/span> <span class=\"p\">=<\/span> <span class=\"n\">dt<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6b64\u5916\uff0c\u5982\u679c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a <code>record<\/code> \u7c7b\u578b\uff0c\u90a3\u4e48\u5e95\u5c42\u4e5f\u4f1a\u4e3a\u6211\u4eec\u63d0\u4f9b\u5143\u7ec4\u62c6\u5206\u7684\u529f\u80fd\u3002<\/p>\n<p>\u5b9e\u9645\u4e0a\uff0c\u5143\u7ec4\u62c6\u5206\u7684\u8bed\u6cd5\u662f\u901a\u8fc7 <code>Deconstruct<\/code> \u65b9\u6cd5\u5b9e\u73b0\u7684\u3002\u53ea\u8981\u7c7b\u4e2d\u6709\u4e00\u4e2a\u540d\u4e3a <code>Deconstruct<\/code> \u7684\u65b9\u6cd5\uff0c\u5e76\u4e14\u7528 <code>out<\/code> \u7684\u65b9\u5f0f\u8fdb\u884c\u4f20\u53c2\uff0c\u90a3\u4e48\u8fd9\u4e2a\u7c7b\u5c31\u53ef\u4ee5\u4f7f\u7528\u5143\u7ec4\u62c6\u5206\u8bed\u6cd5\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Point2d<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">X<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">Y<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Deconstruct<\/span><span class=\"p\">(<\/span><span class=\"k\">out<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"k\">out<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">y<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">x<\/span> <span class=\"p\">=<\/span> <span class=\"n\">X<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">y<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Y<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">point<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Point2d<\/span> <span class=\"p\">{<\/span> <span class=\"n\">X<\/span> <span class=\"p\">=<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"n\">Y<\/span> <span class=\"p\">=<\/span> <span class=\"m\">2<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span><span class=\"p\">)<\/span> <span class=\"p\">=<\/span> <span class=\"n\">point<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"linq-\u7684-selectmany-\u65b9\u6cd5\">\nLINQ \u7684 <code>SelectMany<\/code> \u65b9\u6cd5\n<a href=\"#linq-%e7%9a%84-selectmany-%e6%96%b9%e6%b3%95\" class=\"anchor\">&para;<\/a>\n<\/h3><p>\u6700\u540e\u518d\u8bf4\u4e00\u4e2a\u6bd4\u8f83\u51b7\u95e8\u4e14\u4e0d\u5e38\u7528\u7684\uff0c\u5c31\u662f LINQ \u4e2d\u7684 <code>SelectMany<\/code> \u65b9\u6cd5\uff0c\u4ee5\u53ca\u591a\u5c42 <code>from<\/code> \u8bed\u53e5\u3002\u6bd4\u5982\u6211\u4eec\u73b0\u5728\u6709\u4e00\u4e2a\u201c\u6570\u7ec4\u7684\u6570\u7ec4\u201d\u4e00\u6837\u7684\u7ed3\u6784\uff0c\u4f8b\u5982\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Person<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Pet<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Pets<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">Pet<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code>SelectMany<\/code> \u65b9\u6cd5\u6765\u5c55\u5f00\u8fd9\u4e2a\u7ed3\u6784\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">people<\/span> <span class=\"p\">=<\/span> <span class=\"n\">GetPeople<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u4f7f\u7528\u67e5\u8be2\u8868\u8fbe\u5f0f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">pets<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"k\">from<\/span> <span class=\"n\">person<\/span> <span class=\"k\">in<\/span> <span class=\"n\">people<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">from<\/span> <span class=\"n\">pet<\/span> <span class=\"k\">in<\/span> <span class=\"n\">person<\/span><span class=\"p\">.<\/span><span class=\"n\">Pets<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">select<\/span> <span class=\"n\">pet<\/span><span class=\"p\">).<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6216\u8005\u94fe\u5f0f\u8868\u8fbe\u5f0f<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">pets<\/span> <span class=\"p\">=<\/span> <span class=\"n\">people<\/span><span class=\"p\">.<\/span><span class=\"n\">SelectMany<\/span><span class=\"p\">(<\/span><span class=\"n\">p<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">p<\/span><span class=\"p\">.<\/span><span class=\"n\">Pets<\/span><span class=\"p\">).<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5b9e\u9645\u4e0a\uff0c\u53ea\u8981\u6211\u4eec\u4e3a\u7c7b\u63d0\u4f9b\u6b63\u786e\u7684 <code>SelectMany<\/code> \u65b9\u6cd5\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528\u591a\u5c42 <code>from<\/code> \u8bed\u53e5\u6765\u5c55\u5f00\u8fd9\u4e2a\u7ed3\u6784\u3002\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u4e3a\u4e0a\u9762<a class=\"link\" href=\"#%e9%9b%86%e5%90%88%e5%88%9d%e5%a7%8b%e5%8c%96%e5%99%a8\" >\u96c6\u5408\u521d\u59cb\u5316\u5668<\/a>\u4e2d\u7684 <code>PlanetCollection<\/code> \u7c7b\u578b\u63d0\u4f9b\u4e00\u4e2a <code>SelectMany<\/code> \u65b9\u6cd5\uff0c\u4ece\u800c\u5c55\u5f00\u8fd9\u4e2a\u7ed3\u6784\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">static<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Extensions<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TResult<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">SelectMany<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TSource<\/span><span class=\"p\">,<\/span> <span class=\"n\">TCollection<\/span><span class=\"p\">,<\/span> <span class=\"n\">TResult<\/span><span class=\"p\">&gt;(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">this<\/span> <span class=\"n\">PlanetCollection<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TSource<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">source<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Func<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TSource<\/span><span class=\"p\">,<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TCollection<\/span><span class=\"p\">&gt;&gt;<\/span> <span class=\"n\">collectionSelector<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">Func<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">TSource<\/span><span class=\"p\">,<\/span> <span class=\"n\">TCollection<\/span><span class=\"p\">,<\/span> <span class=\"n\">TResult<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">resultSelector<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">item<\/span> <span class=\"k\">in<\/span> <span class=\"n\">source<\/span><span class=\"p\">.<\/span><span class=\"n\">Planets<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">subItem<\/span> <span class=\"k\">in<\/span> <span class=\"n\">collectionSelector<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">yield<\/span> <span class=\"k\">return<\/span> <span class=\"n\">resultSelector<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"n\">subItem<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kt\">var<\/span> <span class=\"n\">query<\/span> <span class=\"p\">=<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">from<\/span> <span class=\"n\">planet<\/span> <span class=\"k\">in<\/span> <span class=\"n\">collection<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">from<\/span> <span class=\"n\">letter<\/span> <span class=\"k\">in<\/span> <span class=\"n\">planet<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">select<\/span> <span class=\"n\">letter<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"kt\">string<\/span><span class=\"p\">(<\/span><span class=\"n\">query<\/span><span class=\"p\">.<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">()).<\/span><span class=\"n\">ToUpper<\/span><span class=\"p\">());<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u4e2a <code>SelectMany<\/code> \u65b9\u6cd5\u7684\u8981\u6c42\u76f8\u5bf9\u6bd4\u8f83\u590d\u6742\uff0c\u8fd9\u91cc\u6211\u4eec\u5c31\u4e0d\u5c55\u5f00\u8ba8\u8bba\u4e86\u3002<\/p>\n<h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u770b\u4e86\u8fd9\u7bc7\u6587\u7ae0\u4e4b\u540e\uff0c\u76f8\u4fe1\u5927\u5bb6\u4f1a\u5bf9 C# \u8fd9\u95e8\u7f16\u7a0b\u8bed\u8a00\u6709\u4e00\u4e2a\u66f4\u65b0\u7684\u8ba4\u8bc6\u4e86\u5427\uff1f<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u4e0a\u9762\u63d0\u5230\u7684\u5927\u591a\u6570\u9e2d\u5b50\u7c7b\u578b\uff0c\u90fd\u662f\u4e0e\u5e95\u5c42 C# \u4ee3\u7801\u5bc6\u4e0d\u53ef\u5206\u7684\u3002\u8fd9\u91cc\u6211\u7ed9\u5927\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u63a2\u7d22\u7684\u65b9\u5411\uff0c\u6bd4\u5982\u53ef\u4ee5\u501f\u52a9 <a class=\"link\" href=\"https:\/\/sharplab.io\/\" target=\"_blank\" rel=\"noopener\"\n><code>SharpLab<\/code><\/a> \u8fd9\u6837\u7684\u5de5\u5177\uff0c\u67e5\u770b\u8bf8\u5982 <code>foreach<\/code> \u8bed\u53e5\u3001<code>await<\/code> \u8bed\u53e5\u3001\u4ee5\u53ca\u96c6\u5408\u521d\u59cb\u5316\u5668\u7b49\u8bed\u6cd5\u5bf9\u5e94\u7684\u5e95\u5c42 C# \u4ee3\u7801\u3002\u76f8\u4fe1\u5927\u5bb6\u4e00\u5b9a\u4f1a\u6709\u6240\u6536\u83b7\u3002<\/p>"},{"title":"EntityFrameworkCore \u6700\u5c0f\u5165\u95e8\u6307\u5357","link":"https:\/\/blog.coldwind.top\/posts\/efcore-minimal-example\/","pubDate":"Wed, 13 Mar 2024 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/efcore-minimal-example\/","description":"<h2 id=\"\u5b89\u88c5-entityframeworkcore\">\n\u5b89\u88c5 EntityFrameworkCore\n<a href=\"#%e5%ae%89%e8%a3%85-entityframeworkcore\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4ee5 Sql Server \u4e3a\u4f8b\uff0c\u53ef\u4ee5\u5728 NuGet \u5305\u7ba1\u7406\u5668\u4e2d\u641c\u7d22\u5e76\u5b89\u88c5\u4ee5\u4e0b\u5305\uff1a<\/p>\n<ul>\n<li><code>Microsoft.EntityFrameworkCore<\/code><\/li>\n<li><code>Microsoft.EntityFrameworkCore.SqlServer<\/code><\/li>\n<\/ul>\n<h2 id=\"\u5b9e\u73b0-model\">\n\u5b9e\u73b0 Model\n<a href=\"#%e5%ae%9e%e7%8e%b0-model\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5047\u5b9a\u73b0\u5728\u6709\u8fd9\u6837\u4e00\u5f20\u8868\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-sql\" data-lang=\"sql\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">CREATE<\/span><span class=\"w\"> <\/span><span class=\"k\">TABLE<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"n\">dbo<\/span><span class=\"p\">].[<\/span><span class=\"n\">Blog<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"n\">BlogId<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"nb\">INT<\/span><span class=\"w\"> <\/span><span class=\"k\">IDENTITY<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"k\">NOT<\/span><span class=\"w\"> <\/span><span class=\"k\">NULL<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"n\">Title<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"n\">NVARCHAR<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"mi\">100<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"k\">NULL<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"n\">Author<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"n\">NVARCHAR<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"mi\">50<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"k\">NULL<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"n\">Content<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"n\">NVARCHAR<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"k\">MAX<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"k\">NULL<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a\u5bf9\u5e94\u7684 Model\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Blog<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">BlogId<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Title<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Author<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Content<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u521b\u5efa-dbcontext\">\n\u521b\u5efa DbContext\n<a href=\"#%e5%88%9b%e5%bb%ba-dbcontext\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u521b\u5efa\u4e00\u4e2a\u7ee7\u627f\u81ea <code>DbContext<\/code> \u7684\u7c7b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">BloggingContext<\/span> <span class=\"p\">:<\/span> <span class=\"n\">DbContext<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">DbSet<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Blog<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Blogs<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u8fd9\u91cc\u5176\u5b9e\u5e55\u540e\u53d1\u751f\u4e86\u4e00\u4e9b\u57fa\u4e8e EF \u547d\u540d\u4e60\u60ef\u7684\u81ea\u52a8\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a<\/p>\n<ul>\n<li><code>Blog<\/code> \u7c7b\u5bf9\u5e94\u7684\u8868\u540d\u4e3a\u5176\u590d\u6570\u5f62\u5f0f <code>Blogs<\/code><\/li>\n<li><code>BlogId<\/code> \u5b57\u6bb5\u4f1a\u88ab\u81ea\u52a8\u8bc6\u522b\u4e3a\u4e3b\u952e<\/li>\n<\/ul>\n<h2 id=\"\u914d\u7f6e\u8fde\u63a5\u5b57\u7b26\u4e32\">\n\u914d\u7f6e\u8fde\u63a5\u5b57\u7b26\u4e32\n<a href=\"#%e9%85%8d%e7%bd%ae%e8%bf%9e%e6%8e%a5%e5%ad%97%e7%ac%a6%e4%b8%b2\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u662f\u76f4\u63a5\u91cd\u5199 <code>OnConfiguring<\/code> \u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">BloggingContext<\/span> <span class=\"p\">:<\/span> <span class=\"n\">DbContext<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">protected<\/span> <span class=\"kd\">override<\/span> <span class=\"k\">void<\/span> <span class=\"n\">OnConfiguring<\/span><span class=\"p\">(<\/span><span class=\"n\">DbContextOptionsBuilder<\/span> <span class=\"n\">optionsBuilder<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">optionsBuilder<\/span><span class=\"p\">.<\/span><span class=\"n\">UseSqlServer<\/span><span class=\"p\">(<\/span><span class=\"s\">@&#34;Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Blogging;&#34;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u4f7f\u7528-dbcontext\">\n\u4f7f\u7528 DbContext\n<a href=\"#%e4%bd%bf%e7%94%a8-dbcontext\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u83b7\u53d6 <code>Blog<\/code> \u6570\u636e\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">db<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BloggingContext<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">blogs<\/span> <span class=\"p\">=<\/span> <span class=\"n\">db<\/span><span class=\"p\">.<\/span><span class=\"n\">Blogs<\/span><span class=\"p\">.<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6dfb\u52a0\u65b0\u7684 <code>Blog<\/code>\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">db<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BloggingContext<\/span><span class=\"p\">())<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">db<\/span><span class=\"p\">.<\/span><span class=\"n\">Blogs<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Blog<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Title<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Hello World&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Author<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Alice&#34;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Content<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Hello World!&#34;<\/span> <span class=\"p\">});<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">db<\/span><span class=\"p\">.<\/span><span class=\"n\">SaveChanges<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u603b\u7ed3\">\n\u603b\u7ed3\n<a href=\"#%e6%80%bb%e7%bb%93\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728\u672c\u6587\u4e2d\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u6700\u5c0f\u5316\u7684\u793a\u4f8b\u4ecb\u7ecd\u4e86\u5982\u4f55\u4f7f\u7528 Entity Framework Core \u8fdb\u884c\u6570\u636e\u8bbf\u95ee\u3002\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a <code>BloggingContext<\/code> \u7c7b\u6765\u8868\u793a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\uff0c\u5e76\u5b9a\u4e49\u4e86\u4e00\u4e2a <code>DbSet&lt;Blog&gt;<\/code> \u6765\u64cd\u4f5c <code>Blog<\/code> \u5b9e\u4f53\u3002\u6211\u4eec\u8fd8\u5c55\u793a\u4e86\u5982\u4f55\u914d\u7f6e\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u4ee5\u53ca\u5982\u4f55\u4f7f\u7528 <code>DbContext<\/code> \u6765\u6dfb\u52a0\u548c\u83b7\u53d6\u6570\u636e\u3002<\/p>\n<p>\u8fd9\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u867d\u7136\u53ea\u6d89\u53ca\u5230\u4e86\u57fa\u672c\u7684\u64cd\u4f5c\uff0c\u4f46\u5b83\u4e3a\u7406\u89e3 EF Core \u7684\u5de5\u4f5c\u539f\u7406\u548c\u8fdb\u4e00\u6b65\u63a2\u7d22\u5176\u529f\u80fd\u63d0\u4f9b\u4e86\u57fa\u7840\u3002<\/p>\n<p>\u611f\u8c22\u9605\u8bfb\uff0c\u6b22\u8fce\u5728\u8bc4\u8bba\u533a\u5206\u4eab\u4f60\u7684\u60f3\u6cd5\u548c\u95ee\u9898\u3002<\/p>"},{"title":"Benchmark.NET \u7b80\u6613\u6307\u5357","link":"https:\/\/blog.coldwind.top\/posts\/benchmark-dotnet\/","pubDate":"Tue, 05 Mar 2024 10:52:37 +0800","guid":"https:\/\/blog.coldwind.top\/posts\/benchmark-dotnet\/","description":"<p><a class=\"link\" href=\"https:\/\/benchmarkdotnet.org\/\" target=\"_blank\" rel=\"noopener\"\n>Benchmark.NET<\/a> \u662f\u4e00\u4e2a\u7528\u4e8e .NET \u5e94\u7528\u7a0b\u5e8f\u7684\u5f3a\u5927\u7684\u57fa\u51c6\u6d4b\u8bd5\u5e93\u3002\u5b83\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u8bc4\u4f30\u4ed6\u4eec\u7684\u4ee3\u7801\u7684\u6027\u80fd\uff0c\u627e\u51fa\u6f5c\u5728\u7684\u6027\u80fd\u95ee\u9898\uff0c\u5e76\u4e14\u6bd4\u8f83\u4e0d\u540c\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002Benchmark.NET \u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u7279\u6027\uff0c\u5305\u62ec\u5185\u5b58\u8bca\u65ad\u3001\u5168\u5c40\u521d\u59cb\u5316\u3001\u8fed\u4ee3\u521d\u59cb\u5316\u7b49\uff0c\u53ef\u4ee5\u6ee1\u8db3\u5404\u79cd\u6027\u80fd\u6d4b\u8bd5\u7684\u9700\u6c42\u3002<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u5c06\u4ecb\u7ecd Benchmark.NET \u7684\u57fa\u7840\u77e5\u8bc6\u548c\u4e00\u4e9b\u5e38\u7528\u7684\u7279\u6027\u3002\u4f60\u4e5f\u53ef\u4ee5\u89c2\u770b<a class=\"link\" href=\"https:\/\/b23.tv\/9rMsBmF\" target=\"_blank\" rel=\"noopener\"\n>\u6211\u7684 B \u7ad9\u6559\u5b66\u89c6\u9891<\/a>\u8fdb\u884c\u5b66\u4e60\u3002<\/p>\n<h2 id=\"\u5e38\u7528\u7279\u6027\">\n\u5e38\u7528\u7279\u6027\n<a href=\"#%e5%b8%b8%e7%94%a8%e7%89%b9%e6%80%a7\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u4e00\u4e9b\u5e38\u7528\u7684\u7279\u6027\uff1a<\/p>\n<ul>\n<li>Class\n<ul>\n<li><code>MemoryDiagnoser<\/code>\uff1a\u67e5\u770b\u5185\u5b58\u5206\u914d\u60c5\u51b5\uff08\u6709\u4e00\u4e2a bool \u53c2\u6570\uff0c\u8868\u793a\u662f\u5426\u663e\u793a GC \u7684\u60c5\u51b5\uff09<\/li>\n<li><code>SimpleJob<\/code>\uff1a\u53ef\u4ee5\u8bbe\u7f6e .NET \u7248\u672c\uff0c\u5982 <code>RuntimeMoniker.Net60<\/code><\/li>\n<li><code>Orderer(SummaryOrderPolicy.SlowestToFastest)<\/code>\uff1a\u8f93\u51fa\u7ed3\u679c\u7684\u6392\u5e8f<\/li>\n<li><code>RankColumn<\/code>\uff1a\u4e3a\u7ed3\u679c\u8868\u683c\u6dfb\u52a0\u4e00\u5217 Rank\uff0c\u8868\u793a\u5f53\u524d\u884c\u7684\u65b9\u6cd5\u7684\u6392\u540d<\/li>\n<\/ul>\n<\/li>\n<li>Method\n<ul>\n<li><code>Benchmark<\/code>\uff1a\u8868\u793a\u8fd9\u4e2a\u65b9\u6cd5\u9700\u8981\u88ab\u6d4b\u8bd5\uff08\u53e6\u6709\u4e00\u4e2a <code>Baseline<\/code> \u53c2\u6570\uff0c\u540c\u65f6\u4f1a\u7ed9\u7ed3\u679c\u6dfb\u52a0\u4e00\u5217 Ratio\uff0c\u8868\u793a\u548c Baseline \u7684\u6bd4\u7387\uff09<\/li>\n<li><code>Arguments<\/code>\uff1a\u7c7b\u4f3c\u4e8e <code>Params<\/code>\uff0c\u8868\u793a\u8be5\u65b9\u6cd5\u7684\u4f20\u53c2\uff0c\u53ef\u4ee5\u6709\u591a\u4e2a\uff0c\u5e76\u4e14\u4f1a\u548c <code>Params<\/code> \u8054\u52a8\uff0c\u5145\u5206\u8003\u8651\u5404\u79cd\u7ec4\u5408<\/li>\n<li><code>GlobalSetup<\/code>\uff1a\u5168\u5c40\u521d\u59cb\u5316\uff0c\u5e38\u7528\u4e8e\u521d\u59cb\u5316\u4e00\u4e2a\u8981\u7528\u6765\u6d4b\u8bd5\u7684\u53d8\u91cf\u3001\u96c6\u5408\u7b49\u3002\u53ef\u4ee5\u548c <code>Params<\/code> \u8054\u52a8\uff0c\u6bd4\u5982\u6570\u7ec4\u7684\u5bb9\u91cf\u7531\u67d0\u4e2a\u5b57\u6bb5\u51b3\u5b9a<\/li>\n<li><code>IterationSetup<\/code>\uff1a\u7528\u4e8e\u5728\u6bcf\u6b21\u8fed\u4ee3\u524d\u7684\u521d\u59cb\u5316\uff0c\u6bcf\u6b21\u8fed\u4ee3\u90fd\u4f1a\u8c03\u7528\u4e00\u6b21<\/li>\n<\/ul>\n<\/li>\n<li>Field\n<ul>\n<li><code>Params<\/code>\uff1a\u67d0\u4e2a\u5b57\u6bb5\u53ef\u80fd\u6709\u4e0d\u540c\u7684\u503c\uff08\u5982\u679c\u591a\u4e2a\u5b57\u6bb5\u88ab\u6807\u8bb0\u8be5\u7279\u6027\uff0c\u5219\u4f1a\u5145\u5206\u8003\u8651\u6240\u6709\u53c2\u6570\u7684\u7ec4\u5408\uff09<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 id=\"\u5b9e\u9645\u4f8b\u5b50\">\n\u5b9e\u9645\u4f8b\u5b50\n<a href=\"#%e5%ae%9e%e9%99%85%e4%be%8b%e5%ad%90\" class=\"anchor\">&para;<\/a>\n<\/h2><h3 id=\"\u6d4b\u8bd5\u6392\u5e8f\u7684\u6548\u7387\">\n\u6d4b\u8bd5\u6392\u5e8f\u7684\u6548\u7387\n<a href=\"#%e6%b5%8b%e8%af%95%e6%8e%92%e5%ba%8f%e7%9a%84%e6%95%88%e7%8e%87\" class=\"anchor\">&para;<\/a>\n<\/h3><div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-C#\" data-lang=\"C#\"><span class=\"line\"><span class=\"cl\"><span class=\"na\">[MemoryDiagnoser]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">SortTester<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">testList<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [GlobalSetup]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Setup<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">testList<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Enumerable<\/span><span class=\"p\">.<\/span><span class=\"n\">Range<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">100<\/span><span class=\"p\">).<\/span><span class=\"n\">Shuffle<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Random<\/span><span class=\"p\">(<\/span><span class=\"m\">1334<\/span><span class=\"p\">)).<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Benchmark]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">ListSort<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">lst<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">testList<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">lst<\/span><span class=\"p\">.<\/span><span class=\"n\">Sort<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">lst<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Benchmark]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">LinqOrder<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">testList<\/span><span class=\"p\">.<\/span><span class=\"n\">Order<\/span><span class=\"p\">().<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"\u6d4b\u8bd5\u521d\u59cb\u5316\u6570\u7ec4\u7684\u6548\u7387\">\n\u6d4b\u8bd5\u521d\u59cb\u5316\u6570\u7ec4\u7684\u6548\u7387\n<a href=\"#%e6%b5%8b%e8%af%95%e5%88%9d%e5%a7%8b%e5%8c%96%e6%95%b0%e7%bb%84%e7%9a%84%e6%95%88%e7%8e%87\" class=\"anchor\">&para;<\/a>\n<\/h3><div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><span class=\"lnt\">25\n<\/span><span class=\"lnt\">26\n<\/span><span class=\"lnt\">27\n<\/span><span class=\"lnt\">28\n<\/span><span class=\"lnt\">29\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-C#\" data-lang=\"C#\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">ListInit<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Params(16, 128, 1060)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">count<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Benchmark(Baseline = true)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">WithoutInit<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">res<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"p\">&lt;<\/span> <span class=\"n\">count<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span><span class=\"p\">++)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">res<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">res<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Benchmark]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">WithInit<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">res<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">count<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"p\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"p\">&lt;<\/span> <span class=\"n\">count<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span><span class=\"p\">++)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">res<\/span><span class=\"p\">.<\/span><span class=\"n\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">res<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Benchmark]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">WithLinq<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">Enumerable<\/span><span class=\"p\">.<\/span><span class=\"n\">Range<\/span><span class=\"p\">(<\/span><span class=\"m\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">count<\/span><span class=\"p\">).<\/span><span class=\"n\">ToList<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h3 id=\"net-6-vs-net-7\">\n.NET 6 vs. .NET 7\n<a href=\"#net-6-vs-net-7\" class=\"anchor\">&para;<\/a>\n<\/h3><div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-C#\" data-lang=\"C#\"><span class=\"line\"><span class=\"cl\"><span class=\"na\">[MemoryDiagnoser(false)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[SimpleJob(RuntimeMoniker.Net60)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">[SimpleJob(RuntimeMoniker.Net70)]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">SortTester<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"n\">IEnumerable<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">testList<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [GlobalSetup]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Setup<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">testList<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Enumerable<\/span><span class=\"p\">.<\/span><span class=\"n\">Range<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">10<\/span><span class=\"p\">).<\/span><span class=\"n\">ToArray<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [Benchmark]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">CalcMin<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">testList<\/span><span class=\"p\">.<\/span><span class=\"n\">Min<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><h2 id=\"\u6ce8\u610f\u4e8b\u9879\">\n\u6ce8\u610f\u4e8b\u9879\n<a href=\"#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9\" class=\"anchor\">&para;<\/a>\n<\/h2><ol>\n<li>\u8981\u4f7f\u7528\u6709\u7f16\u8bd1\u5668\u4f18\u5316\u7684 Release \u6a21\u5f0f<\/li>\n<li>\u88ab\u6d4b\u8bd5\u7684\u7c7b\u3001\u4f7f\u7528\u4e86\u7279\u6027\u7684\u65b9\u6cd5\u4e0e\u5b57\u6bb5\u5747\u9700\u8981\u4e3a <code>public<\/code><\/li>\n<li>\u5728\u8981\u6d4b\u8bd5\u7684\u65b9\u6cd5\u4e2d\u5c3d\u91cf\u907f\u514d\u4f1a\u88ab JIT \u4f18\u5316\u6389\u7684\u60c5\u51b5\uff0c\u6bd4\u5982\u6709\u4e00\u4e2a\u4e0d\u4f1a\u88ab\u4f7f\u7528\u7684\u53d8\u91cf\u7b49<\/li>\n<li>\u9664\u975e\u8fd8\u60f3\u8981\u6d4b\u8bd5\u5185\u5b58\u8bfb\u53d6\u7684\u901f\u5ea6\u7b49\uff0c\u5426\u5219\u4e00\u822c\u6ca1\u6709\u5fc5\u8981\u521b\u5efa\u8fc7\u5927\u7684\u6570\u7ec4<\/li>\n<\/ol>\n<h2 id=\"\u53c2\u8003\u94fe\u63a5\">\n\u53c2\u8003\u94fe\u63a5\n<a href=\"#%e5%8f%82%e8%80%83%e9%93%be%e6%8e%a5\" class=\"anchor\">&para;<\/a>\n<\/h2><p><a class=\"link\" href=\"https:\/\/fransbouma.github.io\/BenchmarkDotNet\/RulesOfBenchmarking.htm\" target=\"_blank\" rel=\"noopener\"\n>Rules of benchmarking - BenchmarkDotNet Documentation<\/a><\/p>"},{"title":"C# \u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177 CSharpier \u4e0a\u624b\u6307\u5357","link":"https:\/\/blog.coldwind.top\/posts\/csharpier\/","pubDate":"Mon, 16 Oct 2023 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/csharpier\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/04\/14\/qZeQzEnSDvWpPyL.png\" alt=\"Featured image of post C# \u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177 CSharpier \u4e0a\u624b\u6307\u5357\" \/><h2 id=\"\u7b80\u4ecb\">\n\u7b80\u4ecb\n<a href=\"#%e7%ae%80%e4%bb%8b\" class=\"anchor\">&para;<\/a>\n<\/h2><p><a class=\"link\" href=\"https:\/\/csharpier.com\/\" target=\"_blank\" rel=\"noopener\"\n>CSharpier<\/a> \u662f\u4e00\u4e2a\u9488\u5bf9 C# \u4ee3\u7801\u7684\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u8005\u81ea\u52a8\u5316\u5730\u8c03\u6574\u4ee3\u7801\u7684\u683c\u5f0f\uff0c\u4f7f\u5176\u66f4\u52a0\u4e00\u81f4\u548c\u6613\u4e8e\u9605\u8bfb\u3002CSharpier \u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u914d\u7f6e\u9009\u9879\uff0c\u53ef\u4ee5\u6839\u636e\u9879\u76ee\u7684\u9700\u6c42\u5b9a\u5236\u4ee3\u7801\u683c\u5f0f\u5316\u7684\u89c4\u5219\u3002<\/p>\n<p>\u5b83\u7684\u5b98\u65b9\u4ecb\u7ecd\u662f\u300cCSharpier is an opinionated code formatter for C#\u300d\uff0c\u5176\u4e2d\u7684\u201copinionated\u201d\u662f\u4e00\u4e2a\u82f1\u6587\u8bcd\uff0c\u610f\u601d\u662f\u201c\u6709\u4e3b\u89c1\u7684\u201d\u6216\u201c\u6709\u504f\u89c1\u7684\u201d\u3002\u5b83\u60f3\u8868\u8fbe\u7684\u662f\uff0c\u8be5\u5de5\u5177\u5bf9\u4ee3\u7801\u683c\u5f0f\u5316\u6709\u81ea\u5df1\u7684\u504f\u597d\u548c\u4e3b\u89c1\uff0c\u5373\u5b83\u4f1a\u6309\u7167\u81ea\u5df1\u7684\u89c4\u5219\u6765\u683c\u5f0f\u5316\u4ee3\u7801\uff0c\u800c\u4e0d\u662f\u5b8c\u5168\u6309\u7167\u7528\u6237\u7684\u610f\u613f\u3002\u5728\u4e0b\u9762\u7684\u5185\u5bb9\u4e2d\uff0c\u5927\u5bb6\u4e0d\u96be\u770b\u51fa\uff0cCSharpier \u51e0\u4e4e\u6ca1\u6709\u63d0\u4f9b\u591a\u5c11\u53ef\u4ee5\u914d\u7f6e\u7684\u9009\u9879\u3002<\/p>\n<h2 id=\"\u5b89\u88c5\">\n\u5b89\u88c5\n<a href=\"#%e5%ae%89%e8%a3%85\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u5728 VS \u7684\u6269\u5c55\u4e2d\u5b89\u88c5\u4e86 CSharpier \u540e\uff0c\u91cd\u542f VS \u540e\u4f1a\u5728\u4e0a\u65b9\u63d0\u793a\u5b89\u88c5\u5de5\u5177\uff0c\u4f46\u662f\u4e5f\u53ef\u4ee5\u81ea\u884c\u5b89\u88c5\uff0c\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-shell\" data-lang=\"shell\"><span class=\"line\"><span class=\"cl\">dotnet tool install -g csharpier\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5982\u679c\u5e0c\u671b\u66f4\u65b0\uff0c\u90a3\u4e48\u53ef\u4ee5\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-shell\" data-lang=\"shell\"><span class=\"line\"><span class=\"cl\">dotnet tool update -g csharpier\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u9664\u4e86 VS\uff0cVS Code\u3001Rider \u4e2d\u4e5f\u90fd\u6709\u540c\u540d\u7684\u6269\u5c55\u3002<\/p>\n<h2 id=\"\u914d\u7f6e\">\n\u914d\u7f6e\n<a href=\"#%e9%85%8d%e7%bd%ae\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u53ef\u4ee5\u5728\u9879\u76ee\u7684\u6839\u76ee\u5f55\uff08\u901a\u5e38\u4e0e <code>.sln<\/code> \u6587\u4ef6\u4f4d\u7f6e\u76f8\u540c\uff09\u521b\u5efa\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\uff0c\u53ef\u4ee5\u662f\u4e0b\u9762\u4e09\u4e2a\u7684\u4efb\u610f\u4e00\u79cd\uff1a<\/p>\n<ul>\n<li><code>.csharpierrc<\/code><\/li>\n<li><code>.csharpierrc.json<\/code><\/li>\n<li><code>.csharpierrc.yaml<\/code><\/li>\n<\/ul>\n<p>\u652f\u6301\u7684\u914d\u7f6e\u9879\u975e\u5e38\u5c11\uff0c\u5e38\u7528\u7684\u4e00\u4e9b\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-json\" data-lang=\"json\"><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;printWidth&#34;<\/span><span class=\"p\">:<\/span> <span class=\"mi\">100<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;useTabs&#34;<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;tabWidth&#34;<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nt\">&#34;preprocessorSymbolSets&#34;<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"s2\">&#34;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&#34;DEBUG&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&#34;DEBUG,CODE_STYLE&#34;<\/span><span class=\"p\">]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u6216\u8005<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\">1\n<\/span><span class=\"lnt\">2\n<\/span><span class=\"lnt\">3\n<\/span><span class=\"lnt\">4\n<\/span><span class=\"lnt\">5\n<\/span><span class=\"lnt\">6\n<\/span><span class=\"lnt\">7\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-yaml\" data-lang=\"yaml\"><span class=\"line\"><span class=\"cl\"><span class=\"nt\">printWidth<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"m\">100<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">useTabs<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">false<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">tabWidth<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"m\">4<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"><\/span><span class=\"nt\">preprocessorSymbolSets<\/span><span class=\"p\">:<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span>- <span class=\"s2\">&#34;&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span>- <span class=\"s2\">&#34;DEBUG&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"w\"> <\/span>- <span class=\"s2\">&#34;DEBUG,CODE_STYLE&#34;<\/span><span class=\"w\">\n<\/span><\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div><p>\u5176\u4e2d\u6700\u540e\u4e00\u4e2a\u914d\u7f6e\u9879\u4e0e\u4ee3\u7801\u4e2d\u9884\u7f16\u8bd1\u5668\u6307\u4ee4\uff08\u5982 <code>#if DEBUG<\/code>\uff09\u6709\u5173\uff0c\u8be6\u89c1<a class=\"link\" href=\"https:\/\/csharpier.com\/docs\/Configuration\" target=\"_blank\" rel=\"noopener\"\n>\u5b98\u65b9\u7684\u914d\u7f6e\u6587\u6863<\/a>\u3002<\/p>\n<h2 id=\"\u5b9e\u7528\u573a\u666f\">\n\u5b9e\u7528\u573a\u666f\n<a href=\"#%e5%ae%9e%e7%94%a8%e5%9c%ba%e6%99%af\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u8fd9\u91cc\u6211\u968f\u4fbf\u5199\u4e86\u4e00\u5927\u6bb5 C# \u4ee3\u7801\uff0c\u5927\u5bb6\u53ef\u4ee5\u62f7\u8d1d\u5230\u81ea\u5df1\u5e38\u7528\u7684 C# \u5f00\u53d1\u5de5\u5177\u4e2d\uff0c\u7136\u540e\u4f7f\u7528 CSharpier \u683c\u5f0f\u5316\uff0c\u4ece\u800c\u67e5\u770b\u6548\u679c\u3002<\/p>\n<p>CSharpier \u8fd8\u63d0\u4f9b\u4e86\u4e00\u4e2a<a class=\"link\" href=\"https:\/\/playground.csharpier.com\/\" target=\"_blank\" rel=\"noopener\"\n>Playground<\/a>\uff0c\u65b9\u4fbf\u5927\u5bb6\u5728\u7ebf\u4f53\u9a8c\u5b83\u7684\u6548\u679c\u3002<\/p>\n<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\"> 1\n<\/span><span class=\"lnt\"> 2\n<\/span><span class=\"lnt\"> 3\n<\/span><span class=\"lnt\"> 4\n<\/span><span class=\"lnt\"> 5\n<\/span><span class=\"lnt\"> 6\n<\/span><span class=\"lnt\"> 7\n<\/span><span class=\"lnt\"> 8\n<\/span><span class=\"lnt\"> 9\n<\/span><span class=\"lnt\">10\n<\/span><span class=\"lnt\">11\n<\/span><span class=\"lnt\">12\n<\/span><span class=\"lnt\">13\n<\/span><span class=\"lnt\">14\n<\/span><span class=\"lnt\">15\n<\/span><span class=\"lnt\">16\n<\/span><span class=\"lnt\">17\n<\/span><span class=\"lnt\">18\n<\/span><span class=\"lnt\">19\n<\/span><span class=\"lnt\">20\n<\/span><span class=\"lnt\">21\n<\/span><span class=\"lnt\">22\n<\/span><span class=\"lnt\">23\n<\/span><span class=\"lnt\">24\n<\/span><\/code><\/pre><\/td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-csharp\" data-lang=\"csharp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">CSharpierDemo<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">allowedExtensions<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">string<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"s\">&#34;.jpg&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;.jpeg&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;.png&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;.gif&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;.bmp&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;.tiff&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;.tif&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;.webp&#34;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&#34;.heic&#34;<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span><span class=\"p\">[,]<\/span> <span class=\"n\">map<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"p\">[,]<\/span> <span class=\"p\">{<\/span> <span class=\"p\">{<\/span> <span class=\"m\">1<\/span><span class=\"p\">,<\/span> <span class=\"m\">2<\/span><span class=\"p\">,<\/span> <span class=\"m\">3<\/span> <span class=\"p\">},<\/span> <span class=\"p\">{<\/span> <span class=\"m\">4<\/span><span class=\"p\">,<\/span> <span class=\"m\">5<\/span><span class=\"p\">,<\/span> <span class=\"m\">6<\/span> <span class=\"p\">},<\/span> <span class=\"p\">{<\/span> <span class=\"m\">7<\/span><span class=\"p\">,<\/span> <span class=\"m\">8<\/span><span class=\"p\">,<\/span> <span class=\"m\">9<\/span> <span class=\"p\">}<\/span> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">DependencyProperty<\/span> <span class=\"n\">MyPropertyProperty<\/span> <span class=\"p\">=<\/span> <span class=\"n\">DependencyProperty<\/span><span class=\"p\">.<\/span><span class=\"n\">Register<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;MyProperty&#34;<\/span><span class=\"p\">,<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span><span class=\"p\">),<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"n\">MyControl<\/span><span class=\"p\">),<\/span> <span class=\"k\">new<\/span> <span class=\"n\">PropertyMetadata<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;&#34;<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [JsonIgnore]<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">MyProperty1<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [JsonIgnore]<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">MyProperty2<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"na\"> [JsonIgnore]<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">MyProperty3<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">Foo<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"n\">allowedExtensions<\/span><span class=\"p\">.<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Trim<\/span><span class=\"p\">().<\/span><span class=\"n\">ToLower<\/span><span class=\"p\">()).<\/span><span class=\"n\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">TrimLeft<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;.&#39;<\/span><span class=\"p\">)).<\/span><span class=\"n\">Where<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span> <span class=\"p\">==<\/span> <span class=\"m\">3<\/span><span class=\"p\">).<\/span><span class=\"n\">ToList<\/span><span class=\"p\">().<\/span><span class=\"n\">ForEach<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">Console<\/span><span class=\"p\">.<\/span><span class=\"n\">WriteLine<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">));<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kt\">var<\/span> <span class=\"n\">exts<\/span> <span class=\"p\">=<\/span> <span class=\"k\">from<\/span> <span class=\"n\">x<\/span> <span class=\"k\">in<\/span> <span class=\"n\">allowedExtensions<\/span> <span class=\"k\">select<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Trim<\/span><span class=\"p\">().<\/span><span class=\"n\">ToLower<\/span><span class=\"p\">()<\/span> <span class=\"k\">into<\/span> <span class=\"n\">x<\/span> <span class=\"k\">select<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">TrimLeft<\/span><span class=\"p\">(<\/span><span class=\"sc\">&#39;.&#39;<\/span><span class=\"p\">)<\/span> <span class=\"k\">into<\/span> <span class=\"n\">x<\/span> <span class=\"k\">where<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Length<\/span> <span class=\"p\">==<\/span> <span class=\"m\">3<\/span> <span class=\"k\">select<\/span> <span class=\"n\">x<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kd\">private<\/span> <span class=\"k\">void<\/span> <span class=\"n\">FooWithManyParameters<\/span><span class=\"p\">([<\/span><span class=\"n\">FromHeader<\/span><span class=\"p\">(<\/span><span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;Id&#34;<\/span><span class=\"p\">)]<\/span> <span class=\"kt\">long<\/span> <span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"n\">FromQuery<\/span><span class=\"p\">(<\/span><span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;first_name&#34;<\/span><span class=\"p\">)]<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">firstName<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"n\">FromQuery<\/span><span class=\"p\">(<\/span><span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">&#34;last_name&#34;<\/span><span class=\"p\">)]<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">lastName<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string?<\/span> <span class=\"n\">middleName<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"n\">Action<\/span><span class=\"p\">?<\/span> <span class=\"n\">callback<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"n\">Action<\/span><span class=\"p\">?<\/span> <span class=\"n\">errorCallback<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"c1\">\/\/ ...<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/td><\/tr><\/table>\n<\/div>\n<\/div>"},{"title":"\u53ef\u4ee5\u7528\u76d7\u7248\uff0c\u4f46\u662f\u8981\u6000\u7740\u6127\u759a\u7684\u5fc3","link":"https:\/\/blog.coldwind.top\/posts\/use-pirate-with-guilty\/","pubDate":"Sun, 25 Dec 2022 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/posts\/use-pirate-with-guilty\/","description":"<img src=\"https:\/\/s2.loli.net\/2024\/04\/20\/9dsCD7m1FJBQKZz.png\" alt=\"Featured image of post \u53ef\u4ee5\u7528\u76d7\u7248\uff0c\u4f46\u662f\u8981\u6000\u7740\u6127\u759a\u7684\u5fc3\" \/><p>.NET \u5f00\u53d1\u8fd9\u4e00\u9886\u57df\u6709\u4e00\u6b3e\u7279\u522b\u6709\u540d\u7684\u5c0f\u5de5\u5177\u540d\u53eb LINQPad\uff0c\u662f\u4e00\u4f4d\u56fd\u5916\u6280\u672f\u5927\u725b\u5f00\u53d1\u7684\u8f6f\u4ef6\uff0c\u80fd\u591f\u663e\u8457\u63d0\u9ad8 .NET \u5de5\u7a0b\u5e08\u7684\u6548\u7387\uff0c\u4f46\u662f\u4ef7\u683c\u4e5f\u4e00\u70b9\u4e0d\u4fbf\u5b9c\u3002\u9664\u4e86\uff08\u57fa\u672c\u4e0a\u662f\u4e2a\u534a\u6b8b\u7684\uff09\u514d\u8d39\u7248\uff0c\u8fd8\u6709\u4e13\u4e1a\u7248\u3001\u5f00\u53d1\u8005\u7248\u4ee5\u53ca\u5c0a\u4eab\u7248\uff0c\u800c\u6211\u4e70\u7684\u5c31\u662f\u6700\u8d35\u7684\u7248\u672c\uff0c$115\uff0c\u6309\u7167\u5f53\u65f6\u7684\u6c47\u7387\uff0c\u8db3\u8db3 800+ RMB\u3002\u4f46\u662f\u6211\u8ba4\u4e3a\u4e70\u5f97\u5f88\u503c\u3002\u6211\u4e00\u76f4\u5728\u7528\uff0c\u5b83\u5e2e\u4e0a\u4e86\u5927\u5fd9\uff0c\u90a3\u4e48\u6211\u89c9\u5f97\u5b83\u662f\u5b8c\u5168\u503c\u5f97\u6211\u82b1\u8fd9\u7b14\u94b1\u7684\u3002<\/p>\n<p>\u4e0d\u4ec5\u5982\u6b64\uff0c\u6211\u8fd8\u89c9\u5f97\u8fd9\u6b3e\u8f6f\u4ef6\u5728\u56fd\u5916\u975e\u5e38\u706b\u7206\uff0c\u5728\u56fd\u5185\u5374\u9c9c\u6709\u4eba\u77e5\u9053\uff0c\u6240\u4ee5\u6211\u4e13\u95e8\u5236\u4f5c\u4e86\u4e00\u671f\u89c6\u9891\u5206\u4eab\u7ed9\u4e86\u5927\u5bb6\u3002<\/p>\n<div class=\"video-wrapper\">\n<iframe src=\"https:\/\/player.bilibili.com\/player.html?as_wide=1&amp;high_quality=1&amp;page=1&bvid=BV1544y1S7j3&mute=0&autoplay=0\"\nscrolling=\"no\"\nframeborder=\"no\"\nframespacing=\"0\"\nallowfullscreen=\"true\"\n>\n<\/iframe>\n<\/div>\n<p>\u4e0d\u4e45\u4e4b\u540e\uff0c\u6211\u5c31\u770b\u5230\u4e86\u8bc4\u8bba\u533a\u8fd9\u4e48\u4e00\u6761\u5185\u5bb9\uff1a<\/p>\n<p><img src=\"https:\/\/s2.loli.net\/2024\/04\/20\/EwK7Upm6tWbOCHZ.png\"\nloading=\"lazy\"\nalt=\"\u8f6f\u4ef6\u662f\u597d\u8f6f\u4ef6\uff0c\u53ef\u60dc\u592a\u8d35\u5566\"\n><\/p>\n<p>\u8fd9\u6761\u8bc4\u8bba\u6211\u89c9\u5f97\u771f\u662f\u53c8\u597d\u6c14\u53c8\u597d\u7b11\u3002\u8fd9\u53e5\u8bdd\u5b9e\u5728\u662f\u4e0d\u5408\u903b\u8f91\uff0c\u69fd\u70b9\u592a\u591a\uff0c\u4e5f\u8ba9\u6211\u770b\u5230\u4e86\u4e00\u4e9b\u4eba\u5bf9\u4e8e\u6240\u8c13\u7684\u4ed8\u8d39\u8f6f\u4ef6\u4ee5\u53ca\u7a0b\u5e8f\u5458\u7fa4\u4f53\u6709\u7740\u600e\u6837\u7684\u8bef\u89e3\u3002<\/p>\n<h2 id=\"\u53ea\u9002\u5408\u4e13\u4e1a\u7a0b\u5e8f\u5458\">\n\u53ea\u9002\u5408\u4e13\u4e1a\u7a0b\u5e8f\u5458\uff1f\n<a href=\"#%e5%8f%aa%e9%80%82%e5%90%88%e4%b8%93%e4%b8%9a%e7%a8%8b%e5%ba%8f%e5%91%98\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u9996\u5148\u7b2c\u4e00\u6761\uff0c\u4ec0\u4e48\u53eb\u201c\u53ef\u60dc\u592a\u8d35\uff0c\u53ea\u9002\u5408\u4e13\u4e1a\u7a0b\u5e8f\u5458\u201d\uff1f\u610f\u601d\u662f\u8bf4\uff0c\u4e0d\u4e13\u4e1a\u7684\u7a0b\u5e8f\u5458\uff0c\u6216\u8005\u5b66\u751f\u515a\u4e4b\u7c7b\u7684\u5c31\u4e0d\u9002\u5408\uff1f\u8fd9\u6b3e\u8f6f\u4ef6\u867d\u7136\u6700\u9ad8\u4e00\u6863\u7684\u4ef7\u503c 800+\uff0c\u4f46\u662f\u514d\u8d39\u7248\u4e5f\u51d1\u6d3b\u7740\u80fd\u7528\u554a\uff1f\u6216\u8005\u4f60\u54ac\u54ac\u7259\uff0c\u82b1\u4e2a\u4e0d\u5230 400 \u5143\u5c31\u53ef\u4ee5\u4e70\u4e00\u4e2a\u4e13\u4e1a\u7248\u4e86\u3002\u8bb2\u9053\u7406\uff0c400 \u5757\u7b97\u591a\u5417\uff1f\u653e\u5728\u6c2a\u91d1\u624b\u6e38\u91cc\u9762\uff0c\u6015\u4e0d\u662f\u53ea\u80fd\u62bd\u51fa\u6765\u4e00\u4e9b\u5361\u6c60\u91cc\u9762\u7684\u4e50\u8272\u5427\uff1f\u6211\u73b0\u5728\u4e0a\u73ed\uff0c\u6bcf\u5929\u5149\u662f\u5750\u5730\u94c1\u5c31\u8981 10 \u5143\uff0c\u4e00\u4e2a\u6708\u5c31\u662f 200 \u591a\uff1b\u6bcf\u5929\u4e09\u9910\u8981\u82b1\u4e09\u56db\u5341\uff0c\u4e00\u4e2a\u6708\u5c31\u8981 1000 \u5757\uff1b\u8fd9\u5e74\u5934\u624b\u673a\u7684\u8bdd\u8d39\uff0c\u4e00\u5e74\u600e\u4e48\u7740\u4e0d\u5f97 400+\uff1f\u4e3a\u4ec0\u4e48\u8fd9\u4e9b\u90fd\u50cf\u662f\u4e60\u4ee5\u4e3a\u5e38\u7684\u4e1c\u897f\uff0c\u773c\u524d\u7684\u4e00\u6b3e\u4e70\u65ad\u5236\u7684\u8f6f\u4ef6\u4f60\u5374\u4e0b\u4e0d\u4e86\u624b\u4e86\uff1f<\/p>\n<p>\u66f4\u91cd\u8981\u7684\u662f\uff0c\u4e70\u4e86\u8fd9\u6b3e\u8f6f\u4ef6\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u4f60\u4e0d\u8bf4\u4e00\u8f88\u5b50\u4e86\uff0c\u6700\u8d77\u7801\u5728\u63a5\u4e0b\u6765\u51e0\u5e74\u7684\u5b66\u4e60\u5de5\u4f5c\u751f\u6daf\u7684\u9ec4\u91d1\u671f\u91cc\u52a9\u4f60\u4e00\u81c2\u4e4b\u529b\uff0c\u5927\u5e45\u63d0\u9ad8\u5de5\u4f5c\u5b66\u4e60\u7684\u6548\u7387\uff0c\u660e\u663e\u53d1\u6325\u51fa\u8f6f\u4ef6\u81ea\u8eab\u7684\u4ef7\u503c\uff0c\u96be\u9053\u4e0d\u6bd4\u4f60\u4e70\u4e00\u4e2a\u6c2a\u4e2a\u4ec0\u4e48 328\u3001648 \u8981\u6709\u610f\u4e49\u5f97\u591a\uff1f<\/p>\n<h2 id=\"\u7a0b\u5e8f\u5458\u4e0d\u5728\u4e4e\u8fd9\u70b9\u94b1\">\n\u7a0b\u5e8f\u5458\u4e0d\u5728\u4e4e\u8fd9\u70b9\u94b1\uff1f\n<a href=\"#%e7%a8%8b%e5%ba%8f%e5%91%98%e4%b8%8d%e5%9c%a8%e4%b9%8e%e8%bf%99%e7%82%b9%e9%92%b1\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u7b2c\u4e8c\u6761\uff0c\u4ec0\u4e48\u53eb\u201c\u7a0b\u5e8f\u5458\u4e0d\u5728\u4e4e\u8fd9\u70b9\u94b1\u201d\uff1f\u610f\u601d\u662f\u8bf4\u7a0b\u5e8f\u5458\u90fd\u662f\u9ad8\u85aa\u884c\u4e1a\u7684\u4eba\u624d\uff0c\u4e00\u4e2a\u4e2a\u6708\u5165\u597d\u51e0\u4e07\uff0c\u6839\u672c\u4e0d\u4f1a\u5728\u4e4e\u8fd9\u4e48\u4e00\u4e01\u70b9\u94b1\uff1f\u4e0d\u597d\u610f\u601d\uff0c\u4f60\u53c8\u9519\u4e86\u3002\u9996\u5148\uff0c\u7a0b\u5e8f\u5458\u5c31\u4e0d\u662f\u4f60\u60f3\u8c61\u4e2d\u7684\u8fd9\u4e48\u9ad8\u85aa\u3002\u6216\u8bb8\u80fd\u6708\u5165\u4e2a\u4e00\u4e07\u591a\uff0c\u4f46\u662f\u5927\u90fd\u662f\u5728\u5317\u4e0a\u5e7f\u6df1\u8fd9\u4e9b\u5730\u65b9\uff0c\u6bcf\u6708\u5149\u662f\u623f\u79df\u5c31\u8981\u82b1\u4e2a\u597d\u51e0\u5343\uff0c\u6700\u540e\u7b97\u4e0b\u6765\u4e5f\u4e0d\u5269\u591a\u5c11\u4e86\u3002\u5c31\u8fd9\u8fd8\u662f\u62ff\u8eab\u4f53\u6362\u6765\u7684\uff0c\u4e00\u4e2a\u4e2a\u5e74\u7eaa\u8f7b\u8f7b\u5730\u5c31\u773c\u775b\u4e5f\u4e0d\u597d\u4e86\uff0c\u9888\u690e\u8170\u690e\u4e5f\u4e0d\u597d\u4e86\uff0c\u624b\u8155\u4e5f\u4e0d\u597d\u4e86\uff0c\u5934\u53d1\u4e5f\u4e0d\u5269\u591a\u5c11\u4e86\u3002\u6240\u4ee5\u7a0b\u5e8f\u5458\u4e5f\u4e0d\u89c1\u5f97\u5c31\u4e0d\u5728\u4e4e\u8fd9\u70b9\u94b1\u7684\u3002<\/p>\n<p>\u8fd9\u79cd\u8bf4\u7684\u8fd8\u662f\u5355\u8eab\u7684\u6ca1\u6709\u68a6\u60f3\u6210\u4e3a\u54b8\u9c7c\u7684\u7a0b\u5e8f\u5458\u3002\u5982\u679c\u60f3\u7ed3\u5a5a\u751f\u5b50\uff0c\u60f3\u4e70\u623f\u4e70\u8f66\uff0c\u60f3\u63d0\u5347\u81ea\u5df1\uff0c\u7ed9\u81ea\u5df1\u4e70\u4e2a\u7f51\u8bfe\u3001\u5065\u8eab\u623f\u4f1a\u5458\u5361\u4ec0\u4e48\u7684\uff0c\u90a3\u66f4\u662f\u5f00\u652f\u5927\u4e86\u53bb\u4e86\u3002\u4f60\u6708\u5165 40K \u53c8\u5982\u4f55\uff1f\u8bf4\u4e0d\u5b9a\u6708\u4f9b\u5c31\u4e24\u4e09\u4e07\u3002\u6240\u4ee5\u4e13\u4e1a\u7a0b\u5e8f\u5458\u5c31\u4e0d\u5dee\u94b1\u4e86\uff1f\u771f\u662f\u60f3\u592a\u591a\u4e86\u3002<\/p>\n<h2 id=\"\u4e0d\u5dee\u94b1\u7684\u7a0b\u5e8f\u5458\u5c31\u4f1a\u613f\u610f\u638f\u94b1\">\n\u4e0d\u5dee\u94b1\u7684\u7a0b\u5e8f\u5458\u5c31\u4f1a\u613f\u610f\u638f\u94b1\uff1f\n<a href=\"#%e4%b8%8d%e5%b7%ae%e9%92%b1%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%91%98%e5%b0%b1%e4%bc%9a%e6%84%bf%e6%84%8f%e6%8e%8f%e9%92%b1\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u518d\u7136\u540e\uff0c\u201c\u4ed6\u4eec\u4e0d\u5dee\u8fd9\u70b9\u94b1\u201d\uff0c\u6240\u4ee5\u4ed6\u4eec\u5c31\u201c\u9002\u5408\u4e70\u8fd9\u6b3e\u8f6f\u4ef6\u4e86\u201d\uff1f\u4e0d\u597d\u610f\u601d\uff0c\u6211\u8eab\u8fb9\u201c\u5728\u4e4e\u8fd9\u70b9\u94b1\u201d\u7684\u7a0b\u5e8f\u5458\u591a\u4e86\u53bb\u4e86\u3002\u6211\u8ba4\u8bc6\u4e00\u4f4d\u7a0b\u5e8f\u5458\uff0c\u6bcf\u5468\u5de5\u4f5c\u65e5\u81f3\u5c11\u559d\u4e09\u56db\u676f\u56fd\u5185\u67d0\u77e5\u540d\u8fde\u9501\u5e97\u94fa\u7684\u5976\u8336\uff0c\u6bcf\u676f\u6309 18 \u5757\u7b97\uff0c\u4e00\u4e2a\u6708\u6700\u5c11\u4e5f\u8981 200 \u591a\u5757\u4e86\u3002\u4f46\u662f\u54a7\uff0c\u4eba\u5bb6\u8fde Office \u7528\u7684\u90fd\u662f\u76d7\u7248\u7684 2010\uff0c\u6574\u5929\u6807\u9898\u680f\u90fd\u662f\u5927\u7ea2\u8272\u7684\uff0c\u8fde\u4e2a\u4eac\u4e1c\u6dd8\u5b9d\u4e0a\u641e\u6d3b\u52a8 200 \u591a\u5757\u7684\u6b63\u7248 Office 365\uff08\u540e\u6765\u6539\u540d\u53eb Microsoft 365 \u4e86\uff09\u90fd\u820d\u4e0d\u5f97\u4e70\uff0c\u5373\u4fbf\u4eba\u5bb6\u6bcf\u5929\u5230\u624b\u7684\u5de5\u8d44\u90fd\u591f\u4e70\u539f\u4ef7\u7684 365 \u4e86\u3002\u8fd9\u79cd\u4eba\u6709\u53ef\u80fd\u4f1a\u613f\u610f\u82b1\u597d\u51e0\u767e\u4e70\u4e00\u6b3e\u6ca1\u6709\u4efb\u4f55\u5f00\u53d1\u529f\u80fd\uff0c\u53ea\u662f\u65b9\u4fbf\u81ea\u5df1\u5de5\u4f5c\u5b66\u4e60\u7684\u5c0f\u8f6f\u4ef6\uff1f<\/p>\n<p>\u6211\u8eab\u8fb9\u8fd9\u6837\u7684\u7a0b\u5e8f\u5458\u771f\u7684\u662f\u4e0d\u5c11\u3002\u6211\u63a8\u8350\u4ed6\u4eec\u7528 XMind\uff0c\u660e\u660e\u8fd9\u73a9\u610f\u6709\u514d\u8d39\u7684\u8bd5\u7528\u7248\uff0c\u4f46\u662f\u4ed6\u4eec\u5c31\u662f\u559c\u6b22\u4e00\u4e0a\u53bb\u5c31\u5728\u767e\u5ea6\u641c\u7d22\u7834\u89e3\u7248\uff0c\u6700\u540e\u4e0b\u4e86\u4e2a\u76d7\u7248\u7684 XMind 8\uff1b\u5f00\u53d1\u8f6f\u4ef6\u7528\u7684 IDE\uff0c\u76f4\u63a5\u53bb\u641c\u4e2a\u7834\u89e3\u7248 JetBrains \u7cfb\u5217\u7684\uff0c\u90fd\u4e0d\u77e5\u9053\u6709\u514d\u8d39\u7684 Visual Studio \u793e\u533a\u7248\u4ee5\u53ca Visual Studio Code \u53ef\u4ee5\u7528\u7684\uff1biPad \u4e0a\u770b PDF \u8bb0\u4e2a\u7b14\u8bb0\u6216\u8005\u753b\u4e2a\u753b\uff0c\u8fde\u4e2a\u00a0Notability\u00a0\u6216\u8005 Procreate \u90fd\u820d\u4e0d\u5f97\u4e70\uff0c\u975e\u5f97\u53bb\u627e\u4e2a\u591a\u4eba\u5171\u7528\u7684\u82f9\u679c\u8d26\u53f7\u7528\u201c\u5206\u4eab\u7248\u201d\u7684\uff0c\u4e0d\u77e5\u9053\u54ea\u5929 APP \u5c31\u4e0d\u80fd\u66f4\u65b0\u4e86\u3002\u90a3\u6211\u8981\u662f\u63a8\u8350\u4ed6\u4eec\u53bb\u7528 LINQPad\uff0c\u4e0d\u7528\u8bf4\uff0c\u80af\u5b9a\u53bb\u627e\u76d7\u7248\u4e86\uff0c\u660e\u660e\u8fd8\u6709\u4e00\u4e2a\u514d\u8d39\u7684\u5e73\u66ff RoslynPad\u3002<\/p>\n<p>\u6240\u4ee5\u6211\u60f3\u8bf4\u7684\u662f\uff0c\u5e76\u4e0d\u662f\u6240\u6709\u7a0b\u5e8f\u5458\u90fd\u4e0d\u89c9\u5f97\u8fd9\u7b14\u94b1\u4e0d\u662f\u94b1\uff0c\u4e5f\u5e76\u4e0d\u662f\u6240\u6709\u7a0b\u5e8f\u5458\u5728\u4e70\u5f97\u8d77\u8fd9\u6b3e\u8f6f\u4ef6\u7684\u60c5\u51b5\u4e0b\u5c31\u4f1a\u613f\u610f\u638f\u94b1\u3002\u9000\u4e00\u6b65\u8bf4\uff0c\u5c31\u7b97\u662f\u820d\u4e0d\u5f97\u4e70\u6b63\u7248\uff0c\u4e5f\u4e0d\u4ee3\u8868\u4f60\u5c31\u8981\u53bb\u7528\u76d7\u7248\u554a\uff1f\u6211\u4e70\u4e0d\u8d77\u6b63\u7248 PS\uff0c\u4f46\u6211\u4e70\u5f97\u8d77 Affinity Photo\uff1b\u6211\u4e70\u4e0d\u8d77 PR\uff0c\u4f46\u6211\u53ef\u4ee5\u7528\u514d\u8d39\u7684 DaVinci\uff1b\u4e70\u4e0d\u8d77 Office\uff0c\u4f46\u8fd8\u53ef\u4ee5\u7528 WPS\uff08\u5982\u679c\u4f60\u80fd\u63a5\u53d7\u5e7f\u544a\u4ec0\u4e48\u7684\uff09\u6216\u8005 LibreOffice\uff1b\u4e70\u4e0d\u8d77 LINQPad\uff0c\u90a3\u8fd8\u53ef\u4ee5\u7528\u5e73\u66ff\u7684 RoslynPad\uff0c\u6216\u8005\u4e0d\u7136\u5c31\u5728 VS \u91cc\u9762\u65b0\u5efa\u4e00\u4e2a Console App \u5457\u3002<\/p>\n<h2 id=\"\u5230\u5e95\u4ec0\u4e48\u6837\u7684\u4eba\u9002\u5408\u8fd9\u6b3e\u8f6f\u4ef6\">\n\u5230\u5e95\u4ec0\u4e48\u6837\u7684\u4eba\u9002\u5408\u8fd9\u6b3e\u8f6f\u4ef6\uff1f\n<a href=\"#%e5%88%b0%e5%ba%95%e4%bb%80%e4%b9%88%e6%a0%b7%e7%9a%84%e4%ba%ba%e9%80%82%e5%90%88%e8%bf%99%e6%ac%be%e8%bd%af%e4%bb%b6\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u90a3\u5230\u5e95\u4ec0\u4e48\u6837\u7684\u4eba\u624d\u9002\u5408\u8fd9\u6b3e\u8f6f\u4ef6\u5462\uff1f\u6211\u5f00\u5934\u5c31\u5df2\u7ecf\u8bf4\u4e86\uff0c\u8fd9\u6b3e\u8f6f\u4ef6\u53ef\u4ee5\u5e2e\u5230\u8fd9\u4e2a\u884c\u4e1a\u7684\u6240\u6709\u4eba\u7fa4\uff0c\u4e0d\u8bba\u4f60\u7684\u6280\u672f\u662f\u5f3a\u8fd8\u662f\u5f31\uff0c\u4f60\u7684\u94b1\u5305\u662f\u9f13\u8fd8\u662f\u762a\u3002\u53ea\u8981\u4f60\u6709\u7740\u4e00\u9897\u60f3\u8981\u63d0\u5347\u81ea\u5df1\u7684\u5fc3\uff0c\u4ee5\u53ca\u5bf9\u6b63\u7248\u4f18\u8d28\u8f6f\u4ef6\u7684\u8ba4\u53ef\uff0c\u90a3\u4e48\u6211\u90fd\u8ba4\u4e3a\u4f60\u53ef\u4ee5\u53bb\u4e70\u8fd9\u6b3e\u8f6f\u4ef6\u3002<\/p>\n<p>\u800c\u8fd9\u6837\u7684\u4eba\u6050\u6015\u5e76\u4e0d\u662f\u5f88\u591a\u3002\u6709\u7684\u56fe\u50cf\u5de5\u4f5c\u8005\uff0c\u5df2\u7ecf\u4f9d\u9760\u4fee\u56fe\u6323\u4e86\u5f88\u591a\u94b1\uff0c\u5374\u4e0d\u613f\u4e70\u6b63\u7248\u7684 PS\uff1b\u6709\u7684\u97f3\u4e50\u5de5\u4f5c\u8005\uff0c\u4f9d\u9760\u7f16\u66f2\u5df2\u7ecf\u8db3\u591f\u517b\u5bb6\u7cca\u53e3\uff0c\u4f46\u4f9d\u65e7\u4e0d\u613f\u610f\u4e70\u4e2a\u6b63\u7248 FL\uff1b\u6709\u7684\u7a0b\u5e8f\u5458\uff0c\u5df2\u7ecf\u4f9d\u9760\u5199\u4ee3\u7801\u6323\u4e86\u8fd9\u4e48\u591a\u94b1\uff0c\u5374\u4f9d\u65e7\u4e0d\u613f\u610f\u4e3a\u4ed6\u4eec\u4f7f\u7528\u7684\u8f6f\u4ef6\u4ed8\u4e2a\u8d39\uff0c\u51e1\u4e8b\u603b\u662f\u60f3\u7740\u53bb\u641c\u7d22\u7834\u89e3\u7248\uff0c\u751a\u81f3\u4e0d\u4ee5\u4e3a\u803b\uff0c\u53cd\u800c\u89c9\u5f97\u5360\u5230\u4e86\u591a\u5927\u7684\u4fbf\u5b9c\u3002\u5f53\u7136\u8fd8\u6709\u4e9b\u8822\u8d27\u89c9\u5f97\u8fd9\u90fd\u662f\u5916\u56fd\u8f6f\u4ef6\uff0c\u8ddf\u5883\u5916\u52bf\u529b\u6709\u4ec0\u4e48\u597d\u5ba2\u6c14\u7684\uff0c\u6216\u8005\u201c\u6148\u79a7\u592a\u540e\u5f53\u5e74\u90fd\u628a\u94b1\u7ed9\u638f\u8fc7\u4e86\u201d\u4e4b\u7c7b\uff0c\u90a3\u6211\u771f\u662f\u65e0 f*ck \u8bf4\u3002<\/p>\n<p>\u66fe\u7ecf\u6709\u4e00\u4e2a\u540c\u4e8b\u5f97\u77e5\u6211\u7528\u7684\u662f\u6bcf\u5e74\u82b1\u8d39\u597d\u51e0\u767e\u7684\u6b63\u7248 Office \u8ba2\u9605\uff0c\u89c9\u5f97\u4e0d\u4ee5\u4e3a\u7136\uff0c\u8bf4\u81ea\u5df1\u7528\u7684\u662f\u7834\u89e3\u7248\uff0c\u4e0d\u7167\u6837\u53ef\u4ee5\u7528\u5417\uff0c\u8fd8\u7701\u4e0b\u4e86\u4e0d\u5c11\u94b1\u3002\u6211\u6ca1\u6709\u56de\u7b54\u4ed6\uff0c\u4f46\u662f\u6211\u6709\u4e00\u53e5\u5dee\u70b9\u5230\u5634\u8fb9\u4e86\u7684\u8bdd\u88ab\u6211\u7ed9\u54bd\u4e86\u56de\u53bb\uff1a\u8bf7\u95ee\u4f60\u6bcf\u5e74\u6bd4\u6211\u7701\u4e0b\u4e86\u597d\u51e0\u767e\uff0c\u90a3\u4e48\u4f60\u6bd4\u6211\u591a\u5f97\u5230\u4e86\u4ec0\u4e48\u5462\uff1f<\/p>\n<h2 id=\"\u5230\u5e95\u80fd\u4e0d\u80fd\u7528\u76d7\u7248\u8f6f\u4ef6\">\n\u5230\u5e95\u80fd\u4e0d\u80fd\u7528\u76d7\u7248\u8f6f\u4ef6\uff1f\u00a0\n<a href=\"#%e5%88%b0%e5%ba%95%e8%83%bd%e4%b8%8d%e8%83%bd%e7%94%a8%e7%9b%97%e7%89%88%e8%bd%af%e4%bb%b6\" class=\"anchor\">&para;<\/a>\n<\/h2><p>\u6700\u540e\uff0c\u6211\u60f3\u804a\u7684\u662f\uff0c\u76d7\u7248\u8f6f\u4ef6\u5230\u5e95\u80fd\u4e0d\u80fd\u7528\uff1f\u6211\u8ba4\u4e3a\u53ef\u4ee5\u7528\uff0c\u4f46\u662f\u8981\u65f6\u523b\u77e5\u9053\u8fd9\u6837\u505a\u662f\u4e0d\u5bf9\u7684\u3002Minecraft\u300a\u6211\u7684\u4e16\u754c\u300b\uff08\u4ee5\u4e0b\u7b80\u79f0 MC\uff09\u662f\u4e00\u6b3e\u5168\u7403\u77e5\u540d\u7684\u6c99\u76d2\u7c7b\u6e38\u620f\uff0c\u4f46\u662f\u6b63\u7248\u662f\u8981\u94b1\u7684\u3002\u6709\u4e00\u4f4d\u5b66\u751f\u5199\u4fe1\u7ed9 MC \u7684\u521b\u59cb\u4eba Notch \u8bf4\uff0c\u81ea\u5df1\u60f3\u73a9 MC\uff0c\u4f46\u662f\u6ca1\u6709\u8db3\u591f\u7684\u94b1\uff0c\u95ee\u80fd\u4e0d\u80fd\u73a9\u76d7\u7248\u7684\uff1fNotch \u7b11\u7740\u56de\u7b54\u8bf4\uff0c\u53ef\u4ee5\u73a9\uff0c\u4f46\u662f\u8981\u6000\u7740\u6127\u759a\u7684\u5fc3\u3002<\/p>\n<p><img src=\"https:\/\/s2.loli.net\/2024\/04\/20\/9dsCD7m1FJBQKZz.png\"\nloading=\"lazy\"\nalt=\"dont forget to feel bad. ;)\"\n><\/p>\n<p>\u4f60\u5982\u679c\u5bf9\u8fd9\u6b3e\u8f6f\u4ef6\u5b9e\u9645\u7684\u6548\u679c\u4e0d\u591f\u653e\u5fc3\uff0c\u90a3\u4f60\u5927\u53ef\u4ee5\u53bb\u627e\u4e00\u4e2a\u7834\u89e3\u7248\uff0c\u7136\u540e\u7528\u4e0a\u4e00\u6bb5\u65f6\u95f4\uff08\u867d\u7136\u5b83\u672c\u8eab\u4e5f\u63d0\u4f9b\u4e86 30 \u5929\u65e0\u6761\u4ef6\u9000\u6b3e\uff09\u3002\u5982\u679c\u4f60\u89c9\u5f97\u8fd9\u4e2a\u8f6f\u4ef6\u4e0d\u884c\uff0c\u90a3\u4f60\u53ef\u4ee5\u4e0d\u53bb\u7528\u5b83\uff1b\u5982\u679c\u4f60\u89c9\u5f97\u8fd9\u6b3e\u8f6f\u4ef6\u4e0d\u9519\uff0c\u90a3\u4f60\u53ef\u4ee5\u9009\u62e9\u4ed8\u8d39\uff1b\u4f46\u662f\u4f60\u4e0d\u80fd\u5c31\u8fd9\u4e48\u4e00\u76f4\u7528\u7740\u76d7\u7248\u3002\u7528\u4e00\u6bb5\u65f6\u95f4\u7684\u76d7\u7248\u4e4b\u540e\uff0c\u5982\u679c\u89c9\u5f97\u8f6f\u4ef6\u786e\u5b9e\u5f88\u597d\uff0c\u90a3\u4e48\u6211\u76f8\u4fe1\uff0c\u5584\u826f\u6b63\u76f4\u7684\u4f60\uff0c\u4f1a\u9009\u62e9\u4e3a\u8fd9\u6b3e\u4f18\u79c0\u7684\u8f6f\u4ef6\u8865\u7968\u7684\u3002<\/p>\n<p><img src=\"https:\/\/s2.loli.net\/2024\/04\/20\/oPbWSFTZ4DMquBI.png\"\nloading=\"lazy\"\nalt=\"\u8bc4\u8bba\u533a\u7684\u201c\u5df2\u4e0b\u5230\u7834\u89e3\u7248\u201d\"\n><\/p>\n<p>\u8fd9\u4e5f\u6b63\u662f\u6211\u5bf9\u90a3\u4e9b\u4f7f\u7528\u7834\u89e3\u7248\u8f6f\u4ef6\u7684\u4eba\u7684\u5efa\u8bae\u3002<\/p>"},{"title":"\u5f52\u6863","link":"https:\/\/blog.coldwind.top\/archives\/","pubDate":"Sun, 06 Mar 2022 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/archives\/","description":{}},{"title":"\u5173\u4e8e\u6211","link":"https:\/\/blog.coldwind.top\/about\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/about\/","description":"<p>\u6211\u662f\u4e00\u540d .NET \u8f6f\u4ef6\u5f00\u53d1\u5de5\u7a0b\u5e08\uff0c\u559c\u6b22\u5b66\u4e60\u53ca\u5206\u4eab\u7f16\u7a0b\u6280\u672f\u3002\u4f60\u53ef\u4ee5\u5728 B \u7ad9\u627e\u5230\u6211\uff1a<a class=\"link\" href=\"https:\/\/space.bilibili.com\/600592\" target=\"_blank\" rel=\"noopener\"\n>@\u5341\u6708\u7684\u5bd2\u6d41<\/a>\u3002<\/p>\n<p>\u6211\u73b0\u5728\u5728\u5b66\u4e60\u7684\u6280\u672f\u6709\uff1a<\/p>\n<ul>\n<li>Avalonia UI<\/li>\n<li>Blazor<\/li>\n<li>PostgreSQL<\/li>\n<li>Go<\/li>\n<li>\u2026\u2026<\/li>\n<\/ul>\n<p>\u5e73\u65f6\u7684\u6211\u559c\u6b22\u5b66\u4e60\u8bed\u8a00\uff08English\u3001\u65e5\u672c\u8a9e\uff09\uff0c\u5439\u5439\u534a\u97f3\u9636\u53e3\u7434\uff0c\u73a9\u4e00\u4e9b\u5355\u673a\u6e38\u620f\uff0c\u5076\u5c14\u53ef\u80fd\u8fd8\u4f1a\u53d1\u70b9<a href=\"https:\/\/yunwuyue.xyz\" target=\"_blank\">\u7262\u9a9a<\/a>\u3002\u5b66\u4e60\u8bed\u8a00\u4e4b\u4f59\uff0c\u6709\u65f6\u6211\u8fd8\u4f1a\u7ffb\u8bd1\u4e00\u4e9b\u5916\u8bed\u5185\u5bb9\uff0c\u548c\u5927\u5bb6\u5206\u4eab\u4e00\u4e9b\u6709\u8da3\u7684\u4e1c\u897f\u3002<\/p>\n<p>\u5982\u679c\u4f60\u60f3\u8054\u7cfb\u6211\uff0c\u53ef\u4ee5\u53d1\u9001\u90ae\u4ef6\u5230\uff1a<a class=\"link\" href=\"mailto:albedo.shade@proton.me\" >albedo.shade@proton.me<\/a><\/p>\n<p>\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u672c\u535a\u5ba2\u4efb\u610f\u8bc4\u8bba\u533a\u7559\u8a00\uff0c\u6216\u8005\u5728 B \u7ad9\u89c6\u9891\u8bc4\u8bba\u533a\u7559\u8a00\u4ee5\u53ca\u79c1\u4fe1\u6211\u3002<\/p>"},{"title":"\u641c\u7d22","link":"https:\/\/blog.coldwind.top\/search\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/blog.coldwind.top\/search\/","description":{}}]}}