我有一个类叫做" person ";它接受名字,年龄和体重属性。我试图确保,当一个人对象实例化,名称属性是至少5个字符,并包含一个空格。如果不是,我想抛出一个新的异常。下面是名称prop的setter:
public string Name
{
get
{
return this.name;
}
set
{
if (value.Length < 5 || value.Contains(" ") == false)
{
throw new ArgumentException("Invalid");
}
else
{
this.name = value;
}
}
}
我创建了一对无效数据的person对象,没有抛出异常。我的计划是在构造函数中使用try catch块来处理异常。我是不是走错路了?
这个程序中没有用户输入,它只是一个赋值。我们应该用无效数据实例化一些person对象来测试异常处理代码。下面是一个应该抛出异常的对象示例:
person p1 = new person("hi", 26, 165);
是类的构造函数:
public person(string Name, string Age, double Weight)
{
this.name = Name;
this.weight = Weight;
try
{
this.age = int.Parse(Age);
}
catch (FormatException)
{
WriteLine("Age must be an integer number. Age set to 0 by default.");
this.age = 0;
}
}
这是基于前面的赋值,我们必须将age作为字符串值并尝试解析它。
您没有在构造函数中调用Name
setter,因此没有调用属性setter。使用
this.Name = Name;
,以调用属性setter。
还有一些细节,但我也会使用:
if (value.Length < 5 || !value.Contains(" "))
而不是== false
,并给出更好的错误消息:
throw new ArgumentException("Name must be at least 5 characters and must contain a space", "Name");
你的构造函数应该是这样的
public person(string name, string age, double weight)
{
this.Name= name;
this.Age= age;
this.Weight = weight;
}
然后调用setter并在需要时抛出异常
你的名字属性不会抛出异常,因为你没有调用setter。使用这个
Name=name;
并且通常使用_作为私有成员,因此在name getter/setter中使用_name而不是name。
恕我直言,使用异常来描述代码流是个坏主意。所以不需要将Name定义为
public string Name {get; set; }
并将验证移动到构造函数
public person(string name, string age, double weight)
{
Weigt=weght;
if (name.Length < 5 || !value.Contains(" ") )
Consodle. WriteLine ($"Name {name} is not valid. Must be at least 5 characters and contain a space");
else Name = name
if (Double.TryParse(age, out number)) Age=age;
else
Console.WriteLine($"Unable to parse age {age}.");
}