我正在尝试解决以下问题:
您需要创建一个代表产品的名为
Product
的类。 该类有一个名为Name
的属性。Product
类的用户 应该能够获取并设置Name
属性的值。然而, 任何将Name
的值设置为空字符串或null的尝试 值应引发异常。此外,Product
类的用户 不应该访问Product
的任何其他数据成员 类。你将如何创建这样一个类?
我创建了以下代码但由于某种原因,当字符串无效时它不会抛出异常:
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");
}
}
}
}
是不是因为我没有try-catch
语句而抛出异常?
我还想知道是否有可能只有没有try语句的catch语句?
答案 0 :(得分:12)
使用String.IsNullOrEmpty Method (String)
。像这样更改set
:
set
{
if (!string.IsNullOrEmpty(value))
{
name = value;
}
else
{
throw new ArgumentException("Name cannot be null or empty string", "value");
}
}
此外,您可以使用String.IsNullOrWhiteSpace Method (String)
指示指定的字符串是空,空还是仅由空格字符组成。
答案 1 :(得分:7)
您的if
州错了。我们来做一个真值表:
if (value != String.Empty || value != null)
Name = null True Or False = True
Name = "name" True Or True = True
Name = "" False Or True = True
您的if语句始终为真!
我会重写它:
if (value == String.Empty || value == null)
{
throw new ArgumentException("Name cannot be null or empty string", "Name");
}
else
{
name = value;
}
您可以将Or更改为AND和AND但我认为以上内容更好(下面有不必要的双重否定):
if (value != String.Empty && value != null)
{
name = value;
}
else
{
throw new ArgumentException("Name cannot be null or empty string", "value");
}
正如Dmitry Bychenko所说,我没有注意到你没有为value
进行测试。 In getters you should use the value
property。不是您的属性
您的例外中的第二个参数(由Dmitry Bychenko再次指出)应为:
导致当前异常的参数名称。
在您的情况下是字符串"value"
:
throw new ArgumentException("Name cannot be null or empty string", "value");
答案 2 :(得分:3)
如果您希望 null 上的不同的例外和空字符串(通常 null 意味着某些事情是< em>完全错误,当空字符串只是一个格式错误)时:
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;
}
}
如果您不想取消他们:
public string Name {
get {
return name;
}
set {
if (String.IsNullOrEmpty(value))
throw new AgrumentException("Null or empty values are not allowed.", "value");
name = value;
}
}
请注意,在这两种情况下,您必须测试value
,而不是属性Name
。在您的原始代码中,name
(以及Name
以及初始值是null
并且您将获得异常<你试图设置的。