2011-12-22 31 views
7

Tôi đang mã hóa một ứng dụng VB.NET mà rất nhiều giao dịch với một loại bộ sưu tập. Xem mã bên dưới:Tương đương hoặc giải pháp thay thế cho typedef trong VB.NET là gì?

Dim sub_Collection As System.Collections.Generic.Dictionary(Of String, 
          System.Collections.ObjectModel.Collection) 

Tôi phải nhập dòng trên nhiều lần. Nếu tôi thay đổi loại bộ sưu tập, thì tôi phải thực hiện thay đổi cho tất cả các phiên bản. Vì vậy, nếu có một cách để sử dụng "một typedef tương đương", sau đó tôi có thể thoát khỏi tất cả những vấn đề này. Tôi đã thử với nhập khẩu, nhưng nó chỉ dành cho không gian tên và nó không thể được sử dụng cho các lớp học. Bất kỳ bàn tay giúp đỡ sẽ được đánh giá rất nhiều.

Lưu ý: Tôi đang sử dụng VB 2008, Windows XP. Kiểu ứng dụng là các dạng cửa sổ (VB).

EDIT: Tôi đã thực hiện một số lần thử dựa trên câu trả lời dưới đây của code_gray.

Đây là lần thử đầu tiên.

Imports dictionary_WaterBill = System.Collections.Generic.Dictionary(Of String, System.Collections.ObjectModel.Collection(Of WaterBill)) 
Structure WaterBill 
... 
... 
End Structure 

Tôi đã nhận lỗi như

Error:Type 'WaterBill' is not defined. 

này được thử 2.

Structure WaterBill 
... 
... 
End Structure 
Imports dictionary_WaterBill = System.Collections.Generic.Dictionary(Of String,  
System.Collections.ObjectModel.Collection(Of WaterBill)) 

Tôi đã nhận lỗi như

Error:'Imports' statements must precede any declarations. 

Bất kỳ ai được chào đón để rơi ánh sáng về vấn đề này.

+0

Một trong những điều tôi thực sự, thực sự ghét về .Net là sự vắng mặt của typedefs. Xin lỗi - nhưng tôi nghĩ câu trả lời của bạn là "Không" ...: ( – paulsm4

+1

Tôi đã viết mã .NET trong nhiều năm và tôi chưa bao giờ cần hoặc muốn có một typedef. Một trong số chúng ta phải làm điều gì đó sai. –

+0

Một trong số những điều tôi thực sự, thực sự thích về Pascal là hệ thống kiểu của nó. C/C++ typedefs là nhạt so sánh.Tôi đoán trả lời của .Net là "bọc nó trong một lớp học" .Nếu vậy - đó là sucks. "Bộ sưu tập của Prabhakaran" là một tuyệt vời IMHO ... PS: chỉ vì bạn đã sử dụng ốc vít với một cái búa trong nhiều năm không có nghĩa là bạn sẽ không được hưởng lợi từ một tuốc nơ vít :) – paulsm4

Trả lời

2

Giải pháp đơn giản chỉ đơn giản là thêm Imports statement cho hai không gian tên mà bạn đang sử dụng. Ngay từ dơi, loại bỏ một nửa số định danh loại dài của bạn.

Ở phía trên cùng của tập tin mã của bạn, đặt dòng:

Imports System.Collections 
Imports System.Collections.Generic 
Imports System.Collections.ObjectModel 

Và sau đó tuyên bố của bạn có thể được thay đổi để:

Dim sub_Collection As Dictionary(Of String, Collection) 

tôi khuyên bạn nên phương pháp này vì nó vẫn sử dụng tên chuẩn, giúp mã của bạn dễ đọc đối với các lập trình viên khác.


Cách khác là sử dụng tuyên bố Imports để khai báo bí danh. Một cái gì đó như:

Imports GenericDict = System.Collections.Generic.Dictionary(Of String, 
          System.Collections.ObjectModel.Collection) 

Và sau đó bạn có thể thay đổi tuyên bố của bạn để:

Dim sub_Collection As GenericDict 


*** Bằng cách này, để có được một trong những mẫu để biên dịch, bạn sẽ phải để chỉ định loại cho Collection, chẳng hạn như Collection(Of String).

+1

Vấn đề chính là từ điển. Nó yêu cầu khai báo các tham số. Bạn phải nói rõ ràng như từ điển (Of String, System.Collections.etc.Collections). Tôi cũng phải khai báo các bộ từ điển cho một số bộ sưu tập khác. – prabhakaran

+0

Hỏi: Ngoài ra, sẽ không "Nhập khẩu MyDictionary = System.Collections.Generic.Dictionary (của String, System.Collections.ObjectModel.Collection)" phải được lặp lại trong mọi mô-đun nguồn muốn sử dụng bí danh? – paulsm4

+0

@ paulsm4 - Có. –

2

Tạo một lớp được thừa kế không có nội dung:

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

Structure WaterBill 
    ... 
End Structure 

Nếu bạn muốn có một nhà xây dựng cụ thể, bạn sẽ phải viết một wrapper chấp nhận các thông số và vượt qua chúng để các nhà xây dựng cơ bản. Ví dụ:

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

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

Nếu bạn đã bao giờ cần phải thay đổi tên của WaterBillDictionary, bạn có thể sử dụng tính năng đổi tên Visual Studio để tự động thay đổi tên trong toàn bộ giải pháp.

+2

Cần lưu ý rằng trong khi lớp được kế thừa sẽ được thay thế cho cơ sở, lớp cơ sở sẽ không thể thay thế được * cũng như không thể cast * đối với lớp dẫn xuất. – supercat

+0

tất nhiên - đó là khái niệm cốt lõi của thừa kế .. phần nào không cần phải nói – specializt

Các vấn đề liên quan