XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEExtension

重构与现代化:优化流处理与代码简洁性

重构多处代码以提升现代性和可读性,包括: - 使用 `await using` 优化异步流资源释放 - `ToString`/`Enum.Parse` 等方法更符合当前区域和类型安全 - 用 `Aggregate` 简化 List 扩展方法 - 移除未用字段,简化属性定义 - 增强流操作的取消支持和资源释放逻辑 整体提升了健壮性、性能和维护性。

b995ef4
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

6 个文件 +34 -62
Modified XFEExtension.NetCore/CyberComm/XCCNetWork/XCCMessage.cs +5 -6
@@ -1,4 +1,5 @@
1 using XFEExtension.NetCore.ArrayExtension;
1 using System.Globalization;
2 using XFEExtension.NetCore.ArrayExtension;
2 3
3 4 namespace XFEExtension.NetCore.CyberComm.XCCNetWork;
4 5
@@ -44,10 +45,8 @@ public class XCCMessage(string messageId, XCCTextMessageType messageType, string
44 45 /// 封装为字符串
45 46 /// </summary>
46 47 /// <returns></returns>
47 public override string ToString()
48 {
49 return new[] { MessageId, MessageType.ToString(), Message, Sender, SendTime.ToString() }.ToXFEString();
50 }
48 public override string ToString() => new[] { MessageId, MessageType.ToString(), Message, Sender, SendTime.ToString(CultureInfo.CurrentCulture) }.ToXFEString();
49
51 50 /// <summary>
52 51 /// 将封装后的XCC消息字符串转换为XCC消息对象
53 52 /// </summary>
@@ -57,6 +56,6 @@ public class XCCMessage(string messageId, XCCTextMessageType messageType, string
57 56 public static XCCMessage ConvertToXCCMessage(string xCCMessageStringFormat, string groupId)
58 57 {
59 58 var unPackedMessage = xCCMessageStringFormat.ToXFEArray<string>();
60 return new XCCMessage(unPackedMessage[0], (XCCTextMessageType)Enum.Parse(typeof(XCCTextMessageType), unPackedMessage[1]), unPackedMessage[2], unPackedMessage[3], DateTime.Parse(unPackedMessage[4]), groupId);
59 return new XCCMessage(unPackedMessage[0], Enum.Parse<XCCTextMessageType>(unPackedMessage[1]), unPackedMessage[2], unPackedMessage[3], DateTime.Parse(unPackedMessage[4]), groupId);
61 60 }
62 61 }
Modified XFEExtension.NetCore/FileExtension/XFEPackage/XFEPackage.cs +1 -2
@@ -68,9 +68,8 @@ public static class XFEPackage
68 68 internal static XFEPackagedDirectory GetFilePackage(byte[] filePackageBytes)
69 69 {
70 70 var buffer = XFEBuffer.ToXFEBuffer(filePackageBytes);
71 if (buffer.FirstOrDefault() is KeyValuePair<string, byte[]> keyValuePair)
71 if (buffer.FirstOrDefault() is var keyValuePair)
72 72 return GetFilePackageRecursion(keyValuePair.Key, keyValuePair.Value);
73 return new XFEPackagedDirectory();
74 73 }
75 74
76 75 internal static XFEPackagedDirectory GetFilePackageRecursion(string packageName, byte[] filePackageBytes)
Modified XFEExtension.NetCore/FormatExtension/XFEMultiDictionary.cs +1 -1
@@ -148,7 +148,7 @@ public class XFEMultiDictionary : ICollection<XFEEntry>
148 148 public List<string> GetContents(string header)
149 149 {
150 150 var list = new List<string>();
151 _xFEMultiDictionaryList.FindAll(x => x.Header == header)?.ForEach(y => list.Add(y.Content));
151 _xFEMultiDictionaryList.FindAll(x => x.Header == header).ForEach(y => list.Add(y.Content));
152 152 return list;
153 153 }
154 154 /// <summary>
Modified XFEExtension.NetCore/ListExtension/ListExtension.cs +5 -21
@@ -11,16 +11,8 @@ public static class ListExtension
11 11 /// <typeparam name="T"></typeparam>
12 12 /// <param name="list"></param>
13 13 /// <returns></returns>
14 public static string ToXFEString<T>(this List<T> list)
15 {
16 var str = string.Empty;
17 foreach (var ary in list)
18 {
19 if (ary is not null)
20 str += $"[+-{ary.ToString()?.Replace("[+", "[++").Replace("+]", "++]")}-+]";
21 }
22 return str;
23 }
14 public static string ToXFEString<T>(this List<T> list) => list.Aggregate(string.Empty, (current, ary) => current + $"[+-{ary?.ToString()?.Replace("[+", "[++").Replace("+]", "++]")}-+]");
15
24 16 /// <summary>
25 17 /// 将List列表转换为XFE格式字符串
26 18 /// </summary>
@@ -28,16 +20,8 @@ public static class ListExtension
28 20 /// <param name="list"></param>
29 21 /// <param name="propertyName">属性名称</param>
30 22 /// <returns></returns>
31 public static string ToXFEString<T>(this List<T> list, string propertyName) where T : class
32 {
33 var str = string.Empty;
34 foreach (var ary in list)
35 {
36 if (ary is not null)
37 str += $"[+-{ary.GetType().GetProperty(propertyName)?.GetValue(ary)?.ToString()?.Replace("[+", "[++").Replace("+]", "++]")}-+]";
38 }
39 return str;
40 }
23 public static string ToXFEString<T>(this List<T> list, string propertyName) where T : class => list.Aggregate(string.Empty, (current, ary) => current + $"[+-{ary.GetType().GetProperty(propertyName)?.GetValue(ary)?.ToString()?.Replace("[+", "[++").Replace("+]", "++]")}-+]");
24
41 25 /// <summary>
42 26 /// 将XFE格式字符串转换为List列表
43 27 /// </summary>
@@ -46,7 +30,7 @@ public static class ListExtension
46 30 /// <returns>T类型的List列表</returns>
47 31 public static List<T> ToXFEList<T>(this string str)
48 32 {
49 var strings = str.Split(new[] { "[+-", "-+]" }, StringSplitOptions.RemoveEmptyEntries);
33 var strings = str.Split(["[+-", "-+]"], StringSplitOptions.RemoveEmptyEntries);
50 34 var list = new List<T>();
51 35 for (var j = 1; j < strings.Length - 1; j += 2)
52 36 {
Modified XFEExtension.NetCore/ReflectionExtension/ReflectionExtension.cs +1 -1
@@ -15,7 +15,7 @@ public static class ReflectionExtension
15 15 public static object?[] GetDefaultParameters(this MethodInfo method)
16 16 {
17 17 var parameters = method.GetParameters();
18 var defaultParameters = new object[parameters.Length];
18 var defaultParameters = new object?[parameters.Length];
19 19 for (var i = 0; i < parameters.Length; i++)
20 20 {
21 21 var paramType = parameters[i].ParameterType;
Modified XFEExtension.NetCore/WebExtension/XFEDownloader.cs +21 -31
@@ -14,7 +14,6 @@ public class XFEDownloader : IDisposable
14 14 private bool _disposedValue;
15 15 private readonly List<HttpClient> _httpClientList = [];
16 16 private HttpResponseMessage? _responseMessage;
17 private readonly List<HttpResponseMessage> _httpResponseMessages = [];
18 17 private readonly List<Task> _downloadTasks = [];
19 18 /// <summary>
20 19 /// 字节下载事件
@@ -36,15 +35,11 @@ public class XFEDownloader : IDisposable
36 35 /// 已下载
37 36 /// </summary>
38 37 public bool Downloaded { get; private set; }
39 private bool _isPaused;
38
40 39 /// <summary>
41 40 /// 暂停
42 41 /// </summary>
43 public bool IsPaused
44 {
45 get { return _isPaused; }
46 set { _isPaused = value; }
47 }
42 public bool IsPaused { get; set; }
48 43
49 44 /// <summary>
50 45 /// 开始下载
@@ -58,7 +53,7 @@ public class XFEDownloader : IDisposable
58 53 var getInfoClient = new HttpClient();
59 54 _responseMessage ??= await GetHttpResponseMessage(getInfoClient, CancellationToken.None);
60 55 var totalFileSize = _responseMessage.Content.Headers.ContentLength;
61 using var createFileStream = new FileStream(SavePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite, 8192, true);
56 await using var createFileStream = new FileStream(SavePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite, 8192, true);
62 57 if (totalFileSize is not null)
63 58 createFileStream.SetLength(totalFileSize.Value);
64 59 for (var i = 0; i < FileSegmentCount; i++)
@@ -66,7 +61,7 @@ public class XFEDownloader : IDisposable
66 61 var currentSegment = i;
67 62 _downloadTasks.Add(Task.Run(async () =>
68 63 {
69 using var fileStream = new FileStream(SavePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 8192, true);
64 await using var fileStream = new FileStream(SavePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 8192, true);
70 65 var currentSegmentTotalBufferSize = fileStream.Length / FileSegmentCount;
71 66 var endPosition = currentSegment == FileSegmentCount - 1 ? fileStream.Length : currentSegmentTotalBufferSize * (currentSegment + 1);
72 67 var startBufferIndex = currentSegmentTotalBufferSize * currentSegment;
@@ -80,17 +75,17 @@ public class XFEDownloader : IDisposable
80 75 totalRead += currentSegmentDownloadedBuffeSize;
81 76 var cancellationTokenSource = new CancellationTokenSource();
82 77 var cancellationToken = cancellationTokenSource.Token;
83 using var contentStream = await (await GetHttpResponseMessage(httpClient, cancellationToken)).Content.ReadAsStreamAsync(cancellationToken);
78 await using var contentStream = await (await GetHttpResponseMessage(httpClient, cancellationToken)).Content.ReadAsStreamAsync(cancellationToken);
84 79 var buffer = new byte[8192];
85 80 int currentRead;
86 while ((currentRead = await contentStream.ReadAsync(buffer)) > 0 && !_disposedValue)
81 while ((currentRead = await contentStream.ReadAsync(buffer, cancellationToken)) > 0 && !_disposedValue)
87 82 {
88 83 if (IsPaused)
89 84 {
90 85 await cancellationTokenSource.CancelAsync();
91 86 break;
92 87 }
93 await fileStream.WriteAsync(buffer.AsMemory(0, currentRead));
88 await fileStream.WriteAsync(buffer.AsMemory(0, currentRead), cancellationToken);
94 89 totalRead += currentRead;
95 90 currentSegmentDownloadedBuffeSize += currentRead;
96 91 var bufferCopy = new byte[8192];
@@ -141,29 +136,24 @@ public class XFEDownloader : IDisposable
141 136 /// <param name="disposing"></param>
142 137 protected virtual void Dispose(bool disposing)
143 138 {
144 if (!_disposedValue)
139 if (_disposedValue)
140 return;
141 if (disposing)
145 142 {
146 if (disposing)
143 _responseMessage?.Dispose();
144 foreach (var httpClient in _httpClientList)
147 145 {
148 _responseMessage?.Dispose();
149 foreach (var httpClient in _httpClientList)
150 {
151 httpClient.Dispose();
152 }
153 foreach (var response in _httpResponseMessages)
154 {
155 response.Dispose();
156 }
157 foreach (var task in _downloadTasks)
158 {
159 task.Dispose();
160 }
146 httpClient.Dispose();
147 }
148 foreach (var task in _downloadTasks)
149 {
150 task.Dispose();
161 151 }
162
163 // TODO: 释放未托管的资源(未托管的对象)并重写终结器
164 // TODO: 将大型字段设置为 null
165 _disposedValue = true;
166 152 }
153
154 // TODO: 释放未托管的资源(未托管的对象)并重写终结器
155 // TODO: 将大型字段设置为 null
156 _disposedValue = true;
167 157 }
168 158 /// <summary>
169 159 /// 释放资源