Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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中typedef的等效或解决方法是什么?_Vb.net - Fatal编程技术网

VB.NET中typedef的等效或解决方法是什么?

VB.NET中typedef的等效或解决方法是什么?,vb.net,Vb.net,我正在编写一个VB.NET应用程序,它大量处理集合类型。请参阅下面的代码: Dim sub_Collection As System.Collections.Generic.Dictionary(Of String, System.Collections.ObjectModel.Collection) 上面这行我打了好多遍了。如果更改了集合类型,则必须对所有实例进行更改。因此,如果有一种方法可以使用“typedef等价物”,那么我就可

我正在编写一个VB.NET应用程序,它大量处理集合类型。请参阅下面的代码:

Dim sub_Collection As System.Collections.Generic.Dictionary(Of String, 
                             System.Collections.ObjectModel.Collection)
上面这行我打了好多遍了。如果更改了集合类型,则必须对所有实例进行更改。因此,如果有一种方法可以使用“typedef等价物”,那么我就可以解决所有这些问题。我尝试了导入,但它只用于名称空间,不能用于类。任何帮助都将不胜感激

注意:我使用的是VB 2008,windows XP。应用程序类型为windows窗体(VB)

编辑: 我根据格雷代码下面的答案做了一些尝试

这是第一次尝试

Imports dictionary_WaterBill = System.Collections.Generic.Dictionary(Of String, System.Collections.ObjectModel.Collection(Of WaterBill))
Structure WaterBill
...
...
End Structure
我得到的错误是

Error:Type 'WaterBill' is not defined.
Error:'Imports' statements must precede any declarations.
这是第二次尝试

Structure WaterBill
...
...
End Structure
Imports dictionary_WaterBill = System.Collections.Generic.Dictionary(Of String,     
System.Collections.ObjectModel.Collection(Of WaterBill))
我得到的错误是

Error:Type 'WaterBill' is not defined.
Error:'Imports' statements must precede any declarations.

欢迎任何人来阐明这个问题。

简单的解决方案就是为您正在使用的两个名称空间添加一个名称空间。一下子就消除了一半的长类型标识符

在代码文件的顶部,放置以下行:

Imports System.Collections
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
然后您的声明可以更改为:

Dim sub_Collection As Dictionary(Of String, Collection)
我推荐这种方法,因为它仍然使用标准名称,这使您的代码易于其他程序员阅读


另一种方法是使用
Imports
语句声明别名。比如:

Imports GenericDict = System.Collections.Generic.Dictionary(Of String,
                            System.Collections.ObjectModel.Collection)
然后您可以将您的声明更改为:

Dim sub_Collection As GenericDict


***顺便说一下,为了编译这些示例中的任何一个,您必须为
集合指定一个类型,例如
集合(字符串)

创建一个没有内容的继承类:

Class WaterBillDictionary
    Inherits System.Collections.Generic.Dictionary(Of String, System.Collections.ObjectModel.Collection(Of WaterBill))
End Class

Structure WaterBill
    ...
End Structure
如果您想要一个特定的构造函数,那么必须编写一个接受参数并将其传递给基构造函数的包装器。例如:

Public Sub New()
    MyBase.New()
End Sub

Public Sub New(capacity As Integer)
    MyBase.New(capacity)
End Sub

如果您需要更改WaterBillDictionary的名称,可以使用Visual Studio的重命名功能在整个解决方案中自动更改名称。

我非常非常讨厌.Net的一个地方是缺少typedefs。对不起-但我认为你的答案是“不”…:(我写.NET代码已经很多年了,我从来没有需要或想要过typedef。我们中的一个人肯定做错了什么。我非常非常喜欢Pascal的类型系统。C/C++typedef相比之下显得苍白。我猜.NET的回答是“将它包装在一个类中”。如果是这样的话,那就糟透了。Prabhakaran的“集合”这是一个很好的例子。IMHO…PS:仅仅因为你多年来一直使用带锤子的螺钉并不意味着你不会从螺丝刀中受益:)作为对编辑的回应,请注意,我说过要将
Imports
语句放在代码文件的顶部。编译器错误消息告诉您完全相同的事情:“错误:'Imports'语句必须在任何声明之前。”您还需要什么帮助?@Cody抱歉,我忘了添加更多代码。现在检查编辑。主要问题是字典。它要求声明参数。您必须明确地说like dictionary(字符串、System.Collections.etc.Collections)。我还必须为其他一些集合声明词典。Q:另外,不会“Imports MyDictionary=System.collections.Generic.Dictionary(字符串的形式,System.collections.ObjectModel.Collection)”吗必须在每个要使用别名的源模块中重复?@palsm4-如果要将别名应用于整个项目,可以将其放在项目导入的命名空间中。您可以在项目的属性->引用下执行此操作。在“导入的名称空间”文本框中输入
MyDictionary=System.Collections.Generic.Dictionary(字符串、System.Collections.ObjectModel.Collection)
,然后单击“添加用户导入”。然后,您可以在整个项目中使用MyDictionary,而无需导入每个文件。在任何“现代”语言(如Java或C#)中,绝对没有任何语言能与Pascal中声明类型和子类型的简单性和优雅性相匹配。。。或者甚至是Ada…值得注意的是,虽然继承的类可以替换基类,但是基类对于派生类既不能替换也不能强制转换。当然,这是继承的核心概念。。不用说