2011-02-08 25 views
7

tôi có một danh sách các cấu trúc: user_stocks = new List<stock_Str>();Danh sách cấu trúc - giá trị của các mục struct luôn là null

struct được định nghĩa:

public struct stock_Str 
{ 
    public String name; 
    public int quote ; 
    public int chenge; 
    public bool quote_a; 
    public bool chenge_a; 
    public int[] rate_alarm; 
    public int[] chenge_alarm; 
} 

khi tôi thêm mặt hàng vào danh sách tôi làm:

stock_Str str = new stock_Str(); 
str.name = tbStockName.Text; 
str.chenge_a = false; 
str.quote_a = false; 
str.quote = 0; 
str.chenge = 0; 
str.chenge_alarm = new int[2]; 
str.rate_alarm = new int[2]; 

for (int i = 0; i < 2; i++) 
{ 
    str.rate_alarm[i] = 0; 
    str.chenge_alarm[i] = 0; 
} 

_mainApp.user_stocks.Add(str); 

vấn đề của tôi:

  1. khi tôi cố gắng thay đổi giá trị của các mục danh sách (thuộc loại struct), nó không thay đổi chúng!

  2. hai mảng int của tôi luôn được đặt thành null!

làm cách nào để khắc phục?

+2

bạn không nghĩ rằng việc sử dụng lớp học sẽ phù hợp hơn ở đây –

+4

Đó là một ví dụ tuyệt vời về những gì có thể xảy ra nếu bạn sử dụng cấu trúc có thể thay đổi khi chúng không cần thiết (và hiếm khi chúng). – Botz3000

Trả lời

9

a: đó không phải là cấu trúc, tại tất cả b: "giá trị" của cấu trúc không bao giờ là rỗng; thậm chí Nullable<T> 's null là một chút của một ma thuật-trick với khói, gương và misdirection

Tái vấn đề;

1: có, đó là vì cấu trúc có ngữ nghĩa sao chép; bạn đã thay đổi một bản sao - không giống một

2: có lẽ là điều tương tự

Dưới đây là một việc thực hiện thích hợp hơn; Tôi tưởng tượng nó sẽ sửa chữa hầu hết các vấn đề của bạn:

public class Stock 
{ 
    public string Name {get;set;} 
    public int Quote {get;set;} 
    public int Chenge {get;set;} 
    public bool QuoteA {get;set;} 
    public bool ChengeA {get;set;} 
    public int[] RateAlarm {get;set;} 
    public int[] ChengeAlarm {get;set;} 
} 

Tôi không rõ ràng những gì mục đích của người cuối cùng 2, nhưng cá nhân Tôi muốn một danh sách nếu nó là một bộ sưu tập năng động, ví dụ:

private List<int> rateAlarms; 
    public List<int> RateAlarms { 
     get { return rateAlarms ?? (rateAlarms = new List<int>()); } 
    } 
+0

Lời cảm ơn đầu tiên, thứ hai bạn khuyên bạn nên làm gì? sử dụng mảng các lớp hoặc sử dụng một danh sách chung? cơ bản là cổ phiếu của tôi là rất năng động, tôi có nghĩa là rất thường xuyên tôi cần phải xóa thêm và thay đổi tài sản. @Marc Gravell –

+0

"sử dụng mảng lớp hoặc sử dụng danh sách chung?" Tôi không hiểu - trong bối cảnh nào? Nhưng một trong hai cách, việc xóa thêm và thay đổi các thuộc tính không phải là một vấn đề ... –

2

Cấu trúc là loại giá trị để bạn không bao giờ có tham chiếu về nó để chỉ chỉnh sửa bản sao.

Ngoài ra, bạn nên sử dụng lớp học tại đây.

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