Vb.net 在Visual Basic.NET中构造对象而不指定它

Vb.net 在Visual Basic.NET中构造对象而不指定它,vb.net,Vb.net,我已经使用VB.net好几年了,但不断遇到一些我不知道如何解决的小问题。好奇心终于征服了我,所以我现在问:有没有一种方法可以在不指定对象的情况下创建对象? 例如,假设我有一个引擎类,我想实例化它,并让它立即执行它需要执行的任何操作。如果在创建引擎之后我不需要对它做任何事情,那么到目前为止,我已经做了如下工作: Sub AddNewItemToList(TheList as MyListType, TheData as DataToGoInNewItem) GC.KeepAlive(New

我已经使用VB.net好几年了,但不断遇到一些我不知道如何解决的小问题。好奇心终于征服了我,所以我现在问:有没有一种方法可以在不指定对象的情况下创建对象?

例如,假设我有一个引擎类,我想实例化它,并让它立即执行它需要执行的任何操作。如果在创建引擎之后我不需要对它做任何事情,那么到目前为止,我已经做了如下工作:

Sub AddNewItemToList(TheList as MyListType, TheData as DataToGoInNewItem) GC.KeepAlive(New MyListNode(TheList, TheData)) End Sub 将myEngine设置为新发动机()

有没有办法避免“暗淡的myEngine as”部分?您当然可以使用Java。我可以用java中的“new Engine()”创建一个对象,而不将其分配给任何对象

为什么我需要这个?因为我经常想创建一个代理对象(因此我称之为“引擎”),它执行一些功能,但除此之外,我不需要引用它。我曾经让这样的对象有一个“public sub-perform”,但我发现这很麻烦——我宁愿创建对象,也不必担心记住调用它的perform方法。我发现,创建对我不打算使用的对象的引用在美学上令人不快

任何VB大师都有建议吗

谢谢


--Michael

要执行此操作,需要将新声明放在括号内()

您可以尝试以下语法:

Call New TheClass().Method1()
或:

DoSomething(New TheClass())
甚至:

DoSomething(New TheClass().GetStringData())

来源:

也许问题在于您的设计选择了执行实际工作的构造函数,而不是将实际工作放在方法中?构造函数用于从一组或多组参数构建对象的状态。方法执行操作

静态类确实可以有自己的私有方法和字段。当然,不是它们的实例,而是一个可以很好工作的“实例”

您能否更详细地了解一下这种设计选择/方法的原因,或许我们可以提供一些关于如何更有效地设计对象的见解

或者,您可以通过以下方式匿名创建对象并调用方法:

Call New obj().method()

也许你可以在一个模块中声明你的全局对象

Module GlobalModule
    Public x As Double = 110
    Public myObject As AutonomousObject = New AutonomousObject()    ' This will instantiate the object
End Module
。。。创建一个类

Public Class AutonomousObject
    Public Sub New()
        MessageBox.Show("Hello, I was instantiated now. " + System.Reflection.MethodBase.GetCurrentMethod().Name)
    End Sub

    Public Sub Start()
        MessageBox.Show("Hello, I am initialized! " + System.Reflection.MethodBase.GetCurrentMethod().Name)
    End Sub
End Class
。。。然后在任何地方使用它,无需再次实例化

Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click

    MessageBox.Show(GlobalModule.x)    ' Will display 110
    ' OR
    GlobalModule.myObject.Start()    ' This will call a method that will display a message
End Sub

有时,对象的构造函数将对象“连接”到另一个作为参数传递的对象,调用构造函数的代码将不再用于对象引用。我建议不要在类外使用忽略结果的“New”调用,而是应该提供一个包装器方法,如下所示:

Sub AddNewItemToList(TheList as MyListType, TheData as DataToGoInNewItem) GC.KeepAlive(New MyListNode(TheList, TheData)) End Sub Sub AddNewItemToList(列表为MyListType,数据为DataToInNewItem) GC.KeepAlive(新的MyListNode(列表、数据)) 端接头
GC.KeepAlive方法实际上可以称为“GC.佯装参数,但不要用它做任何事情”,这正是您在这里寻找的语义。

谢谢大家的回答。你们中似乎很少有人同意我的特殊设计选择,这很好,我很想听听你们对这个问题的看法。但首先让我解释一下我为什么要这么做

假设我有一个类Exporter,专门用于导出文件。它是一个类,而不是一个模块,因为我可能希望有几个导出器,每个导出器都有自己的设置,等等

将myExporter设置为新的导出器()

我的导出器需要提供一些数据,以及保存到其中的文件名。所以我现在有几个选择:

1) 保持导出器构造函数为空并添加 myExporter.performExport(数据、文件名)

我并不特别喜欢这样,如果导出器很复杂(我的前提是它很复杂——否则一个模块会做得很好),那么我希望它保持自己的状态,这可能只是与数据和文件名有关。重做构造函数更有意义,如选项2:

2) 在构造函数中传递参数:

将myExporter作为新的导出器(数据、文件名)进行dim

然后调用一个简单的无参数调用: myExporter.performExport()

这很好,但请注意,本质上,尽管我声明了myExporter,但我只是将其用作一个一次性调用:创建并执行导出。本质上,我不需要引用它,正如@brian-m所建议的,我可以这样做

调用新的导出器(数据、文件名)。performExport()

(@code gray,注意我现在如何使用一个没有引用的对象,但它不是非感官的)

但是现在我每次都要输入额外的代码——performExport()部分。如果我知道我总是希望在对象创建后立即对其进行操作(@brian-m,我同意在某些情况下,我可能希望准备对象,然后延迟执行,但在其他情况下,执行也可能在对象创建后立即进行),我也可以将操作代码放入构造函数中,所以我不担心忘记打电话。所以现在我有了

将myExporter作为新的导出器(数据、文件名)进行dim

无需进一步调用,因为它在创建时立即导出。从程序的其他部分来看,我不关心导出器一旦完成后会发生什么事情——我不是想挂断垃圾收集的电话,我只是想说我不需要维护对导出器的引用

到目前为止还好吗?如果是这样的话,那么我希望你会同意我的观点,那就是去掉“dim myExporter as”部分,只留下“新导出器(数据、文件名)”,这会更有意义。但是VB.NET与Java不同,它似乎不允许这样做

谢谢你的阅读,我期待着听到你的建议


--迈克尔

如果我理解正确,那么你是在试图避免记忆
GetType(Engine).GetConstructor(types:= New Type(){} ).Invoke(parameters:= New Object(){})