繁体   English   中英

c#静态类属性

[英]c# Static Class Property

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

这是:

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

StackOverflowExcpetion使用getter或setter时都会得到一个StackOverflowExcpetion ,因为setter会调用自身,它会调用自身等等(直到你的堆栈空间用完为止)。

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

public static Service1Client MyFoo {get;set;}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM