您可以在vb.net中使用未命名的单行对象而不将其作为参数或其他内容



我以为我记得在vb.net中使用未命名的单行对象,而无需传递它们作为参数或任何东西。例如:

New SqlCommand("some string", someSqlConnection)

不编译,也没有:

(New SqlCommand("some string", someSqlConnection))

在第二种情况下,添加的paranthess将允许您在该对象上调用函数,并将其返回值作为参数传递给其他函数,但是当对象或其函数之一不被用作对象或一个函数时,它不起作用另一个功能的参数。

但是这确实是编译的:

someFunction(New SqlCommand("some string", someSqlConnection))

有没有办法解决该限制?换句话说,没有包装功能在它们周围调用或添加更多代码行?如果没有,我想知道为什么这将被排除在语言之外?

我能想到的为什么任何人都想执行此操作(创建实例而不将其刺激到变量)的原因是,如果您被融入由构造函数引起的副作用。如果是这种情况,那么实际创建一个诸如Dim tmp = New MyObject()之类的变量并没有什么伤害(受伤的是具有副作用的构造函数,但这是另一个主题)。

但是,如果您要在该对象上调用方法,则可以使用Call语句,例如

Call New SqlCommand("foo", someSqlConnection).ExecuteNonQuery()

Call在此处需要,因为表达式不是以标识符开头的。

使用Call是您的朋友,只要您实际调用新对象上的方法即可。而且,由于每个对象都提供了ToString方法,因此您可以始终使用Call New Foo().ToString()在一行中创建Foo的实例,而无需分配给变量。

您的代码不会编译,因为如果您没有在任何内容上分配创建的实例或将其传递给方法。

,请调用类构造函数。

如果您询问如何在一行上声明和实例化变量,这就是:

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还是任何其他。

如果将Extension属性添加到上述方法,甚至可以这样做:

someSqlConnection.ExecuteNonQuery("my sql query")

最新更新