【问题标题】:c# Static Class Propertyc# 静态类属性
【发布时间】:2013-01-24 18:41:03
【问题描述】:

今天给我看了一个例子,只是想检查一下下面两个实际上是否会产生相同的效果,而不是,它们之间有什么区别。

这是:

private static Service1Client _myFoo;

static ServiceLayer()
{
    MyFoo = new Service1Client();
}

public static Service1Client MyFoo
{
    get { return _myFoo; }
    set { _myFoo = value; }
}

这只是一种冗长的方式:

public static Service1Client _myFoo
{
    get { return _myFoo; }
    set { _myFoo = value; }
}

static ServiceLayer()
{
    _myFoo = new Service1Client();
}

如果不是这样,它们之间有什么区别?

谢谢。

【问题讨论】:

  • 在第二个示例中,您在属性 _myFoo 中有递归。

标签: c# static static-members


【解决方案1】:

您需要支持字段,因为:

public static Service1Client _myFoo
{
    get { return _myFoo; }
}

....就像您在示例中所做的那样,将永远循环。

但是,C# 确实提供了自动属性。你可以用这个简单的代码完成同样的事情:

public static Service1Client MyFoo { get; set; }

static ServiceLayer()
{
    MyFoo = new Service1Client();
}

【讨论】:

    【解决方案2】:

    几乎,但没有。在您的公共财产中,您不能返回您正在获取和设置的对象。您需要一个支持字段。

    private static Service1Client _myFoo
    public static Service1Client MyFoo
    {
         get { return _myFoo; }
         set { _myFoo = value; }
    }
    

    在这种情况下,由于您只是进行基本的获取和设置,因此您可以使用自动属性。这相当于上面的代码。

    public static Service1Client MyFoo { get; set; }
    

    【讨论】:

      【解决方案3】:

      鉴于此代码:

      public static Service1Client _myFoo
      {
          get { return _myFoo; }
          set { _myFoo = value; }
      }
      

      您将在任何时候使用 getter 或 setter 时获得 StackOverflowExcpetion,因为 setter 会调用自己,而后者会调用自己等(直到您用完堆栈空间)。

      成功缩短第一个示例的一种方法是:

      public static Service1Client MyFoo {get;set;}
      
      static ServiceLayer()
      {
          MyFoo = new Service1Client();
      }
      

      【讨论】:

      • 您将在任何时候使用 getter 或 setter 时获得一个 StackOverflowExcpetion 只是悬而未决:如果您在 Release 模式下构建,您不会 [总是? ] 得到一个堆栈溢出,“只是”一个无限循环。这可能是因为一些尾调用消除或类似的优化。
      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      相关资源
      最近更新 更多