Difference between => constant to { get; } = constant [duplicate]

让人想犯罪 __ 提交于 2019-12-17 20:42:43

问题


In the context of best practice and performance (if any) what is better for exposing a value that is either set or calculated once as a property in C# 6+ style properties?

I'm comparing expression bodied properties

public string Name => "bob";

and auto-property initialisation

public string Name { get; } = "bob";

Does it desugar to the same thing? I can't find anywhere in the docs that says which to use for my case. I apologise if this is covered already in SO, the search got me no where.


回答1:


Beware! expression bodied properties will execute the expression every time they are called! You can see the examples in the last part of my answer.

public string Name => "bob";

Is syntactic sugar for

public string Name
{
    get
    {
        return "bob";
    }
}

While

public string Name { get; } = "bob";

is syntactic sugar for

private readonly string _name = "bob";

public string Name
{
    get
    {
        return _name ;
    }
}

Check it out yourself.

Beware - here is the dangerous part!

Please note that the expression body will be executed every time you call this property. That's fine when it's returning a hard coded value, but if it's returning a list, for example, it will return a new list every time:

public List<String> Names => new List<String>() {"bob"};

Is syntactic sugar for:

public List<string> Names
{
    get
    {
        return new List<string>() {"bob"};
    }
}

That is not the case with auto-property initialization:

public List<String> Names { get; } = new List<String>() {"bob"};

Is syntactic sugar for this:

private readonly List<string> _names = new List<string>() {"bob"};

public string Names 
{
    get
    {
         return _names;
    }
}

As you can see, here the list is only initialized once.

Check it out yourself.




回答2:


The first one is an arrow-function and results into a function which returns a constant value:

// syntactic sugar for:
public string Name { get { return "bob"; } }

// results into:
public string get_Name() 
{
    return "bob";
}

The second one is an auto-property, which results into a getter with backing field with value "bob":

// results into:
private string _name = "bob";
public string get_Name()
{
    return _name;
}


来源:https://stackoverflow.com/questions/46439675/difference-between-constant-to-get-constant

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!