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可以永远为空?
假设_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)
考虑上述两种方法,必须重新访问所有代码库并进行此检查。很明显,房地产获胜。
| 归档时间: |
|
| 查看次数: |
1423 次 |
| 最近记录: |