2011-08-19 42 views
14

Tôi có cấu trúc do người dùng xác định trong danh sách mà tôi đang cố gắng thay đổi giá trị cho thành phần riêng lẻ trong danh sách cấu trúc. Việc truy cập phần tử không phải là vấn đề. Tuy nhiên, khi tôi cố gắng cập nhật các giá trị, trình biên dịch phàn nàn:Làm thế nào để bạn gán giá trị cho các phần tử cấu trúc trong một Danh sách trong VB.NET?

"Expression là một giá trị và do đó không thể là mục tiêu của nhiệm vụ "

Ví dụ:

Public Structure Person 

    Dim first as String 
    Dim last as String 
    Dim age as Integer 

End Structure 

_

Public Sub ListTest() 

    Dim newPerson as Person 

    Dim records as List (Of Person) 
    records = new List (Of Person) 

    person.first = "Yogi" 
    person.last = "bear" 
    person.age = 35 

    records.Add(person) 
    records(0).first = "Papa" ' <<== Causes the error 
End Sub 
+9

Mọi lập trình viên .NET đều mắc lỗi này một lần. Cấu trúc là một loại giá trị, các bản ghi (0) trả về một * bản sao *. Cập nhật thành viên "đầu tiên" của bản sao không thực hiện bất cứ điều gì. Người cần phải là một lớp. –

+0

Darn giả định chuyển giao từ c + +;). Cảm ơn vì tiền hỗ trợ. –

+0

@Hans: yeah, thật dễ dàng để quên rằng ngay cả 'bản ghi (0)' sẽ trả về bản sao của cấu trúc ... – IAbstract

Trả lời

13

Như các bình luận khác s viện trợ, khi bạn tham khảo hồ sơ (0), bạn nhận được một bản sao của cấu trúc vì nó là một loại giá trị. Những gì bạn có thể làm (nếu bạn không thể thay đổi nó thành một Class) là một cái gì đó như thế này:

Dim p As Person = records(0) 
p.first = "Papa" 
records(0) = p 

Mặc dù, tôi nghĩ rằng nó chỉ dễ dàng hơn để sử dụng một lớp.

+0

Chỉ cần chạy vào vấn đề này bởi vì tôi đã có một từ điển với giá trị là một cấu trúc chứ không phải là lớp. Cảm ơn các giải pháp đơn giản !! – DontFretBrett

+0

Vấn đề với điều này là nó sao chép toàn bộ cấu trúc thay vì chỉ con trỏ đến nó. Đó là lý do tại sao bạn phải sao chép nó trở lại. Double whammy. Rất nhiều chi phí. – Brain2000

+0

@ Brain2000 - Đồng ý, nhưng khi sử dụng các loại giá trị, bạn không có nhiều lựa chọn. 'Người 'phải là một lớp không chỉ vì lý do này, mà còn vì các cấu trúc có thể thay đổi được nản lòng. –

4

Thực tế, có hai các khái niệm quan trọng cần nhớ tại đây.

Một là, như Hans và Chris đã chỉ ra, Structure Person tuyên bố một loại giá trị trong đó bản được truyền giữa các cuộc gọi phương pháp. Tuy nhiên, bạn vẫn có thể truy cập (tức là, nhận bộ) các thành viên của một loại giá trị. Sau khi tất cả, này công trình:

Dim people(0) As Person 
people(0).first = "Yogi" 
people(0).last = "Bear" 
people(0).age = 35 

Vì vậy, các điểm quan trọng khác để nhận ra là records(0) truy cập vào lớp của List(Of Person) đặc biệt Itemtài sản, mà là một wrapper có đường xung quanh hai cuộc gọi phương pháp (một phương thức getter và setter). Đó là không truy cập mảng trực tiếp; nếu đó là (ví dụ: nếu records là một mảng), mã ban đầu của bạn thực sự sẽ hoạt động.

1

Tôi đã gặp vấn đề tương tự và tôi đã sửa nó bằng cách thêm một Tiểu đơn vị vào cấu trúc thay đổi giá trị của thuộc tính.

Public Structure Person 

Dim first as String 
Dim last as String 
Dim age as Integer 

Public Sub ChangeFirst(value as String) 
    me.first = value 
End Sub 

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