Uttrykket er en verdi og kan derfor ikke være målet for et oppdrag

stemmer
2

Jeg løp inn i en sak ved hjelp av en struct i dag som fanget meg av vakt, og jeg håpet noen kunne kaste lys over det for meg.

Jeg har en struct definert slik:

public struct PaymentDetail
{
    public Decimal Amount{get;set;}
    public string CheckNumber{get;set;}
    public PaymentType PaymentType{get;set;}
}

Jeg har en klasse som inneholder denne informasjonen

public class Transaction
{
    public PaymentDetail Payment{get;}
}

Jeg har en presentasjon modell som der jeg ønsker å sette de underliggende eiendommene som dette

public class ViewModel
{
    public Decimal Amount
    {
        get{return _Transaction.PaymentDetail.Amount;}
        set
        {
             //This is the offending line of code
             _Transaction.PaymentDetail.Amount = value;
             RaisePropertyChanged(Amount);
        }
    }
}

Hva er merkelig er at jeg kan gjøre dette arbeidet hvis jeg endre betalings annonsen til en offentlig felt som dette:

public class Transaction
{
    public PaymentDetail Payment;
}

det er obviosuly noe jeg ikke forstår om structs som forårsaker dette. Er dette en dårlig idé? Finnes det en bedre måte? Hva gjør jeg galt?

Publisert på 25/03/2009 klokken 13:00
kilden bruker
På andre språk...                            


2 svar

stemmer
6

Først - ikke har foranderlig structs (dvs. en struct hvor du kan endre verdiene etter utbygging, via settere etc). Som er den primære årsaken til forvirring her.

Poenget er; når du kaller en eiendom (som Payment) får du en kopi av verdien (i ditt lokale stabelen området). For en klasse, som er en kopi av referansen (ingen problem). For en struct er det en kopi av struct selv. Eventuelle endringer i denne verdien vil bli forkastet, slik at kompilatoren har stoppet deg fra å miste data.

Når det er en offentlig felt, er du mutere den opprinnelige verdien direkte, noe som er grunnen til at det ikke har noe imot. Men mutere structs egentlig ikke er en god idé.

Gjør PaymentDetailen klasse; som er den riktige løsningen her ...

I NET, structs er ikke "objekter uten adferd" - de er "verdi-typer". Ting som "en valuta / verdi-par", "et tidsområde", etc kan fatte gyldige structs - men ikke PaymentDetail.

Svarte 25/03/2009 kl. 13:02
kilden bruker

stemmer
-3

Det er sannsynligvis fordi du utsette betaling som skrivebeskyttet, ingen setter. Siden en struct er en verditype, vil det ikke tillate deg å sette en eiendom på struct hvis struct er skrivebeskyttet.

Legge til en setter bør løse problemet.

Jeg vil også vurdere å endre PaymentDetail til en klasse. Jeg bare bruke structs når det er en helt grunnleggende verdi. Noe med tre egenskaper som dette, spesielt hvis man er en streng bør være en klasse.

Svarte 25/03/2009 kl. 13:08
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more