Флажки C # - Могу ли я это убрать?
-
05-07-2019 - |
Вопрос
Эта функция вызывается из form_onload.Я в основном читаю реестр, определяю, какие флажки отмечены, а затем отражаю это в графическом интерфейсе.
Есть ли какой-нибудь способ сконденсировать это и написать лучший код?Как насчет использования свойства CheckState?
Спасибо.
Вуди
private void checkExcelSettings()
{
// Read what the values are for the checkboxes first and assign them to a string.
string _excelEnable = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelEnableHash", "Unchecked"));
string _excelSSN = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelSSNHash", "Unchecked"));
string _excelCC = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelCCHash", "Unchecked"));
string _excelWells = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelWellsHash", "Unchecked"));
string s=@"t\""; //unimportant no-op to placate stackoverflow syntax highlighter.
// Now let's make sure we reflect what they are supposed to be in the GUI.
if (_excelEnable == "Checked")
{
chkbxExcelEnable.Checked = true;
}
else
{
chkbxExcelEnable.Checked = false;
}
if (_excelSSN == "Checked")
{
chkbxExcelSSN.Checked = true;
}
else
{
chkbxExcelSSN.Checked = false;
}
if (_excelCC == "Checked")
{
chkbxExcelCC.Checked = true;
}
else
{
chkbxExcelCC.Checked = false;
}
if (_excelWells == "Checked")
{
chkbxExcelWellsFargo.Checked = true;
}
else
{
chkbxExcelWellsFargo.Checked = false;
}
}
Решение
Ну, вы могли бы, по крайней мере, сузить круг поисков до:
chkbxExcelCC.Checked = _excelCC.Equals("Checked");
Таким образом, вы избегаете всех операторов if / else.
Другие советы
Вы можете удалить все ненужные условия if /else, поместив условие в строку с назначением.Вы также можете сделать путь к основному ключу константой.Однако, чтобы действительно упростить это, вы можете использовать повторяющуюся логику поиска ключа и сравнения с "Проверено" и поместить его в отдельный метод:
private void checkExcelSettings()
{
// Now let's make sure we reflect what they are supposed to be in the GUI.
chkbxExcelEnable.Checked = IsChecked("ExcelEnableHash");
chkbxExcelSSN.Checked = IsChecked("ExcelSSNHash");
chkbxExcelCC.Checked = IsChecked("ExcelCCHash");
chkbxExcelWellsFargo.Checked = IsChecked("ExcelWellsHash");
}
private static bool IsChecked(string regValue)
{
return Convert.ToString(
Registry.GetValue(
@"HKEY_CURRENT_USER\Software\Mask Data\",
regValue,
"Unchecked")) == "Checked";
}
private void checkExcelSettings()
{
// Read what the values are for the checkboxes first and assign them to a string.
string _excelEnable = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelEnableHash", "Unchecked"));
string _excelSSN = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelSSNHash", "Unchecked"));
string _excelCC = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelCCHash", "Unchecked"));
string _excelWells = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Mask Data\", "ExcelWellsHash", "Unchecked"));
// Now let's make sure we reflect what they are supposed to be in the GUI.
chkbxExcelEnable.Checked = (_excelEnable == "Checked");
chkbxExcelSSN.Checked = (_excelSSN == "Checked");
chkbxExcelCC.Checked = (_excelCC == "Checked");
chkbxExcelWellsFargo.Checked = (_excelWells == "Checked");
}
Вы могли бы разместить все свои флажки на панели и присвоить свойству Tag каждого флажка соответствующий раздел в реестре.Затем вы могли бы использовать этот код в событии загрузки формы:
foreach (CheckBox cb in panel1.Controls)
{
cb.Checked = ((string)Registry.GetValue(RegPath,
(string)cb.Tag, "Unchecked") == "Checked");
}
Недостатком этого является то, что это не сразу очевидно будущему программисту по техническому обслуживанию, поэтому я бы добавил сюда подробный комментарий, предназначенный для вашей возможной замены.
Вы также могли бы отказаться от тега и просто присвоить каждому флажку имя с любым соответствующим ключом, а затем использовать "cb.Name" вместо "(string)cb.Tag".В любом случае, венгерская нотация больше никому не нравится.
private void checkExcelSettings()
{
string key = @"HKEY_CURRENT_USER\Software\Mask Data\";
// Read what the values are for the checkboxes first and assign them to a string.
string _excelEnable = Convert.ToString(Registry.GetValue(key, "ExcelEnableHash", "Unchecked"));
string _excelSSN = Convert.ToString(Registry.GetValue(key, "ExcelSSNHash", "Unchecked"));
string _excelCC = Convert.ToString(Registry.GetValue(key, "ExcelCCHash", "Unchecked"));
string _excelWells = Convert.ToString(Registry.GetValue(key, "ExcelWellsHash", "Unchecked"));
string s=@"t\""; //unimportant no-op to placate stackoverflow syntax highlighter.
// Now let's make sure we reflect what they are supposed to be in the GUI.
chkbxExcelEnable.Checked = (_excelEnable == "Checked");
chkbxExcelSSN.Checked = (_excelSSN == "Checked");
chkbxExcelCC.Checked = (_excelCC == "Checked");
chkbxExcelWellsFargo.Checked = (_excelWells == "Checked");
}
Используйте краткие обозначения от руки для if else
chkbxExcelEnable.Checked = _excelEnable == "Checked" ? true: false;