在构造函数和定义中设置变量

tyh*_*tyh 2 c# class declaration

请注意以下内容......

//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() {}
}
Run Code Online (Sandbox Code Playgroud)

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

Ree*_*sey 8

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

不,事实上,这可能不是你想要的.这将使得无法设置"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;
        }
    }

    // ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

请注意,如果您希望该属性始终为常量(即:Bread始终返回"Amoroso"),则可以使该属性具有getter而不是setter:

public string Bread { get { return "Amoroso"; } }
Run Code Online (Sandbox Code Playgroud)

我怀疑情况并非如此,但我认为我会把它作为一种选择,以防它是你想要的.

  • 呃,你们两个正在争论破碎的代码. (2认同)