C# - 检查是否设置了整数属性

Gui*_*Gui 9 c# properties

我正在验证一些属性,我需要知道其他层是否设置了长整数值.

例如,这个类::

public class Person 
{
    public int Age {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

当我设置的新实例年龄得到值0.但我要验证,如果年龄分别设置,因为年龄可以为零(不,当然这种情况下).

我想到的一个解决方案是使用int作为可空整数(public int?Age),并在Person的构造函数中将Age设置为null.

但我试图避免它,因为我必须更改太多的类只是为了检查Age.HasValue并将其用作Age.Value.

有什么建议?

Are*_*ren 21

Int默认初始化为0; 假设您不想使用int?哪种方式适合您.你可以检查,或者你可以有一个标志和一个支持字段:

private int _age;
public int Age 
{ 
  get { return _age; } 
  set { _age = value; _hasAge = true; } 
}

public bool HasAge { get { return _hasAge; } }
Run Code Online (Sandbox Code Playgroud)

如上所述,您可以将其初始化为无效状态:

private int _age = -1;
public int Age 
{ 
  get { return _age; } 
  set { _age = value; _hasAge = true; } 
}

public bool HasAge { get { return _age != -1; } }
Run Code Online (Sandbox Code Playgroud)

或者只是分解并使用 int?

public int? Age { get; set; }
public bool HasAge { get { return Age.HasValue; } }
Run Code Online (Sandbox Code Playgroud)

为了与代码向后兼容,您可以在int?不暴露它的情况下将其备份:

private int? _age;
public int Age
{
  get { return _age.GetValueOrDefault(-1); }
  set { _age = value; }
}

public bool HasAge { get { return _age.HasValue; } }
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 6

没有一个字段(或自动实现的属性)已相差明确设置为默认值,并且从来没有设置一个.

A Nullable<int>绝对是走到这里的方式 - 但是您需要考虑使用最干净的API.

例如,您可能需要:

public class Person 
{
    private int? age;

    public int Age
    {
        // Will throw if age hasn't been set
        get { return age.Value; }
        // Implicit conversion from int to int?
        set { age = value; }
    }

    public bool HasAge { get { return age.HasValue; } }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您Age直接在假设已经设置的地方阅读- 但是当他们想要小心时测试它.