属性永远不会为空c#

H B*_*amy 3 c# reflection refactoring properties

当重构代码时,我想出了如下的实例

private string _property = string.Empty;
public string Property
{
    set { _property = value ?? string.Empty); }
}
Run Code Online (Sandbox Code Playgroud)

后来在一种方法中我看到以下内容:

if (_property != null)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

假设_property仅由 的 setter 设置Property,这段代码是否多余?

即有没有什么办法,通过反射魔法或其他方法_property可以永远为空?

Chr*_*tos 6

假设_property只是由Property的setter设置的,那么这段代码是多余的吗?

准确来说,是多余的。这就是属性的实际目的。我们不应该直接访问类的字段。我们应该使用属性来访问它们。因此,在相应的 setter 中,我们可以嵌入任何逻辑,并且可以放心,每次尝试设置值时,都会再次验证该逻辑。即使对于类的方法,这个论点也成立。在方法中,我们必须使用属性而不是实际字段。此外,当我们想要读取字段的值时,我们应该使用相应的getter。

一般来说,属性增强了封装的概念,这是面向对象编程 OOP 的支柱之一。

很多时候,当我们想要设置一个值时,不应该应用任何逻辑。以下面的例子为例:

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们已经声明了一个代表客户的类。Customer 对象应具有三个属性 an Id、 aFirstName和 a LastName

当有人读这个类时,一个直接的问题是为什么有人应该在这里使用属性?

答案还是一样的,它们提供了一种封装机制。但让我们考虑一下,从长远来看,这对我们有何帮助。假设有一天有人决定客户的名字应该是长度小于 20 的字符串。如果上面的类声明如下:

public class Customer
{
    public int Id;
    public string FirstName;
    public string LastName;
}
Run Code Online (Sandbox Code Playgroud)

FirstName那么我们应该检查我们创建的每个实例的长度!否则,如果我们选择了带有属性的声明,我们就可以轻松地使用数据注释

public class Customer
{
    public int Id { get; set; }
    [StringLength(20)]
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

就是这样。另一种方法可能如下:

public class Customer
{
    public int Id { get; set; }
    private string firstName;
    public string FirstName 
    { 
        get { return firstName }
        set
        {
            if(value!=null && value.length<20)
            {
                firstName = value;
            }
            else
            {
                throw new ArgumentException("The first name must have at maxium 20 characters", "value");
            }
        } 
    }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

考虑上述两种方法,必须重新访问所有代码库并进行此检查。很明显,房地产获胜。