如何在 C# 中使用一种方法修改不同的布尔属性?
How to modify different boolean properties with one method within C#?
我目前面临以下问题,Menu Strip
包含几个不同的设置,例如:
- 显示 X
- 显示Y
- 显示Z
所有这些项目都具有 bool
类型的相应属性,因为这些变量也传递给其他 类。目前,当我点击 "Show Y" 时,我有一个名为 HandleShowY()
的专用功能,它可以切换 bool
和菜单条项目中的复选标记。
每个新添加的 属性 的新方法对我来说似乎是一个巨大的代码味道,并且每个新 属性 都需要大量的额外开销。因此,我想出了制作一个通用的 HandleMenuStripItemBool()
的想法,它通过引用接收 属性 和菜单项,这样只有一种方法可以处理这种类型的行为。
不幸的是,我 运行 在尝试通过引用将我的 bool
属性 传递给此方法时遇到了问题,我对 action
、[=18= 的了解] 和 delegate
几乎消失了,在我阅读每一个新教程后只会让我越来越困惑。
示例代码:
// different properties of type bool, defined in form1
private bool ShowX { get; set; }
private bool ShowY { get; set; }
// generic menu strip item bool handler
private void HandleMenuStripItemBool(bool boolProp, ToolStripMenuItem menuItem)
{
// toggle bool depending on current value
// add check mark to or remove check mark from ToolStripMenuItem
}
// click event of the "Show X" menu strip item, defined in form1
private void showXToolStripMenuItem_Click(object sender, EventArgs e)
{
HandleMenuStripItemBool(ShowX, showXToolStripMenuItem);
}
// click event of the "Show Y" menu strip item, defined in form1
private void showYToolStripMenuItem_Click(object sender, EventArgs e)
{
HandleMenuStripItemBool(ShowY, showYToolStripMenuItem);
}
TL;DR:创建一个通过引用接收 bool
类型的 属性 的方法的最佳方法是什么?属性?
提前致谢。
您可以将其作为参考传递并在方法内部对其进行处理:
bool testBool;
ToggleBoolValue(ref testBool);
private void ToggleBoolValue(ref bool toggle)
{
toggle = !toggle;
// some other tasks
}
如果您使用的是非常现代的 C# 版本(我认为是 7.0 或更高版本),那么您可以使您的属性 ref
返回,并且然后按照 Michal 的建议使用 ref
:
using System;
public class Bob
{
static void Main()
{
var b = new Bob();
b.showYToolStripMenuItem_Click();
Console.WriteLine(b.ShowY);
Console.ReadLine();
}
// different properties of type bool, defined in form1
private ref bool ShowX { get { return ref _showX; } }
private ref bool ShowY { get { return ref _showY; } }
private bool _showX = false;
private bool _showY = false;
// generic menu strip item bool handler
private void HandleMenuStripItemBool(ref bool boolProp)
{
boolProp = true;
}
// click event of the "Show X" menu strip item, defined in form1
private void showXToolStripMenuItem_Click()
{
HandleMenuStripItemBool(ref ShowX);
}
// click event of the "Show Y" menu strip item, defined in form1
private void showYToolStripMenuItem_Click()
{
HandleMenuStripItemBool(ref ShowY);
}
}
(添加的主要参数和不相关的参数已删除,使其成为 self-contained 控制台演示)
虽然没有具体回答如何通过引用传递 bool 属性,但为什么不直接使用菜单项的 Checked
值,在这种情况下您不需要维护该值布尔值 属性,并且只有一个真实来源
private bool ShowX
{
get { return showXToolStripMenuItem.Checked; }
set { showXToolStripMenuItem.Checked = value; }
}
我目前面临以下问题,Menu Strip
包含几个不同的设置,例如:
- 显示 X
- 显示Y
- 显示Z
所有这些项目都具有 bool
类型的相应属性,因为这些变量也传递给其他 类。目前,当我点击 "Show Y" 时,我有一个名为 HandleShowY()
的专用功能,它可以切换 bool
和菜单条项目中的复选标记。
每个新添加的 属性 的新方法对我来说似乎是一个巨大的代码味道,并且每个新 属性 都需要大量的额外开销。因此,我想出了制作一个通用的 HandleMenuStripItemBool()
的想法,它通过引用接收 属性 和菜单项,这样只有一种方法可以处理这种类型的行为。
不幸的是,我 运行 在尝试通过引用将我的 bool
属性 传递给此方法时遇到了问题,我对 action
、[=18= 的了解] 和 delegate
几乎消失了,在我阅读每一个新教程后只会让我越来越困惑。
示例代码:
// different properties of type bool, defined in form1
private bool ShowX { get; set; }
private bool ShowY { get; set; }
// generic menu strip item bool handler
private void HandleMenuStripItemBool(bool boolProp, ToolStripMenuItem menuItem)
{
// toggle bool depending on current value
// add check mark to or remove check mark from ToolStripMenuItem
}
// click event of the "Show X" menu strip item, defined in form1
private void showXToolStripMenuItem_Click(object sender, EventArgs e)
{
HandleMenuStripItemBool(ShowX, showXToolStripMenuItem);
}
// click event of the "Show Y" menu strip item, defined in form1
private void showYToolStripMenuItem_Click(object sender, EventArgs e)
{
HandleMenuStripItemBool(ShowY, showYToolStripMenuItem);
}
TL;DR:创建一个通过引用接收 bool
类型的 属性 的方法的最佳方法是什么?属性?
提前致谢。
您可以将其作为参考传递并在方法内部对其进行处理:
bool testBool;
ToggleBoolValue(ref testBool);
private void ToggleBoolValue(ref bool toggle)
{
toggle = !toggle;
// some other tasks
}
如果您使用的是非常现代的 C# 版本(我认为是 7.0 或更高版本),那么您可以使您的属性 ref
返回,并且然后按照 Michal 的建议使用 ref
:
using System;
public class Bob
{
static void Main()
{
var b = new Bob();
b.showYToolStripMenuItem_Click();
Console.WriteLine(b.ShowY);
Console.ReadLine();
}
// different properties of type bool, defined in form1
private ref bool ShowX { get { return ref _showX; } }
private ref bool ShowY { get { return ref _showY; } }
private bool _showX = false;
private bool _showY = false;
// generic menu strip item bool handler
private void HandleMenuStripItemBool(ref bool boolProp)
{
boolProp = true;
}
// click event of the "Show X" menu strip item, defined in form1
private void showXToolStripMenuItem_Click()
{
HandleMenuStripItemBool(ref ShowX);
}
// click event of the "Show Y" menu strip item, defined in form1
private void showYToolStripMenuItem_Click()
{
HandleMenuStripItemBool(ref ShowY);
}
}
(添加的主要参数和不相关的参数已删除,使其成为 self-contained 控制台演示)
虽然没有具体回答如何通过引用传递 bool 属性,但为什么不直接使用菜单项的 Checked
值,在这种情况下您不需要维护该值布尔值 属性,并且只有一个真实来源
private bool ShowX
{
get { return showXToolStripMenuItem.Checked; }
set { showXToolStripMenuItem.Checked = value; }
}