c#静态类属性

时间:2013-01-24 18:41:04

标签: c# static static-members

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

这是:

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

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

感谢。

3 个答案:

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