当条件为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.我意识到我的路径是错误的。如果属性只有一个可能的值,那么根本不向开发人员提供设置它的能力!