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)
如果你有属性,它使用自己的数据,与属性所在的对象无关,那么我认为你应该从你的类中提取该属性.属性的意图是处理与声明属性的类相关的数据,并具有整个类的范围.
还要记住 - 属性只是一对方法的语法糖.
附注:您可以使用Lazy<T>字段的延迟初始化.例如
Lazy<int> field = new Lazy<int>(() => expensiveOperation());
Run Code Online (Sandbox Code Playgroud)