将私有字段封装成变量是一种好的做法吗? C#

时间:2017-03-21 16:30:00

标签: c# coding-style

例如:

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存储到另一个指向它的变量中?如果有一个属性而不是私有字段会怎么样?

2 个答案:

答案 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),那么它实际上可能是有害的(无论如何,做出非预期的事情)。您可以对局部变量进行操作,只要您阅读它就可以了;但在写上该字段不会改变。