【问题标题】:Is encapsulate a private field into a variable a good practice? C# [closed]将私有字段封装到变量中是一种好习惯吗? C# [关闭]
【发布时间】:2017-03-21 16:30:00
【问题描述】:

例如:

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

【问题讨论】:

  • 这样做有什么好处?我不清楚为什么要创建已有的变量。
  • 仅用于干净的命名。但我问这个问题是为了了解我是否正确!
  • "only for a clean naming" - 将类级成员命名为s,问题就变得没有意义了。如果需要改进现有代码,则改进现有代码。不要编写更多代码来混淆您要修复的代码,只需修复它即可。
  • 由于您没有提出明确的问题,因此这个问题是基于意见的,因为这两种情况(复制值或直接使用)都是有用的。例如。多线程。
  • 在当前状态下,问题感觉就像“为什么要在代码中将一个变量分配给另一个变量” - 这太宽泛且不具体。很少有人会编写没有此类分配的代码。

标签: c# coding-style


【解决方案1】:

首先,“封装”根本不是您正在做的事情。你说的是复制。在编程中,“封装”意味着隐藏字段并让每个人通过某种代码访问它。在 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. 
}

您是从哪里得到这个想法的?

【讨论】:

  • 不知道我从哪里得到这个想法。也许是我自己,也许我认为这样代码更干净,但我错了。
【解决方案2】:

我认为没有理由使用局部变量代理私有字段。大多数时候,该字段将是引用类型(即或多或少是一个类),因此使用局部变量仅意味着对该对象的引用。

如果您使用值类型字段(例如int)这样做,它实际上可能是有害的(无论如何,做一些意想不到的事情)。您将对局部变量进行操作,只要您阅读它就可以了;但在写入时字段不会改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2014-05-17
    • 2015-02-18
    • 2016-03-20
    相关资源
    最近更新 更多