您可以在VB.NET中使用未命名的单行对象,而不将它们作为参数或其他东西传递吗?
我记得我在VB.NET中使用了未命名的单行对象,没有将它们作为参数或任何东西传递。例如:您可以在VB.NET中使用未命名的单行对象,而不将它们作为参数或其他东西传递吗?,vb.net,syntax,Vb.net,Syntax,我记得我在VB.NET中使用了未命名的单行对象,没有将它们作为参数或任何东西传递。例如: New SqlCommand("some string", someSqlConnection) 不会编译,这也不会: (New SqlCommand("some string", someSqlConnection)) 在第二种情况下,添加的parantesse将允许您调用该对象上的函数,并将其返回值作为参数传递给其他函数,但当该对象或其函数之一未被用作另一个函数的参数时,它将不起作用 然而,这并不意
New SqlCommand("some string", someSqlConnection)
不会编译,这也不会:
(New SqlCommand("some string", someSqlConnection))
在第二种情况下,添加的parantesse将允许您调用该对象上的函数,并将其返回值作为参数传递给其他函数,但当该对象或其函数之一未被用作另一个函数的参数时,它将不起作用
然而,这并不意味着:
someFunction(New SqlCommand("some string", someSqlConnection))
有没有办法绕过这个限制?换句话说,不在函数调用周围包装函数调用或添加更多代码行?如果没有,我想知道为什么这会被排除在语言之外?您的代码将无法编译,因为如果您没有对任何对象分配创建的实例或将其传递给方法,则调用类构造函数是毫无意义的 如果您询问如何在一行上声明和实例化一个变量,那么以下方法是:
Dim myCommand As New SqlCommand("some string", someSqlConnection)
之后,您可以使用myCommand
指针(构造函数的“返回值”)作为其他函数的参数
否则,我建议您在类中的某个位置使用共享方法:
Public Shared Function ExecuteNonQuery(connection As IDbConnection, query As String) As Integer
Using cmd As IDbCommand = connection.CreateCommand()
cmd.CommandText = query
cmd.Connection = connection
Return cmd.ExecuteNonQuery()
End Using
End Function
之后,您需要做的就是:
myClass.ExecuteNonQuery("my sql query", someSqlConnection)
通过这种方式,您将获得一行无引用的查询执行器。更好的是:这将适用于任何现有的ADO.NET实现,无论是Sql Server、OLEDB、ODBC、Oracle、MySql还是任何其他实现
如果将属性添加到上述方法中,您甚至可以执行以下操作:
someSqlConnection.ExecuteNonQuery("my sql query")
您的代码不会编译,因为如果您没有对任何对象分配创建的实例或将其传递给方法,那么调用类构造函数是毫无意义的 如果您询问如何在一行上声明和实例化一个变量,那么以下方法是:
Dim myCommand As New SqlCommand("some string", someSqlConnection)
之后,您可以使用myCommand
指针(构造函数的“返回值”)作为其他函数的参数
否则,我建议您在类中的某个位置使用共享方法:
Public Shared Function ExecuteNonQuery(connection As IDbConnection, query As String) As Integer
Using cmd As IDbCommand = connection.CreateCommand()
cmd.CommandText = query
cmd.Connection = connection
Return cmd.ExecuteNonQuery()
End Using
End Function
之后,您需要做的就是:
myClass.ExecuteNonQuery("my sql query", someSqlConnection)
通过这种方式,您将获得一行无引用的查询执行器。更好的是:这将适用于任何现有的ADO.NET实现,无论是Sql Server、OLEDB、ODBC、Oracle、MySql还是任何其他实现
如果将属性添加到上述方法中,您甚至可以执行以下操作:
someSqlConnection.ExecuteNonQuery("my sql query")
我能想到的唯一原因是,如果您对构造函数引起的副作用感兴趣,那么任何人都会希望这样做(创建实例而不将其分配给变量)。如果是这种情况,那么实际创建一个变量(如
Dim tmp=New MyObject()
)并没有什么坏处(坏处是一个有副作用的构造函数,但这是另一个主题)
但是,如果要对该对象调用方法,可以使用call
语句,如
Call New SqlCommand("foo", someSqlConnection).ExecuteNonQuery()
此处要求调用,因为表达式不是以标识符开头的
在这里使用Call
是您的朋友,只要您实际调用新对象上的方法。
由于每个对象都提供了一个
ToString
方法,因此您可以始终使用调用New Foo().ToString()
在一行中创建Foo
的实例,而无需将其分配给变量。我能想到的唯一原因是为什么任何人都希望这样做(创建实例而不将其分配给变量)如果你对构造器引起的副作用感兴趣。如果是这种情况,那么实际创建一个变量(如Dim tmp=New MyObject()
)并没有什么坏处(坏处是一个有副作用的构造函数,但这是另一个主题)
但是,如果要对该对象调用方法,可以使用call
语句,如
Call New SqlCommand("foo", someSqlConnection).ExecuteNonQuery()
此处要求调用,因为表达式不是以标识符开头的
在这里使用Call
是您的朋友,只要您实际调用新对象上的方法。
由于每个对象都提供了一个
ToString
方法,因此您可以始终使用调用New Foo().ToString()
在一行中创建Foo
的实例,而无需将其分配给变量。我觉得我遗漏了什么。前两种说法不完全相同吗?如果第一个没有编译,为什么第二个会编译呢?我之前忘了包括括号,我添加了一些文本,我觉得我遗漏了一些东西。前两种说法不完全相同吗?如果第一个没有编译,为什么第二个会编译呢?我之前忘了包括括号,我添加了一些文本来配合它。@downvoter,请不要把你的智慧留给自己。与全世界分享。谢谢。您可能认为这应该是允许的,而不需要将其作为参数传递给另一个函数:(新的SqlCommand(“插入MyTable值('someString')”,someSqlConnection))。ExecuteOnQuery()
这仍然是错误的,因为您的命令对象之后不会被处理。@Crono我认为它应该很快被垃圾收集,因为没有人持有对它的引用。无论如何,这段代码:(新的SqlCommand()).ExecuteNonQuery()代码>用C编译,但VB.NET版本没有:(新的SqlCommand()).ExecuteNonQuery()
。顺便说一句,我不是那个负责解释下一票的人。@Panzercrisis该物品会被很好地收集起来。关键是,对实现IDisposable
的每个对象调用Dispose
,这是一种很好的做法(通常是必不可少的)。这是一个实现细节,对于SqlCommand
,它并不重要,但对于例如SqlConnection
,它确实重要,因为它使用了未被垃圾收集器清理的非托管资源(因此称为u)