今天已经向我展示了一个例子,并且只想检查以下两者是否实际上具有相同的效果,而不是,它们之间有什么区别。
这是:
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();
}
如果不是这样,那么它们之间有什么区别?
感谢。
答案 0 :(得分:9)
您需要支持字段,因为:
public static Service1Client _myFoo
{
get { return _myFoo; }
}
....就像你在你的例子中将永远循环。
但是,C#确实提供了自动属性。你可以用这个简单的代码完成同样的事情:
public static Service1Client MyFoo { get; set; }
static ServiceLayer()
{
MyFoo = new Service1Client();
}
答案 1 :(得分:3)
几乎,但没有。在您的公共财产中,您无法返回您正在获取和设置的对象。你需要一个支持领域。
private static Service1Client _myFoo
public static Service1Client MyFoo
{
get { return _myFoo; }
set { _myFoo = value; }
}
在这种情况下,由于您只进行基本的get和set,因此可以使用auto属性。这相当于上面的代码。
public static Service1Client MyFoo { get; set; }
答案 2 :(得分: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();
}