当条件为true时,如何防止创建类的实例。C#
我的课程是:当条件为true时,如何防止创建类的实例。C#,c#,c#-4.0,C#,C# 4.0,我的课程是: public class Pos { int x; int y; public int X { get { return x; } set { try { if (value == 3) { x =
public class Pos
{
int x;
int y;
public int X
{
get
{
return x;
}
set
{
try
{
if (value == 3)
{
x = value;
}
}
catch
{
throw new ArgumentException();
}
}
}
public int Y { get; set; }
public Pos(int x, int y)
{
X = x;
Y = y;
}
}
我创建了一个实例,X=0。也就是说,据我所知,在value=3->x=0和构造函数x=0的情况下,创建类的实例。
当x属性设置程序失败时,如何防止创建类的实例?
我将创建一个不应包含“错误”对象的列表。我很难理解这段代码应该做什么以及问题与它的关系,但我想您可能会问“如何验证属性设置器参数的正确性?” 遵循以下模式:
// Class names should be words, not abbrvtns like "Pos"
public class Position
{
private int x;
private bool IsValidX(int possibleX)
{
// Here return true if possibleX is valid, false otherwise
}
public int X
{
get { return this.x; }
set
{
if (!IsValidX(value))
throw new ArgumentException("explanation here", "value");
this.x = value;
}
}
// Now do the same thing for Y.
public Position(int x, int y)
{
if (!IsValidX(x))
throw new ArgumentException("explanation here", "x");
if (!IsValidY(y))
throw new ArgumentException("explanation here", "y");
this.x = x;
this.y = y;
}
}
请注意,我们希望抛出不同的参数异常,因为每种情况下的参数名称都不同。我怀疑您对通过
new
创建引用类型实例时发生的操作顺序有误解。首先分配实例并将其字段初始化为默认值;在这种情况下为零。其次,执行构造函数。第三,如果构造函数抛出,那么new
操作抛出,除非您将引用保存在某个地方,否则它将变成垃圾。如果构造函数没有抛出,那么引用将由new
表达式生成。我无法理解这段代码应该做什么,或者问题是什么。你能澄清一下吗?为什么会有一个只允许设置一个值的setter?如果属性不打算更改为3以外的任何值,那么为什么会有setter呢?“当setter失败时,阻止类的实例被创建”是什么意思?如果有setter正在运行,那么它必须在已经创建的实例上运行。我也不明白try-catch
打算做什么。try中的代码无法抛出,因此捕获无效。您是否打算将其作为if-else
而不是try-catch
?我真的很难理解你想在这里做什么。谢谢你的回复。这对我有好处。如果您感兴趣,我的目标是阻止类的实例化,如果值!=3.我意识到我的路径是错误的。如果属性只有一个可能的值,那么根本不向开发人员提供设置它的能力!