2011-02-08 13 views
7

mam listę elemencie: user_stocks = new List<stock_Str>();Lista elemencie - wartość pozycji struktura jest zawsze zerowa

struct jest zdefiniowana:

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; 
} 

kiedy dodać przedmiot do listy Mam zrobić:

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); 

moje problemy:

  1. przy próbie zmiany wartości elementów listy (typu struct), nie zmieniaj ich!

  2. Moje dwie tablice dwóch int są zawsze ustawione na zero!

jak mogę to naprawić?

+2

Nie sądzisz, że używanie klasy będzie bardziej odpowiednie tutaj –

+4

To doskonały przykład tego, co może pójść źle, jeśli używasz zmiennych struktur, gdzie nie są one potrzebne (i rzadko są). – Botz3000

Odpowiedz

9

a: to nie powinna być struktura, w ogóle b: "wartość" struktury nigdy nie jest pusta; nawet Nullable<T> 's null jest odrobiną magicznej sztuczki z dymem, lustrami i błędem w kierunkach

Re problem;

1: tak, ponieważ struktury mają semantykę kopiowania; zostały zmienione na kopię - nie jest sam jeden

2: Prawdopodobnie to samo

Oto bardziej odpowiednie wdrożenie; Wyobrażam sobie, to będzie rozwiązać większość problemów:

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;} 
} 

jestem jasne, co intencją ostatnich 2 jest jednak osobiście wolałbym listę, jeśli jest to dynamiczna kolekcja, na przykład:

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

Pierwsze dzięki, drugie co polecacie? używając tablicy klas lub używając ogólnej listy? zasadniczo moje akcje są bardzo dynamiczne, mam na myśli to, że bardzo często muszę usuwać właściwości dodawania i zmiany. @Marc Gravell –

+0

"używając tablicy klas lub używając ogólnej listy?" Nie rozumiem - w jakim kontekście? Ale tak czy inaczej, usuwanie dodawania i zmieniania właściwości nie jest problemem ... –

2

Struktura jest typem wartości, więc nigdy nie dostajesz odnośnika, aby edytować tylko kopię.

Powinieneś także użyć klasy tutaj.

Powiązane problemy