6

今天给我看了一个例子,只是想检查一下下面两个是否真的会产生相同的效果,而不是,它们之间有什么区别。

这是:

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

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

谢谢。

4

3 回答 3

10

您需要支持字段,因为:

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

....就像你在你的例子中一样,将永远循环。

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

public static Service1Client MyFoo { get; set; }

static ServiceLayer()
{
    MyFoo = new Service1Client();
}
于 2013-01-24T18:42:25.123 回答
3

几乎,但没有。在您的公共财产中,您无法返回您正在获取和设置的对象。你需要一个支持领域。

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

在这种情况下,由于您只进行基本的获取和设置,因此可以使用自动属性。这相当于上面的代码。

public static Service1Client MyFoo { get; set; }
于 2013-01-24T18:43:22.493 回答
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();
}
于 2013-01-24T18:45:05.123 回答