当我在Form1_Load()中调用B()时,是否可以将B()替换/覆盖为C()或D();
public Prototype()
{
InitializeComponent();
C();
}
private void Form1_Load()
{
B();
}
private void B()
{
//blank so far
//not sure what to put
}
private void C()
{
if (RadioButton.Checked == false)
{ B() == D(); }
else
{ B() == E(); }
}
private void D()
{
//something ongoing
}
private void E()
{
//something ongoing
}
基本上我需要C()像教师一样指示当Form1_Load()调用B()时,它能够说Form1_Load()实际上需要根据情况调用D()或E()。
我试图在每种方法中避免过多if..else。 基本上,我正在开发一个软件来接收多格式的csv源文件,并且Form1_Load()被编码为执行一组涉及图表构建和图形绘制的修复指令。我试着把它变成软件的骨架。
C()用于确定用户已加载的csv文件的类型,并决定是否使用D()覆盖B()(如果其类型为A),否则覆盖B()为E()它的类型B. 我需要使用不同的数据集来显示csv信息到图表,并根据csv文件中的内容我需要设计不同的过滤器相关显示。
public void I1_ChartTabulate()
{
Stopwatch timer = new Stopwatch();
timer.Start();
Charting.dataGridView1.DataSource = G_BS_I1;
Charting.dataGridView1.AutoGenerateColumns = false;
Charting.dataGridView1.Columns[0].Visible = false;
Charting.dataGridView1.Columns[1].Visible = true;
Charting.dataGridView1.Columns[2].Visible = false;
Charting.dataGridView1.Columns[3].Visible = false;
Charting.dataGridView1.Columns[4].Visible = false;
Charting.dataGridView1.Columns[5].Visible = false;
Charting.dataGridView1.Columns[6].Visible = false;
Charting.dataGridView1.Columns[7].Visible = false;
Charting.dataGridView1.Columns[8].Visible = true;
Charting.dataGridView1.Columns[9].Visible = false;
Charting.dataGridView1.Columns[10].Visible = false;
Charting.dataGridView1.Columns[11].Visible = false;
Charting.dataGridView1.Columns[12].Visible = true;
Charting.dataGridView1.Columns[13].Visible = false;
Charting.dataGridView1.Columns[14].Visible = false;
Charting.dataGridView1.Columns[15].Visible = false;
Charting.dataGridView1.Columns[16].Visible = false;
Charting.dataGridView1.Columns[17].Visible = false;
Charting.dataGridView1.Columns[18].Visible = false;
Charting.dataGridView1.Columns[19].Visible = false;
Charting.dataGridView1.Columns[20].Visible = false;
Charting.dataGridView1.Columns[21].Visible = false;
Charting.dataGridView1.Columns[22].Visible = false;
Charting.dataGridView1.Columns[23].Visible = false;
Charting.dataGridView1.Columns[24].Visible = true;
Charting.dataGridView1.Columns[25].Visible = false;
Charting.dataGridView1.Columns[26].Visible = false;
Charting.dataGridView1.Columns[27].Visible = false;
timer.Stop();
label62.Text = timer.Elapsed.TotalMilliseconds.ToString("#,##0.00 'milliseconds'");
}
public void I2_ChartTabulate()
{
Stopwatch timer = new Stopwatch();
timer.Start();
Charting.dataGridView2.DataSource = G_BS_I2;
Charting.dataGridView2.AutoGenerateColumns = false;
Charting.dataGridView2.Columns[0].Visible = false;
Charting.dataGridView2.Columns[1].Visible = true;
Charting.dataGridView2.Columns[2].Visible = false;
Charting.dataGridView2.Columns[3].Visible = false;
Charting.dataGridView2.Columns[4].Visible = false;
Charting.dataGridView2.Columns[5].Visible = false;
Charting.dataGridView2.Columns[6].Visible = false;
Charting.dataGridView2.Columns[7].Visible = false;
Charting.dataGridView2.Columns[8].Visible = true;
Charting.dataGridView2.Columns[9].Visible = false;
Charting.dataGridView2.Columns[10].Visible = false;
Charting.dataGridView2.Columns[11].Visible = false;
Charting.dataGridView2.Columns[12].Visible = true;
Charting.dataGridView2.Columns[13].Visible = false;
Charting.dataGridView2.Columns[14].Visible = false;
Charting.dataGridView2.Columns[15].Visible = false;
Charting.dataGridView2.Columns[16].Visible = false;
Charting.dataGridView2.Columns[17].Visible = false;
Charting.dataGridView2.Columns[18].Visible = false;
Charting.dataGridView2.Columns[19].Visible = false;
Charting.dataGridView2.Columns[20].Visible = false;
Charting.dataGridView2.Columns[21].Visible = false;
Charting.dataGridView2.Columns[22].Visible = false;
Charting.dataGridView2.Columns[23].Visible = false;
Charting.dataGridView2.Columns[24].Visible = true;
Charting.dataGridView2.Columns[25].Visible = false;
Charting.dataGridView2.Columns[26].Visible = false;
Charting.dataGridView2.Columns[27].Visible = false;
timer.Stop();
label63.Text = timer.Elapsed.TotalMilliseconds.ToString("#,##0.00 'milliseconds'");
}
更确切地说,D()和E()不仅仅是一种方法,它代表了处理csv所涉及的一系列方法。
答案 0 :(得分:0)
你不能这样做:
private void B()
{
if(RadioButton.Checked == false) c();
else d();
}
答案 1 :(得分:0)
如果没有这么多方法,您可以使用以下代码完成相同的操作
private void Form1_Load()
{
if (RadioButton.Checked)
SomeMethod_E();
else
SomeMethod_D();
}
很少注意到你的知识:
您应该使用有意义的变量名称,遵循正确命名naming conventions,这样可以提高代码的可读性以及以后的修改。
答案 2 :(得分:0)
这取决于你真正想要/需要什么,但一个解决方案是使用委托。 这是一个简单的例子:
private VoidDelegate B;
delegate void VoidDelegate();
private void Button1Click(object sender, EventArgs e) {
B = D;
}
private void Button2Click(object sender, EventArgs e) {
B = E;
}
private void Button3Click(object sender, EventArgs e) {
B();
}
private void D() {
MessageBox.Show("D");
}
private void E() {
MessageBox.Show("E");
}
按下按钮1或2将B指向不同的方法,然后在Button3Click上运行B()。
答案 3 :(得分:0)
您可以将delegate用于此类目的,尤其是Action
delegate适用于您的情况:
private Action B;
private void Form1_Load()
{
if(B != null)
{
B();
}
}
private void C()
{
if (RadioButton.Checked == false)
{ B = D; }
else
{ B = E; }
}
答案 4 :(得分:0)
您正在考虑的行为称为First-Class Functions,不幸的是,它不是C#支持的行为,但您仍然可以使用Delegate来执行此操作 - 唯一的问题您是否需要确保始终将默认操作设置为代理(您的代码示例始终会执行此操作)
private Action B;
private void Form1_Load()
{
B();
}
private void C()
{
if (RadioButton.Checked == false) { B = D; }
else { B = E; }
}
它也与您之前可能使用过的Event Handlers有关。