C#属性封装

t3d*_*son 3 c# coding-style properties

C#属性是我在交流家庭语言中发现的最具表现力的工具之一.我的问题是为什么"支持"字段不能在属性块内?什么理由不被允许?

public int Salary //Compile error
{
    int salary = 1000;
    get {} //custom use of salary
    set {} 
}
Run Code Online (Sandbox Code Playgroud)

我发现做以下事情相当笨重

int salary = 1000; //poor encapsulation but working code

public int Salary
{
    get {} //edit the private field salary
    set {} 
}
Run Code Online (Sandbox Code Playgroud)

我通过使用以下模式记忆属性来完成一些代码的优化

int field;
bool flag = false;
public int Field 
{
    get
    {
        if (flag)
            return field;
        flag = true;
        return field = expensiveOperation();
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的想将这些变量移动到属性的范围内,因为它们没有理由在实例的范围内

public int Field //compile error
{
    int field;
    bool flag = false;
    get
    {
        if (flag)
            return field;
        flag = true;
        return field = expensiveOperation();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 6

如果你有属性,它使用自己的数据,与属性所在的对象无关,那么我认为你应该从你的类中提取该属性.属性的意图是处理与声明属性的类相关的数据,并具有整个类的范围.

还要记住 - 属性只是一对方法的语法糖.


附注:您可以使用Lazy<T>字段的延迟初始化.例如

Lazy<int> field = new Lazy<int>(() => expensiveOperation());
Run Code Online (Sandbox Code Playgroud)