2012-03-06 35 views
7

Tôi có một số mã VB6 cần được di chuyển sang VB.NET và tôi muốn hỏi về dòng mã này và xem có cách nào không để triển khai nó trong .NETTương đương với "Dim As String * 1" VB6 đến VB.NET

Dim strChar1 As String * 1 

Intellisense giữ cho tôi biết rằng kết thúc câu lệnh được mong đợi.

+5

Những gì bạn có ở đó là chuỗi có độ dài cố định. Làm thế nào để khai báo một trong VB.NET được thảo luận [ở đây] (http://stackoverflow.com/questions/2305377/how-to-declare-a-fixed-length-string-in-vb-net). –

+0

@Jay: Tôi cũng thấy điều đó, nhưng cá nhân tôi sẽ né tránh ** VBFixedStringAttribute **. Đó là một trong nhiều thứ trong không gian tên ** Microsoft.VisualBasic ** đã được chuyển từ VB6 sang VB.NET dễ dàng hơn khi .NET xuất hiện lần đầu tiên, nhưng IMHO hầu như luôn tránh được hầu hết công cụ trong không gian tên đó và lựa chọn chức năng .NET Framework "chuẩn" tương đương thay thế. Ý tôi là, họ thậm chí còn giữ mô hình xử lý lỗi VB6 cũ với 'Lỗi Trên',' Goto' và 'Tiếp tục', mặc dù ngoại lệ là cách dự định (và mạnh hơn) để xử lý các lỗi trong mã .NET ;-) –

+0

@ Mike - Tôi đã không thực sự nhìn vào lớp VBFixedStringAttribute để xác định nếu sử dụng nó là một ý tưởng tồi hay không, nhưng tôi tin rằng câu hỏi này là một dupe của một trong những tôi liên kết với. Tôi cũng nghĩ rằng câu trả lời của bạn tốt hơn câu trả lời ở đó, vì vậy +1 cho bạn. (và tất nhiên tôi đồng ý với bạn rằng việc sử dụng kiểu xử lý lỗi VB6 cũ là sự lựa chọn kém trong một ứng dụng VB.NET!) –

Trả lời

10

Được gọi là chuỗi "độ dài cố định". Không có một tương đương chính xác trong VB.NET.

Sửa: Vâng, OK, có VBFixedStringAttribute, nhưng tôi khá chắc chắn rằng tồn tại duy nhất để công cụ chuyển đổi tự động có thể dễ dàng hơn chuyển đổi mã VB6 để VB.NET cho bạn, và nó không thực sự "Cách .NET" để làm việc. Ngoài ra, hãy xem các cảnh báo trong bài viết để biết chi tiết về lý do tại sao điều này vẫn không chính xác giống như một chuỗi có độ dài cố định trong VB6.

Thông thường, các chuỗi dài cố định chỉ được sử dụng trong VB6 nếu bạn đang đọc bản ghi kích thước cố định từ tệp hoặc qua mạng (ví dụ: phân tích cú pháp tiêu đề trong khung giao thức). Ví dụ, bạn có thể có một tệp chứa một tập hợp các bản ghi có độ dài cố định tất cả đều có định dạng (số nguyên, 1 ký tự-chuỗi, đôi), mà bạn có thể đại diện trong VB6 với tư cách người dùng- định nghĩa loại:

 
Public Type Record 
    anInteger As Integer 
    aSingleCharacter As String * 1 
    aDouble As Double 
End Type 

Bằng cách này, mã VB6 mà đọc từ tập tin có chứa các bản ghi trong định dạng này có thể đọc từng cố định kích thước kỷ lục lưu trữ trong tập tin, và đặc biệt, nó sẽ chỉ đọc 1 byte cho aSingleCharacter. Nếu không có * 1, VB6 sẽ không biết có bao nhiêu ký tự để đọc từ tệp, vì một số String thường có thể có bất kỳ số ký tự nào.

Trong VB.NET, bạn có thể làm một trong những điều sau đây, tùy thuộc vào nhu cầu của bạn:

  • Nếu những vấn đề thời gian (tức là bạn cần phải đọc chính xác một byte từ một số nguồn dữ liệu, ví dụ) xem xét sử dụng một mảng thay vào đó, chẳng hạn như

    Dim aSingleByteArray(1) As Byte

  • Ngoài ra, bạn có thể sử dụng một trong những Stream lớp. Cụ thể, nếu bạn đang đọc dữ liệu từ ổ cắm mạng hoặc tệp, hãy xem xét sử dụng NetworkStream hoặc FileStream tương ứng. A Luồng có nghĩa là truy cập byte-byte (tức là truy cập nhị phân nguyên). StreamReader là một lớp liên quan giúp đơn giản hóa dữ liệu đọc khi nó dựa trên văn bản, do đó có thể tốt nếu bạn đang đọc tệp văn bản chẳng hạn. Nếu không (nếu xử lý dữ liệu nhị phân), hãy liên kết với một trong các lớp Luồng.

  • Nếu độ dài không quan trọng, bạn chỉ có thể sử dụng "bình thường" String.Đó là để nói:

    Dim aNormalString As String

nào câu trả lời là "đúng" thực sự phụ thuộc vào lý do tại sao nó được tuyên bố như vậy trong các mã VB6 gốc.

2

Thấy bạn đang di chuyển VB6, tôi chắc chắn sẽ xem xét VBFixedStringAttribute cũng như các tùy chọn khác được liệt kê bởi Mike Spross, nhưng trong trường hợp này, vì nó là một ký tự đơn, Char có thể là một tùy chọn trong trường hợp này quá.

Như đã đề cập ở nơi khác VBFixedString chỉ được xác nhận bởi GetPut API I/O VB. Vì vậy, giải pháp tốt nhất (trừ viết lại mã của bạn tham chiếu đến "chuỗi độ dài cố định") là viết số tiền tương đương của riêng bạn là Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString. Xem this answer để biết thêm chi tiết.

+0

Char chắc chắn là tương đương gần nhất. –

+3

@Derek: Liệu 'Char' có tương đương hay không phụ thuộc vào ngữ cảnh.Trong VB6, các chuỗi được lưu trữ dưới dạng Unicode, nhưng nếu bạn đang đọc hoặc ghi một tệp, một chuỗi '1 * được coi là một byte (8 bit), không phải là ký tự (16 bit), ngay cả khi bạn đặt Ký tự Unicode trong chuỗi. VB6 cũng tự động chuyển đổi các tham số chuỗi thành ASCII khi bạn gọi các hàm bên ngoài (tức là các cuộc gọi Windows API) được khai báo với tham số 'Chuỗi'. Lưu ý rằng, kiểu dữ liệu 'String' của VB.NET (được đề xuất trong câu trả lời của tôi) không phải là tương đương về mặt kỹ thuật cho cùng một lý do. Nó phụ thuộc vào những gì OP đang làm với nó. –

2

Các chuỗi độ dài cố định đã không được chấp nhận trong VB.NET vì có một số tùy chọn tốt hơn.

Vì chuỗi chiều dài cố định của bạn chỉ dài một ký tự, bạn có thể sử dụng loại Char trong trường hợp này, như Mark được đề xuất.

Dim strChar1 As Char 
Các vấn đề liên quan