【发布时间】:2019-10-23 15:13:30
【问题描述】:
C# 编译器是否需要函数委托才能将函数作为参数传递给另一个函数?
在 Visual Basic .Net 中,我可以将返回值与方法参数类型相同的函数传递给方法本身,而无需任何花哨的东西。除非该方法被编写为接受函数委托,否则这在 C# 中似乎是不可能的??
工作vb:
Function DoSomething(r As DataRow())
'...
End Function
Function CallSomething()
Dim dt As DataTable
DoSomething(dt.Select(""))
End Function
C# 将要求调用代码分配一个变量并传递它,或者引用函数的签名包含一个委托(了解有用)。细微的差别,但我希望用一种语言进行的简单方法调用可以在另一种语言中同样容易地进行,因为它们都编译为相同的 IL。
这是我试图做的 C# 等价物:
string DoSomething(ref DataRow[] r)
{ ///do something }
void CallSomething()
{
DataTable dt;
DoSomething(ref dt.Select(""));
}
我所说的“花哨”是指委托的使用,我已经将委托用于更复杂的场景,例如将事件处理程序分配给数组元素,但我很惊讶他们会被要求这样做。
感谢您的回复。 VB 代码按预期运行,ByRef 在 VB 中是隐式的,您不能传递在堆 byval 上管理的对象。尽管如此,这是我可以在 VB 中提供的最简单的表单,如果您使用带有单个列表框的简单表单项目并将此代码放入,应该可以正常工作:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim dt As New DataTable("A really great table")
dt.Columns.Add("Column1", GetType(String))
dt.Rows.Add("Row1") : dt.Rows.Add("Row2")
PutRowsInListbox(dt.Select(""))
End Sub
Private Function PutRowsInListbox(ByRef r() As DataRow)
For i As Integer = 0 To r.Length - 1
Me.ListBox1.Items.Add(r(i).Item("Column1"))
Next
End Function
End Class
【问题讨论】:
-
在您的 VB 代码中,
r或dt.Select("")看起来不像是函数委托,它们看起来像值。 -
您能否添加一些您希望工作的 C# 代码示例,而无需做“任何花哨的事情”?
-
我相信你应该能够做到
public void CallSomething() { var dt = new DataTable(); DoSomething(dt.Select(""));}和public void DoSomething(DataRow[] r){} -
我认为 VB 并没有像你想象的那样做......
-
您的 Vb.Net 代码不等同于您的 c# 代码。如果想让它们等价,则需要去掉c#代码上的
ref关键字(或者VB.Net代码上加上ByRef)。
标签: c# .net vb.net parameters