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
:如果您在发布模式下构建,您不会[总是?]得到堆栈溢出,“只是”一个无限循环。这可能是因为一些尾部调用消除或类似的优化。