例如:
public class Test
{
private string _s;
public Test()
{
var s = "hello";
_s = s;
}
public void Foo()
{
var s = _s;
// Use s for some reason.
}
}
我应该直接使用_s来满足我的需要,还是将_s存储到另一个指向它的变量中?如果有一个属性而不是私有字段会怎么样?
答案 0 :(得分:2)
首先,"封装"对你所做的事情一点都不说。你正在谈论制作副本。在编程中,要封装"封装"意味着隐藏字段并让每个人通过某种代码访问它。在C#中,几乎总是意味着一个属性(实际上只是被语法糖伪装的方法调用)。在其他语言中,它可能是显式的get和set方法。
因此。你应该复印吗?
是:
private int _from = 9;
public void f(int to)
{
for (int i = _from; i < to; ++i)
{
// stuff
}
}
没有
public f2()
{
Console.WriteLine("from is {0}", _from);
}
如果您在使用时更改了值,但您不希望更改私有字段,请制作本地副本并进行更改。
但要注意:int
等值类型的行为与SqlConnection
等可变引用类型的行为非常不同(见下文)。
如果你不想改变它,不要浪费你的时间。实际上,如果字段是引用类型并且您创建了对它的本地引用,那么维护代码时间的人可能会将其误认为是本地对象,并错误地认为对它的更改不会产生类范围的效果。
private SqlConnection _conn = null;
public MyClass()
{
_conn = new SqlConnection();
}
public void f3()
{
var c = _conn;
// 150 lines of stuff
// OK, I guess we're done with it now!
c.Dispose();
c = null;
// Now _conn is not null, yet the next call to f3() will find it unexpectedly
// in an invalid state. You really don't want that.
}
你从哪里得到这个想法?
答案 1 :(得分:0)
我认为没有理由使用局部变量代理私有字段。大多数情况下,该字段将是引用类型(即,或多或少,类),因此使用局部变量仅意味着对该对象的另一个引用。
如果您使用值类型字段(例如int
),那么它实际上可能是有害的(无论如何,做出非预期的事情)。您可以对局部变量进行操作,只要您阅读它就可以了;但在写上该字段不会改变。