skjule parameterless konstruktør på struct

stemmer
22

Er det mulig å skjule parameterless konstruktør fra en bruker i C #

Jeg ønsker å tvinge dem til å alltid bruke konstruktøren med parametere

f.eks denne posisjonen klassen

public struct Position
{
    private readonly int _xposn;
    private readonly int _yposn;

    public int Xposn
    {
        get { return _xposn; }
    }

    public int Yposn
    {
        get { return _yposn; }
    }

    public Position(int xposn, int yposn)
    {
        _xposn = xposn;
        _yposn = yposn;
    }        
}

Jeg ønsker bare at brukere skal kunne nytt opp en posisjon ved å angi x- og y-koordinater

Imidlertid er parameterless konstruktør ALLTID noe ledig

Jeg kan ikke gjøre det privat. Eller enda definere det som offentlig

Jeg har lest dette Hvorfor kan jeg ikke definere en standardkonstruktør for en struct i .NET?

men det blir ikke virkelig hjelpe

Hvis dette ikke er mulig - hva er den beste måten å oppdage om plassering jeg blir vedtatt har verdier?

Explicity sjekker hver eiendom feltet? Er det en stiligere måte?

Takk

Publisert på 11/02/2009 klokken 03:40
kilden bruker
På andre språk...                            


4 svar

stemmer
23

Nei, du kan ikke gjøre dette. Som du sa, lignende spørsmål har blitt spurt før - og jeg trodde svaret var ganske klart at du ikke kunne gjøre det.

Du kan opprette en privat parameterless konstruktør for en struct , men ikke i C #. Men selv om du gjør at det ikke virkelig hjelpe - fordi du lett kan omgå det:

MyStruct[] tmp = new MyStruct[1];
MyStruct gotcha = tmp[0];

Det vil være standardverdien MyStruct - den "nuller" verdi - uten noen gang å kalle en konstruktør.

Du kan enkelt legge til en Valider metode til struct og ringe at hver gang du fikk en som en parameter, riktignok.

Svarte 11/02/2009 kl. 07:33
kilden bruker

stemmer
4

Nope kan ikke skjule det. Structs kan ikke omdefinere null arg konstruktør, så derfor sin synlighet kan ikke omdefineres.

Svarte 11/02/2009 kl. 03:47
kilden bruker

stemmer
2

Vel en struct er bokstavelig talt en erklæring om hvordan hukommelsen vil sitte.

Selv når du bruker et objekt, er gjenstander pekeren erklært, uavhengig av om det er null.

Grunnen til at du ikke kan skjule konstruktøren er fordi struct krever at CLR kan lage det som internt det må gjøre dette.

Du kan konvertere dette struct til et objekt for å oppnå denne oppgaven. Eller bruk statisk analyse for å sikre at det er intialized før du bruker den?

struct point
{
   int xpos;
   int ypos;
}

Ha en google for uforanderlige objekter, synes dette å være hva din etter. Jeg tror at de ønsker å legge til denne funksjonen (men ikke i C 4 #) til språket selv, fordi det er et felles krav. Er det et særskilt behov for en struct her?

Svarte 11/02/2009 kl. 03:47
kilden bruker

stemmer
1

Du kan ikke lage en struct med en privat parameter-mindre konstruktør eller erklære en parameter-mindre konstruktøren. Du må endre den til en klasse. Structs ikke tillate å erklære en parameterless konstruktør.

Fra Structs Tutorial på MSDN:

Structs kan erklære konstruktører, men de må ta parametere. Det er en feil å erklære en standard (parameterless) konstruktør for en struct. Struct medlemmer kan ikke ha initializers. En standardkonstruktør er alltid gitt initial struct medlemmer til standardverdiene.

Fra # spesifikasjonen C på MSDN:

11.3 klasse og struct forskjeller

Structs avvike fra klasser i flere viktige måter:

  • Structs er verdityper (§ 11.3.1).
  • Alle struct typer implisitt arver fra klassen System.ValueType (avsnitt 11.3.2). Tilordning til en variabel av en struct typen skaper en kopi av den verdi blir tildelt (avsnitt 11.3.3).
  • Standardverdien på en struct er verdien produsert ved å sette alle verdi typen felt til standardverdiene, og alle referansen typen felt til null (avsnitt 11.3.4). Boksing og unboxing operasjoner brukes til å konvertere mellom en struct type og objekt (avsnitt 11.3.5).
  • Betydningen av dette er forskjellig for structs (§ 11.3.6).
  • Eksempel felt erklæringer for en struct er ikke tillatt å inkludere variable initializers (§ 11.3.7).
  • En struct er ikke tillatt å erklære en parameterless eksempel konstruktør (avsnitt 11.3.8).
  • En struct er ikke tillatt å erklære en destructor (avsnitt 11.3.9).
Svarte 11/02/2009 kl. 05:42
kilden bruker

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