c#静态类属性

c#静态类属性,c#,static,static-members,C#,Static,Static Members,今天给我看了一个例子,我只是想看看下面两个例子是否真的具有相同的效果,而不是它们之间的区别 这是: private static Service1Client _myFoo; static ServiceLayer() { MyFoo = new Service1Client(); } public static Service1Client MyFoo { get { return _myFoo; } set { _myFoo = value; } } 这只是一种

今天给我看了一个例子,我只是想看看下面两个例子是否真的具有相同的效果,而不是它们之间的区别

这是:

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();
}
如果不是这样,它们之间有什么区别


谢谢。

您需要支持字段,因为:

public static Service1Client _myFoo
{
    get { return _myFoo; }
}
…就像你在例子中所说的那样,将永远循环

然而,C#确实提供了自动属性。您可以使用以下简单代码完成相同的任务:

public static Service1Client MyFoo { get; set; }

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

几乎可以,但是不行。在公共属性中,您不能返回正在获取和设置的对象。你需要一个后备场

private static Service1Client _myFoo
public static Service1Client MyFoo
{
     get { return _myFoo; }
     set { _myFoo = value; }
}
在这种情况下,由于您只执行基本的get和set,因此可以使用auto属性。这相当于上面的代码

public static Service1Client MyFoo { get; set; }
鉴于此代码:

public static Service1Client _myFoo
{
    get { return _myFoo; }
    set { _myFoo = value; }
}
无论何时使用getter或setter,您都会得到一个
stackoverflowxpetion
,因为setter会调用自己,而setter会调用自己,等等(直到堆栈空间用完为止)

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

public static Service1Client MyFoo {get;set;}

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

在第二个示例中,在属性
\u myFoo
中有递归。无论何时使用getter或setter只是为了挂起,您都会得到一个
stackoverflowxpetion
:如果您在发布模式下构建,您不会[总是?]得到堆栈溢出,“只是”一个无限循环。这可能是因为一些尾部调用消除或类似的优化。