From 087932319e8501ea27f5eadee27edd9970268017 Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:26:30 +0800 Subject: [PATCH] perf: null check [skip changelog] --- src/MaaWpfGui/Helper/DataHelper.cs | 42 ++++++++--------- src/MaaWpfGui/Main/AsstProxy.cs | 32 +++++-------- .../ViewModels/UI/CopilotViewModel.cs | 19 +++++--- .../ViewModels/UI/SettingsViewModel.cs | 18 +++---- .../ViewModels/UI/TaskQueueViewModel.cs | 47 +++++++++---------- src/MaaWpfGui/Views/UI/ErrorView.xaml.cs | 4 +- 6 files changed, 76 insertions(+), 86 deletions(-) diff --git a/src/MaaWpfGui/Helper/DataHelper.cs b/src/MaaWpfGui/Helper/DataHelper.cs index ebab3f7f3c..d0a3af9882 100644 --- a/src/MaaWpfGui/Helper/DataHelper.cs +++ b/src/MaaWpfGui/Helper/DataHelper.cs @@ -10,6 +10,7 @@ // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY // +#nullable enable using System; using System.Collections.Generic; @@ -23,12 +24,10 @@ namespace MaaWpfGui.Helper public static class DataHelper { // 储存角色信息的字典 - public static Dictionary Characters { get; } + public static Dictionary Characters { get; } = new(); static DataHelper() { - Characters = new Dictionary(); - const string FilePath = "resource/battle_data.json"; if (!File.Exists(FilePath)) { @@ -36,7 +35,7 @@ namespace MaaWpfGui.Helper } string jsonText = File.ReadAllText(FilePath); - var characterData = JsonConvert.DeserializeObject>(JObject.Parse(jsonText)["chars"]?.ToString() ?? string.Empty); + var characterData = JsonConvert.DeserializeObject>(JObject.Parse(jsonText)["chars"]?.ToString() ?? string.Empty) ?? new(); foreach (var pair in characterData) { @@ -44,21 +43,20 @@ namespace MaaWpfGui.Helper } } - public static CharacterInfo GetCharacterByNameOrAlias(string characterName) + public static CharacterInfo? GetCharacterByNameOrAlias(string characterName) { return Characters.Values.FirstOrDefault( - character => - new[] + character => new[] { - character?.Name, - character?.NameEn, - character?.NameJp, - character?.NameKr, - character?.NameTw, - }.Any(name => name.Equals(characterName, StringComparison.OrdinalIgnoreCase))); + character.Name, + character.NameEn, + character.NameJp, + character.NameKr, + character.NameTw, + }.Any(name => name?.Equals(characterName, StringComparison.OrdinalIgnoreCase) ?? false)); } - public static string GetLocalizedCharacterName(string characterName, string language) + public static string? GetLocalizedCharacterName(string characterName, string language) { var characterInfo = GetCharacterByNameOrAlias(characterName); if (characterInfo?.Name == null) @@ -80,28 +78,28 @@ namespace MaaWpfGui.Helper public class CharacterInfo { [JsonProperty("name")] - public string Name { get; set; } + public string? Name { get; set; } [JsonProperty("name_en")] - public string NameEn { get; set; } + public string? NameEn { get; set; } [JsonProperty("name_jp")] - public string NameJp { get; set; } + public string? NameJp { get; set; } [JsonProperty("name_kr")] - public string NameKr { get; set; } + public string? NameKr { get; set; } [JsonProperty("name_tw")] - public string NameTw { get; set; } + public string? NameTw { get; set; } [JsonProperty("position")] - public string Position { get; set; } + public string? Position { get; set; } [JsonProperty("profession")] - public string Profession { get; set; } + public string? Profession { get; set; } [JsonProperty("rangeId")] - public List RangeId { get; set; } + public List? RangeId { get; set; } [JsonProperty("rarity")] public int Rarity { get; set; } diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index 3e714b9cd9..c643059a59 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -324,7 +324,7 @@ namespace MaaWpfGui.Main string jsonStr = PtrToStringCustom(jsonBuffer, Encoding.UTF8); // Console.WriteLine(json_str); - JObject json = (JObject)JsonConvert.DeserializeObject(jsonStr); + var json = (JObject)JsonConvert.DeserializeObject(jsonStr); MaaService.ProcCallbackMsg dlg = ProcMsg; Execute.OnUIThread(() => { @@ -385,7 +385,7 @@ namespace MaaWpfGui.Main private void ProcConnectInfo(JObject details) { - var what = details["what"].ToString(); + var what = details["what"]?.ToString() ?? string.Empty; switch (what) { case "Connected": @@ -519,8 +519,7 @@ namespace MaaWpfGui.Main private void ProcTaskChainMsg(AsstMsg msg, JObject details) { - string taskChain = details["taskchain"].ToString(); - + string taskChain = details["taskchain"]?.ToString() ?? string.Empty; switch (taskChain) { case "CloseDown": @@ -813,8 +812,7 @@ namespace MaaWpfGui.Main private static void ProcSubTaskError(JObject details) { - string subTask = details["subtask"].ToString(); - + string subTask = details["subtask"]?.ToString() ?? string.Empty; switch (subTask) { case "StartGameTask": @@ -860,8 +858,7 @@ namespace MaaWpfGui.Main private void ProcSubTaskStart(JObject details) { - string subTask = details["subtask"].ToString(); - + string subTask = details["subtask"]?.ToString() ?? string.Empty; switch (subTask) { case "ProcessTask": @@ -1018,8 +1015,7 @@ namespace MaaWpfGui.Main private static void ProcSubTaskExtraInfo(JObject details) { - string taskChain = details["taskchain"].ToString(); - + string taskChain = details["taskchain"]?.ToString() ?? string.Empty; switch (taskChain) { case "Recruit": @@ -1043,14 +1039,13 @@ namespace MaaWpfGui.Main break; } - string what = details["what"].ToString(); - + string what = details["what"]?.ToString() ?? string.Empty; switch (what) { case "StageDrops": { string allDrops = string.Empty; - var statistics = (JArray)subTaskDetails["stats"] ?? new(); + var statistics = subTaskDetails["stats"] ?? new JArray(); int curTimes = (int)(subTaskDetails["cur_times"] ?? -1); foreach (var item in statistics) @@ -1097,7 +1092,7 @@ namespace MaaWpfGui.Main case "RecruitTagsDetected": { - var tags = (JArray)subTaskDetails["tags"] ?? new(); + var tags = subTaskDetails["tags"] ?? new JArray(); string logContent = tags.Select(tagName => tagName.ToString()) .Aggregate(string.Empty, (current, tagStr) => current + (tagStr + "\n")); @@ -1165,7 +1160,7 @@ namespace MaaWpfGui.Main case "RecruitTagsSelected": { - var selected = (JArray)subTaskDetails["tags"] ?? new(); + var selected = subTaskDetails["tags"] ?? new JArray(); string selectedLog = selected.Aggregate(string.Empty, (current, tag) => current + (tag + "\n")); selectedLog = selectedLog.EndsWith('\n') ? selectedLog.TrimEnd('\n') : LocalizationHelper.GetString("NoDrop"); @@ -1363,8 +1358,8 @@ namespace MaaWpfGui.Main int sanityCur = sanityReport.TryGetValue("current_sanity", out var sanityCurToken) ? (int)sanityCurToken : -1; int sanityMax = sanityReport.TryGetValue("max_sanity", out var sanityMaxToken) ? (int)sanityMaxToken : -1; - var reportTime = sanityReport.TryGetValue("report_time", out var reportTimeToken) ? (string)reportTimeToken : string.Empty; - if (sanityCur < 0 || sanityMax < 1 || reportTime?.Length < 12) + var reportTime = sanityReport.TryGetValue("report_time", out var reportTimeToken) ? (string)reportTimeToken! : string.Empty; + if (sanityCur < 0 || sanityMax < 1 || reportTime.Length < 12) { break; } @@ -1436,8 +1431,7 @@ namespace MaaWpfGui.Main private static void ProcVideoRecMsg(JObject details) { - string what = details["what"].ToString(); - + string what = details["what"]?.ToString() ?? string.Empty; switch (what) { case "Finished": diff --git a/src/MaaWpfGui/ViewModels/UI/CopilotViewModel.cs b/src/MaaWpfGui/ViewModels/UI/CopilotViewModel.cs index a62bbca703..df064a0e12 100644 --- a/src/MaaWpfGui/ViewModels/UI/CopilotViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/CopilotViewModel.cs @@ -75,22 +75,27 @@ namespace MaaWpfGui.ViewModels.UI JArray jArray = JArray.Parse(copilotTaskList); foreach (var it in jArray) { - if (it is JObject item && item.TryGetValue("file_path", out var token) && File.Exists(token.ToString())) + if (it is JObject item && item.TryGetValue("file_path", out var pathToken) && File.Exists(pathToken.ToString())) { int copilotIdInFile = item.TryGetValue("copilot_id", out var copilotIdToken) ? (int)copilotIdToken : -1; string name = (string)item["name"]; - bool isRaid = false; + if (string.IsNullOrEmpty(name)) + { + continue; + } + + bool? isRaid = false; if (item.ContainsKey("is_raid")) { - isRaid = (bool)item["is_raid"]; + isRaid = (bool?)item["is_raid"]; } else if (name.EndsWith("-Adverse")) { - name = name.Replace("-Adverse", string.Empty); + name = name[..^8]; isRaid = true; // 用于迁移配置 (since 5.1.0, 后期移除) } - CopilotItemViewModels.Add(new CopilotItemViewModel(name, (string)item["file_path"], isRaid, copilotIdInFile, (bool)item["is_checked"])); + CopilotItemViewModels.Add(new CopilotItemViewModel(name, (string)pathToken!, isRaid == true, copilotIdInFile, (bool?)item?["is_checked"] ?? true)); } } @@ -234,7 +239,7 @@ namespace MaaWpfGui.ViewModels.UI return; } - if (jsonStr != string.Empty) + if (!string.IsNullOrEmpty(jsonStr)) { ParseJsonAndShowInfo(jsonStr); } @@ -566,7 +571,7 @@ namespace MaaWpfGui.ViewModels.UI return; } - var filename = ((Array)e.Data.GetData(DataFormats.FileDrop))?.GetValue(0).ToString(); + var filename = ((Array)e.Data.GetData(DataFormats.FileDrop))?.GetValue(0)?.ToString(); DropFile(filename); } diff --git a/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs b/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs index 40bc8312ed..6cd31cb02a 100644 --- a/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs @@ -74,7 +74,7 @@ namespace MaaWpfGui.ViewModels.UI /// /// Gets the core version. /// - public static string CoreVersion { get; } = Marshal.PtrToStringAnsi(MaaService.AsstGetVersion()); + public static string CoreVersion { get; } = Marshal.PtrToStringAnsi(MaaService.AsstGetVersion()) ?? "0.0.1"; private static readonly string _uiVersion = Assembly.GetExecutingAssembly().GetCustomAttribute()?.InformationalVersion.Split('+')[0] ?? "0.0.1"; @@ -112,8 +112,8 @@ namespace MaaWpfGui.ViewModels.UI JObject versionJson = (JObject)JsonConvert.DeserializeObject(File.ReadAllText(jsonPath)); var currentTime = (ulong)DateTimeOffset.UtcNow.ToUnixTimeSeconds(); - var poolTime = (ulong)versionJson?["gacha"]?["time"]; - var activityTime = (ulong)versionJson?["activity"]?["time"]; + var poolTime = (ulong?)versionJson?["gacha"]?["time"]; // 卡池的开始时间 + var activityTime = (ulong?)versionJson?["activity"]?["time"]; // 活动的开始时间 if ((currentTime < poolTime) && (currentTime < activityTime)) { @@ -1705,7 +1705,7 @@ namespace MaaWpfGui.ViewModels.UI /// /// Gets or sets the list of divider vertical offset. /// - public List DividerVerticalOffsetList { get; set; } + public List DividerVerticalOffsetList { get; set; } = new(); private int _selectedIndex; @@ -1723,11 +1723,7 @@ namespace MaaWpfGui.ViewModels.UI _notifySource = NotifyType.SelectedIndex; SetAndNotify(ref _selectedIndex, value); - var isInRange = DividerVerticalOffsetList != null - && DividerVerticalOffsetList.Count > 0 - && value < DividerVerticalOffsetList.Count; - - if (isInRange) + if (DividerVerticalOffsetList?.Count > 0 && value < DividerVerticalOffsetList.Count) { ScrollOffset = DividerVerticalOffsetList[value]; } @@ -1759,9 +1755,7 @@ namespace MaaWpfGui.ViewModels.UI SetAndNotify(ref _scrollOffset, value); // 设置 ListBox SelectedIndex 为当前 ScrollOffset 索引 - var isInRange = DividerVerticalOffsetList != null && DividerVerticalOffsetList.Count > 0; - - if (isInRange) + if (DividerVerticalOffsetList?.Count > 0) { // 滚动条滚动到底部,返回最后一个 Divider 索引 if (value + ScrollViewportHeight >= ScrollExtentHeight) diff --git a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs index 373aca79d9..139b4da6fa 100644 --- a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs @@ -93,9 +93,30 @@ namespace MaaWpfGui.ViewModels.UI private string _actionAfterCompleted = ConfigurationHelper.GetValue(ConfigurationKeys.ActionAfterCompleted, ActionType.DoNothing.ToString()); /// - /// Gets or private sets the list of the actions after completion. + /// Gets the list of the actions after completion. /// - public List> ActionAfterCompletedList { get; private set; } + public List> ActionAfterCompletedList { get; } = + [ + new() { Display = LocalizationHelper.GetString("DoNothing"), Value = ActionType.DoNothing }, + new() { Display = LocalizationHelper.GetString("ExitArknights"), Value = ActionType.StopGame }, + new() { Display = LocalizationHelper.GetString("BackToAndroidHome"), Value = ActionType.BackToAndroidHome }, + + new() { Display = LocalizationHelper.GetString("ExitEmulator"), Value = ActionType.ExitEmulator }, + new() { Display = LocalizationHelper.GetString("ExitSelf"), Value = ActionType.ExitSelf }, + new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelf"), Value = ActionType.ExitEmulatorAndSelf }, + + // new() { Display="待机",Value=ActionTypeAfterCompleted.Suspend }, + new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelfAndHibernate"), Value = ActionType.ExitEmulatorAndSelfAndHibernate }, + new() { Display = LocalizationHelper.GetString("Hibernate"), Value = ActionType.Hibernate }, + new() { Display = LocalizationHelper.GetString("Shutdown"), Value = ActionType.Shutdown }, + + // new() { Display = Localization.GetString("ExitEmulatorAndSelfAndHibernate") + "*", Value = ActionType.ExitEmulatorAndSelfAndHibernateWithoutPersist }, + new() { Display = LocalizationHelper.GetString("HibernateWithoutPersist"), Value = ActionType.HibernateWithoutPersist }, + new() { Display = LocalizationHelper.GetString("ShutdownWithoutPersist"), Value = ActionType.ShutdownWithoutPersist }, + + new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelfIfOtherMaaElseExitEmulatorAndSelfAndHibernate"), Value = ActionType.ExitEmulatorAndSelfIfOtherMaaElseExitEmulatorAndSelfAndHibernate }, + new() { Display = LocalizationHelper.GetString("ExitSelfIfOtherMaaElseShutdown"), Value = ActionType.ExitSelfIfOtherMaaElseShutdown }, + ]; /// /// Gets or sets the action after completion. @@ -397,28 +418,6 @@ namespace MaaWpfGui.ViewModels.UI taskList.Add("ReclamationAlgorithm2"); } - ActionAfterCompletedList = - [ - new() { Display = LocalizationHelper.GetString("DoNothing"), Value = ActionType.DoNothing }, - new() { Display = LocalizationHelper.GetString("ExitArknights"), Value = ActionType.StopGame }, - new() { Display = LocalizationHelper.GetString("BackToAndroidHome"), Value = ActionType.BackToAndroidHome }, - - new() { Display = LocalizationHelper.GetString("ExitEmulator"), Value = ActionType.ExitEmulator }, - new() { Display = LocalizationHelper.GetString("ExitSelf"), Value = ActionType.ExitSelf }, - new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelf"), Value = ActionType.ExitEmulatorAndSelf }, - - // new() { Display="待机",Value=ActionTypeAfterCompleted.Suspend }, - new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelfAndHibernate"), Value = ActionType.ExitEmulatorAndSelfAndHibernate }, - new() { Display = LocalizationHelper.GetString("Hibernate"), Value = ActionType.Hibernate }, - new() { Display = LocalizationHelper.GetString("Shutdown"), Value = ActionType.Shutdown }, - - // new() { Display = Localization.GetString("ExitEmulatorAndSelfAndHibernate") + "*", Value = ActionType.ExitEmulatorAndSelfAndHibernateWithoutPersist }, - new() { Display = LocalizationHelper.GetString("HibernateWithoutPersist"), Value = ActionType.HibernateWithoutPersist }, - new() { Display = LocalizationHelper.GetString("ShutdownWithoutPersist"), Value = ActionType.ShutdownWithoutPersist }, - - new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelfIfOtherMaaElseExitEmulatorAndSelfAndHibernate"), Value = ActionType.ExitEmulatorAndSelfIfOtherMaaElseExitEmulatorAndSelfAndHibernate }, - new() { Display = LocalizationHelper.GetString("ExitSelfIfOtherMaaElseShutdown"), Value = ActionType.ExitSelfIfOtherMaaElseShutdown }, - ]; var tempOrderList = new List(new DragItemViewModel[taskList.Count]); var nonOrderList = new List(); for (int i = 0; i != taskList.Count; ++i) diff --git a/src/MaaWpfGui/Views/UI/ErrorView.xaml.cs b/src/MaaWpfGui/Views/UI/ErrorView.xaml.cs index b70dfa311d..ff04673794 100644 --- a/src/MaaWpfGui/Views/UI/ErrorView.xaml.cs +++ b/src/MaaWpfGui/Views/UI/ErrorView.xaml.cs @@ -50,10 +50,10 @@ namespace MaaWpfGui.Views.UI while (true) { errorStr.Append(exc.Message); - exc = exc.InnerException; - if (exc != null) + if (exc.InnerException != null) { errorStr.AppendLine(); + exc = exc.InnerException; } else {