2015-09-17 9 views
9

sto cercando di risolvere il seguente esercizio:genera un errore quando l'utente entra nullo o vuoto stringa

È necessario creare una classe denominata Product che rappresenta un prodotto. La classe ha una singola proprietà denominata Name. Gli utenti della classe Product devono essere in grado di ottenere e impostare il valore della proprietà Name. Tuttavia, qualsiasi tentativo di impostare il valore di Name in una stringa vuota o un valore null dovrebbe generare un'eccezione. Inoltre, gli utenti della classe Product non dovrebbero poter accedere ad altri membri di dati della classe Product . Come creerai una classe del genere?

ho creato il seguente codice ma per qualche motivo non generare l'eccezione quando la stringa non valida:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Product newProduct = new Product(); 
     Console.WriteLine("Enter Product name:"); 
     newProduct.Name = null; //Console.ReadLine(); 
     Console.WriteLine("Product name is : {0}", newProduct.Name); 
     Console.ReadLine(); 
    } 
} 

class Product 
{ 
    private string name; 
    public string Name 
    { 
     get 
     { 
      return this.name; 
     } 
     set 
     { 
      if (Name != String.Empty || Name != null) 
      { 
       name = value; 
      } 
      else 
      { 
       throw new ArgumentException("Name cannot be null or empty string", "Name"); 
      } 
     } 
    } 
} 

è l'eccezione non torta perché non ho try-catch affermazione? Mi stavo anche chiedendo è possibile avere solo una dichiarazione catch senza una dichiarazione try?

+0

Si sta controllando il valore precedente (che è valido). Usa 'valore' invece di' Nome' in 'if' per convalidare il nuovo valore. Oppure prova a impostare 'Name' all'interno di' Main' due volte;) – Sinatr

+2

Non puoi prendere senza provare. Altrimenti, come farebbe a sapere di quale codice dovrebbe attingere? Anche se non hai un try/catch, le eccezioni vengono comunque lanciate. Non stai raggiungendo il codice. Impara a utilizzare gli strumenti di debug dell'IDE per scorrere il codice riga per riga mentre viene eseguito. Penso che individuerai il problema abbastanza velocemente in questo modo. – mason

+3

Stai usando un 'o' nella tua istruzione if. Se 'Nome == null', quindi' Name! = String.Empty' e quella parte passa. Usa '&&'. – JArkinstall

risposta

7

Lo stato if è errato. Facciamo una tabella di verità:

if (value != String.Empty || value != null) 

Name = null True Or False = True 
Name = "name" True Or True = True 
Name = ""  False Or True = True 

tuo if è sempre vero !

vorrei riscrivere così:

if (value == String.Empty || value == null) 
{ 
    throw new ArgumentException("Name cannot be null or empty string", "Name"); 
} 
else 
{ 
    name = value; 
} 

basta solo cambiare la O per e AND, ma penso che quanto sopra si legge meglio (il sottostante ha un inutile doppio negativo):

if (value != String.Empty && value != null) 
{ 
    name = value; 
} 
else 
{ 
    throw new ArgumentException("Name cannot be null or empty string", "value"); 
} 

Come dice Dmitrij Bychenko, non mi sono accorto che non ti testando per value. In getters you should use the value property. Non il nome della vostra proprietà


Il secondo parametro (ancora una volta rilevare da Dmitry Bychenko) nella vostra eccezione dovrebbe essere:

Il nome del parametro che ha causato l'eccezione corrente.

MSDN

che nel tuo caso è la stringa "value":

throw new ArgumentException("Name cannot be null or empty string", "value"); 
+0

Sì ma sintatticamente si legge meglio per cambiare le istruzioni. * La stringa vuota ** o ** null è errata *. – Liam

+0

errh dovresti sempre confrontare prima '! = Null' prima. È solo 'buona pratica', quindi non farai mai qualcosa del tipo 'if (x.Prop1 ==" test "&& x! = Null)' –

+0

Ma questo è un tipo di valore .... che non è rilevante qui. Questo vale solo per i tipi di riferimento. – Liam

12

Usa String.IsNullOrEmpty Method (String).Cambia la tua set in questo modo:

set 
{ 
     if (!string.IsNullOrEmpty(value)) 
     { 
      name = value; 
     } 
     else 
     { 
      throw new ArgumentException("Name cannot be null or empty string", "value"); 
     } 
} 

Inoltre è possibile utilizzare String.IsNullOrWhiteSpace Method (String) che indica se una stringa specificata è nullo, vuoto, o consiste solo di spazi vuoti.

3

Se volete diversi eccezioni nulla e su vuota stringa (spesso nulla significa che c'è qualcosa che non totalmente sbagliato, quando stringa vuota è solo un errore di formato ):

public string Name { 
    get { 
    return name; 
    } 
    set { 
    if (null == value) 
     throw new AgrumentNullException("value"); 
    else if (String.Equals(value, "")) 
     throw new AgrumentException("Empty values are not allowed.", "value"); 

    name = value; 
    } 
} 

Nel caso in cui non si desidera ridigitare loro:

public string Name { 
    get { 
    return name; 
    } 
    set { 
    if (String.IsNullOrEmpty(value)) 
     throw new AgrumentException("Null or empty values are not allowed.", "value"); 

    name = value; 
    } 
} 

Nota che in entrambi i casi è il value che è necessario testare, non una proprietà Name. Nel tuo codice originale il name (e quindi Name) valore iniziale è null e riceverai l'eccezione qualunque sia il che provi a impostare.

+0

questo è solo un semplice esercizio e credo di poter controllare sia la stringa vuota che quella vuota nella stessa eccezione, ma è un punto valido che hai fatto e lo terrò a mente. Grazie. – Pawel

Problemi correlati