- Use delegate when you need custom signatures or want to define specific, reusable types.
- Use Action for methods that don’t need to return any value.
- Use Func when you require a return value from your callback.
C#:
var getDrink = new Func<DateTime, string>((date) =>
{
if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
return "1";
else
return "2";
});
Console.WriteLine(getDrink(DateTime.Now));
source (mirror)
Func
C#:
// Form1.cs
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
private void OpenForm2()
{
Form2 form2 = new Form2(OnGridItemDoubleClick);
form2.Show();
}
private string OnGridItemDoubleClick(int id, string name)
{
// Your logic here, using id and name
return $ "ID: {id}, Name: {name}"; // Example return value
}
}
// Form2.cs
public partial class Form2: Form
{
private Func < int, string, string > gridDoubleClickFunc;
public Form2(Func < int, string, string > onGridDoubleClick)
{
InitializeComponent();
gridDoubleClickFunc = onGridDoubleClick;
dataGridView1.DoubleClick += DataGridView1_DoubleClick;
}
private void DataGridView1_DoubleClick(object sender, EventArgs e)
{
if (dataGridView1.CurrentRow != null)
{
int id = Convert.ToInt32(dataGridView1.CurrentRow.Cells["IdColumn"].Value);
string name = dataGridView1.CurrentRow.Cells["NameColumn"].Value.ToString();
string result = gridDoubleClickFunc?.Invoke(id, name);
// Optionally handle the returned result
}
}
}
Action
C#:
// Form1.cs
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
private void OpenForm2()
{
Form2 form2 = new Form2(OnGridItemDoubleClick);
form2.Show();
}
private void OnGridItemDoubleClick(int id, string name)
{
// Your logic here, using id and name
}
}
// Form2.cs
public partial class Form2: Form
{
private Action < int, string > gridDoubleClickAction;
public Form2(Action < int, string > onGridDoubleClick)
{
InitializeComponent();
gridDoubleClickAction = onGridDoubleClick;
dataGridView1.DoubleClick += DataGridView1_DoubleClick;
}
private void DataGridView1_DoubleClick(object sender, EventArgs e)
{
if (dataGridView1.CurrentRow != null)
{
int id = Convert.ToInt32(dataGridView1.CurrentRow.Cells["IdColumn"].Value);
string name = dataGridView1.CurrentRow.Cells["NameColumn"].Value.ToString();
gridDoubleClickAction?.Invoke(id, name);
}
}
}