2013-01-24 141 views
3

今天我已经向我展示了一个例子,并且只是想检查以下两个实际上是否具有相同的效果,而不是它们之间的区别。c#静态类属性

是这样的:

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(); 
} 

如果不是这种情况下,它们之间有什么区别呢?

谢谢。

+2

你必须在第二个例子中的属性'_myFoo'递归。 –

回答

9

需要,因为后备字段:

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

....就像你在你的例子有将永远循环下去。

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

public static Service1Client MyFoo { get; set; } 

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

几乎,但没有。在你的公共财产中,你不能返回你得到和设置的对象。你需要一个支持领域。

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

在这种情况下,因为您只是在进行基本的get和set操作,所以可以使用auto属性。这相当于上面的代码。

public static Service1Client MyFoo { get; set; } 
3

鉴于此代码:

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

你会得到一个StackOverflowExcpetion使用getter或因为二传手自称为setter,它会调用本身等任何时间(直到你用完堆栈空间)。成功缩短了第一个例子是

方式一:

public static Service1Client MyFoo {get;set;} 

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

_你会在任何时候使用getter或setter_都会得到一个'StackOverflowExcpetion'只是为了使用:如果你建立在Release模式下,你将不会[总是?]得到一个堆栈溢出,“只是”一个无限循环。这可能是因为一些尾巴消除或类似的优化。 –