Hvordan kan jeg sette verdien av auto eiendom backing felt i en struct konstruktør?

stemmer
19

Gitt en struct som dette:

public struct SomeStruct
{
    public SomeStruct(String stringProperty, Int32 intProperty)
    {
        this.StringProperty = stringProperty;
        this.IntProperty = intProperty;
    }

    public String StringProperty { get; set; }
    public Int32 IntProperty { get; set; }
}

Selvfølgelig er en kompilator feil genereres som leser The 'denne' objektet kan ikke brukes før alle feltene er tildelt .

Er det en måte å tilordne verdier til backing felt eller egenskapene selv, eller må jeg til å implementere egenskaper den gammeldagse måten med mine egne eksplisitte backing felt?

Publisert på 06/02/2009 klokken 21:36
kilden bruker
På andre språk...                            


2 svar

stemmer
45

Du må bruke "denne" konstruktør:

public SomeStruct(String stringProperty, Int32 intProperty) : this()
{
    this.StringProperty = stringProperty;
    this.IntProperty = intProperty;
}

Å gjøre dette kaller standardkonstruktør og ved å gjøre det, det initialiserer alle feltene, og dermed gir thisdet skal refereres til i den egendefinerte konstruktøren.

Svarte 06/02/2009 kl. 21:38
kilden bruker

stemmer
0

Hvis en struktur kommer til å ha, og brukerne vil forvente det å ha alle tre av følgende egenskaper:

  1. Hele sin tilstand er innkapslet i noen særlig bestemt gruppe lesbare medlemmer
  2. Et tilfelle kan lett opprettes i hvilken de lemmer ha en hvilken som helst kombinasjon av verdier som er gyldige for de respektive typer.
  3. En standard forekomst av typen bør ha alle de medlemmene satt til standardverdier for sine respektive typer.

typen bør eksponere sine medlemmer som felt. Kravene ovenfor bety en struct vil ikke være i stand til å gjøre noe en eksponert-feltet struct ikke kan gjøre, og vil også bety at dersom koden ikke treffer noen tråder farer struct vil være i stand til å gjøre noe en utsatt-feltet struct kan gjøre, om enn kanskje mer langsomt og med flere tråder farer.

Hvis en struct Foohar felt f1og f2, og en konstruktør som setter de feltene i den rekkefølgen, og hvis fooExprer en slags uttrykk av type Foo[kanskje en variabel, felt, array referanse, eiendom, eller hva] uttalelsen:

myFoo.f2 = someValue;

vil bare bli tillatt i tilfeller hvor man kunne lovlig si

myFoo = new Foo(myFoo.f1, someValue);

og i alle tilfeller hvor den første formen er tillatt, og virkemåten til den andre formen er definert semantikk, vil de oppføre seg likt. Dermed prøver å "kapsle" egenskapene Foogjør egentlig ikke gjøre noe annet enn å gjøre koden mer tungvint å skrive, mindre klart, og langsommere å kjøre.

Svarte 13/01/2013 kl. 04:31
kilden bruker

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