2013-04-22 16 views
5
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      Position = Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      Position = 5; 
     } 
     return Position; 
    } 
    set 
    { 
     Position = value; 
    } 
} 

mio programma chiama la get e va in se loop e poi corre infitely in codice setio sono sempre in loop infinito in proprietà setter

+0

@ Knaģis ha il codice corretto, ma per spiegare ulteriormente il motivo: Pensa a questi getter e setter come funzioni perché è ciò che sono dietro le quinte. Se una funzione si chiama dentro, senza mezzi per uscire, sarai in un ciclo infinito. – bland

risposta

13

L'errore è perché nella tua set {} si invoca lo stesso setter in modo ricorsivo .

codice corretto sarebbe

private int _position; 
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      this._position = Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      this._position = 5; 
     } 
     return this._position; 
    } 
    set 
    { 
     this._position = value; 
    } 
} 
+3

Non hai davvero bisogno del trattino basso e "questo" allo stesso tempo. La maggior parte delle persone capirà che il trattino basso significa che ti stai riferendo a un membro locale, e non c'è nulla che debba essere disambiguato. –

+0

Il segno di sottolineatura è davvero solo una questione di abitudine per me (e molti altri), ma secondo me (e anche StyleCop http://stackoverflow.com/questions/1562540/why-does-stylecop-recommend-prefixing-method- o-proprietà-chiama-con-questo) 'questo 'dovrebbe essere obbligatorio sempre. –

+2

Sì, StyleCop è sbagliato. :) E la domanda Stack Overflow ha [opinioni dissenzienti] (http://stackoverflow.com/a/1562571/102937). –

4

utilizzare una variabile membro o forse memorizzarlo nella sessione.

private int _position; 
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      _position= Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      _position= 5; 
     } 
     return _position; 
    } 
    set 
    { 
     _position = value; 
    } 
} 
2

Non c'è niente di particolarmente simile a una stringa sugli elementi di stato sessione.

perché non si basta seguire il principio KISS e fare qualcosa di simile

public int Position 
{ 
    get { return (int) (Session["Position"] ?? 5) ; } 
    set { Session["Position"] = value ;    } 
} 

o (a seconda delle effettive esigenze/specifiche:

public int Position 
{ 
    get { return Session["Pointer"] as int? ?? position ?? 5 ; } 
    set { position = value ; } 
} 
private int? position ; // backing store 
+0

come 'int'? 'int' è il tipo di valore, come può essere' as'? –

+0

@KenKin: 'int?' È zucchero sintattico per 'Nullable ', un tipo di riferimento (e speciale, per l'avvio). Un dritto 'int' verrà incassato nel negozio della sessione; un 'int?' è a tutti gli effetti, già in scatola. Vedere la specifica, ISO 23270 § 14.9.11: * L'operatore as viene utilizzato per convertire esplicitamente un valore in un determinato tipo di riferimento o tipo nullable ... Quando la conversione di in un tipo nullable, l'operatore as utilizza una conversione di wrapping, un conversione unboxing o conversione di tipo nulla (§13.7.1) ... se la conversione indicata non è possibile, il valore risultante è nullo. * –

+0

Scusa .. solo un problema di leggibilità .. –

1

Un'immobili auto-implementato costituito da un getter, un setter e un backing field Se scrivi il codice tu stesso, un campo potrebbe non essere necessario

Il tuo getter invoca setter e il setter invoca il set ter; quella sarebbe una ricorsione infinita. Potrebbe essere necessario un campo per la memorizzazione di Position.

Tuttavia, se lo cambiamo con la memorizzazione in un campo, e il setter infatti non ha effetto. Quindi, il codice potrebbe essere cambiato in:

public int Position { 
    set { 
    } 

    get { 
     int x; 
     return (x=Convert.ToInt32(Session["Position"]))>0?x:5; 
    } 
} 

Non è necessario controllare per nulla, Convert.ToInt32(null) è zero.