Pawel Pawel - 3 years ago 168
C# Question

Throw an error when the user enter null or empty string

I'm attempting to resolve the following exercise:


You need to create a class named
Product
that represents a product.
The class has a single property named
Name
. Users of the
Product
class
should be able to get and set the value of the
Name
property. However,
any attempt to set the value of
Name
to an empty string or a null
value should raise an exception. Also, users of the
Product
class
should not be able to access any other data members of the
Product

class. How will you create such a class?


I have created the following code but for some reason it does not throw the exception when the string is invalid:

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");
}
}
}
}


Is the exception not thrown because I do not have
try-catch
statement?
I was also wondering is it possible to have only catch statement without try statement?

Answer Source

Your if state is wrong. Let's do a truth table:

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

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

Your if statement is always true!

I would re-write it thus:

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

you could just change the Or to and AND but I think the above reads better (the below has an unnecessary double negative):

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

As Dmitry Bychenko says, I didn't notice you were not testing for value. In getters you should use the value property. Not the name of your property


The second parameter (again pointed out by Dmitry Bychenko) in your exception should be:

The name of the parameter that caused the current exception.

MSDN

which in your case is the string "value":

throw new ArgumentException("Name cannot be null or empty string", "value");
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download