Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您可以在VB.NET中使用未命名的单行对象,而不将它们作为参数或其他东西传递吗?_Vb.net_Syntax - Fatal编程技术网

您可以在VB.NET中使用未命名的单行对象,而不将它们作为参数或其他东西传递吗?

您可以在VB.NET中使用未命名的单行对象,而不将它们作为参数或其他东西传递吗?,vb.net,syntax,Vb.net,Syntax,我记得我在VB.NET中使用了未命名的单行对象,没有将它们作为参数或任何东西传递。例如: New SqlCommand("some string", someSqlConnection) 不会编译,这也不会: (New SqlCommand("some string", someSqlConnection)) 在第二种情况下,添加的parantesse将允许您调用该对象上的函数,并将其返回值作为参数传递给其他函数,但当该对象或其函数之一未被用作另一个函数的参数时,它将不起作用 然而,这并不意

我记得我在VB.NET中使用了未命名的单行对象,没有将它们作为参数或任何东西传递。例如:

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)