perf: null check

[skip changelog]
This commit is contained in:
status102
2024-03-05 10:26:30 +08:00
parent 472e7f552d
commit 087932319e
6 changed files with 76 additions and 86 deletions

View File

@@ -10,6 +10,7 @@
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY
// </copyright>
#nullable enable
using System;
using System.Collections.Generic;
@@ -23,12 +24,10 @@ namespace MaaWpfGui.Helper
public static class DataHelper
{
// 储存角色信息的字典
public static Dictionary<string, CharacterInfo> Characters { get; }
public static Dictionary<string, CharacterInfo> Characters { get; } = new();
static DataHelper()
{
Characters = new Dictionary<string, CharacterInfo>();
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<Dictionary<string, CharacterInfo>>(JObject.Parse(jsonText)["chars"]?.ToString() ?? string.Empty);
var characterData = JsonConvert.DeserializeObject<Dictionary<string, CharacterInfo>>(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<string> RangeId { get; set; }
public List<string>? RangeId { get; set; }
[JsonProperty("rarity")]
public int Rarity { get; set; }

View File

@@ -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":

View File

@@ -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);
}

View File

@@ -74,7 +74,7 @@ namespace MaaWpfGui.ViewModels.UI
/// <summary>
/// Gets the core version.
/// </summary>
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<AssemblyInformationalVersionAttribute>()?.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
/// <summary>
/// Gets or sets the list of divider vertical offset.
/// </summary>
public List<double> DividerVerticalOffsetList { get; set; }
public List<double> 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)

View File

@@ -93,9 +93,30 @@ namespace MaaWpfGui.ViewModels.UI
private string _actionAfterCompleted = ConfigurationHelper.GetValue(ConfigurationKeys.ActionAfterCompleted, ActionType.DoNothing.ToString());
/// <summary>
/// Gets or private sets the list of the actions after completion.
/// Gets the list of the actions after completion.
/// </summary>
public List<GenericCombinedData<ActionType>> ActionAfterCompletedList { get; private set; }
public List<GenericCombinedData<ActionType>> 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 },
];
/// <summary>
/// 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<DragItemViewModel>(new DragItemViewModel[taskList.Count]);
var nonOrderList = new List<DragItemViewModel>();
for (int i = 0; i != taskList.Count; ++i)

View File

@@ -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
{