2

观察以下...

//pattern 1
public class Cheesesteak
{
    public string bread {get; private set}
    public string cheese {get; private set}

    public Cheesesteak()
    {
        bread = "Amoroso"; 
        cheese = "Cheez Whiz";
    }
}

//pattern 2
public class Cheesesteak
{
    public string bread 
    {
        get {return bread;}
        set 
        {
            bread = "Amoroso";
        }
    }
    public string cheese 
    {
        get {return cheese;}
        set
        {
            cheese = "Cheez Whiz";
        }
    }
    public Cheesesteak() {}
}

这是一个好奇的问题。在“集合”的定义中设置变量而不是在构造函数中声明它们是否有任何优势或特殊原因?我最初的猜测是模式 1 更短,但在编译期间效率更低。

4

3 回答 3

8

在“集合”的定义中设置变量而不是在构造函数中声明它们是否有任何优势或特殊原因?

不,事实上,这可能根本不是你想要的。这将无法设置“break”或“cheese”,因为任何调用,例如bread = "rye";,都会将其设置为“Amoroso”(如果它有效,但会导致 a StackOverflowException)。另请注意,尝试在代码中检索值将导致 a StackOverflowException,并且属性 getter 返回属性而不是支持字段值。

你可能会想到这个:

public class Cheesesteak
{
    private string bread = "Amoroso";
    public string Bread 
    {
        get {return bread;}
        set 
        {
            bread = value;
        }
    }

    // ...

此处唯一的优点是您在定义字段的位置设置“默认”值,这在某些情况下有助于提高可维护性或可读性,甚至可能消除对已定义构造函数的需求,这可能会减少代码的总长度.

我最初的猜测是模式 1 更短,但在编译期间效率更低。

通常,将字段设置为内联与将它们设置在构造函数中并不会降低效率。编译器将导致类型的实际构造函数首先设置字段,然后运行构造函数代码,因此两个版本最终(出于实际目的)在编译的 IL 方面相同。这不是效率问题,而是代码可读性和可维护性的问题。

请注意,如果您希望该属性始终是一个常量(即:Bread应该始终返回"Amoroso"),您可以让该属性有一个 getter 而没有 setter:

public string Bread { get { return "Amoroso"; } }

我怀疑情况并非如此,但我想我会提到它作为一个选项,以防万一它是你想要的。

于 2013-01-09T21:30:05.693 回答
1

好吧,第二个选项将导致StackOverflowException每当用户尝试分配访问属性时,而第一个选项将只允许对它们进行私有访问。

你的意思可能是这样的:

private string bread = "Amaroso";
public string Bread
{
    get { return bread; }
    private set
    {
        bread = value;
    }
}

这将使用“Amaroso”初始化属性,但不允许公开设置。

于 2013-01-09T21:30:59.290 回答
0

不,它们完全不同。getandset块实际上是在读取或写入属性时执行的方法。它们都与初始化有关

var x = thing.Property; // Property's "get" accessor method is executed
thing.Property = x; // Property's "set" accessor method is executed

在您的第二个示例中,两个属性访问器都将对其自身进行无限递归,您将获得 StackOverflowException。

于 2013-01-09T21:31:10.160 回答