gpt4 book ai didi

c# - Expression-Bodied Function 与 Auto Properties 结合会导致问题

转载 作者:行者123 更新时间:2023-11-30 20:20:28 26 4
gpt4 key购买 nike

在最终升级到 VS2015 并开始使用 .NET4.6 之后,当我遇到旧类时,我一直在使用一些语法糖。

不幸的是,这并不总是一帆风顺:/下面是一个例子。

我有这个可用的现有代码。

private static string _bootstrapBundle;
public static string BootstrapBundle
{
get
{
return _bootstrapBundle;
}
}

使用表达式主体的快速重写给了我这个,它有效

private static string _bootstrapBundle;
public static string BootstrapBundle => _bootstrapBundle;

这也可以重写为使用自动属性,就像下面的代码一样有效

public static string BootstrapBundle { get; private set; }

如果我尝试更进一步,并写下以下内容,那是行不通的

private static string _bootstrapBundle;
public static string BootstrapBundle { get; private set; } = _bootstrapBundle;

所有三个代码示例都可以正常编译,但是当我稍后尝试像下面这样分配一个值时,只有最后一段代码无法为 BootstrapBundle 分配任何内容。

BootstrapBundle = SquishIt.Framework.Bundle.Css()
.Add("/assets/stylesheets/Theme/" + theme + "/Bootstrap/bootstrap.less")
.Render("/assets/Cache/bootstrap.css");

这怎么可能?表达式的解析方式不同吗?在不同的时间?我在滥用语法吗?

最佳答案

让我们逐一浏览您给出的选项,看看每个选项的作用:

  1. private static string _bootstrapBundle;
    public static string BootstrapBundle
    {
    get
    {
    return _bootstrapBundle;
    }
    }

    我假设我不必解释它的作用。但请注意,如果您尝试分配给 BootstrapBundle,它将在编译时失败,因为没有 setter。但是您可以通过直接分配给字段来解决这个问题。

  2. private static string _bootstrapBundle;
    public static string BootstrapBundle => _bootstrapBundle;

    这与#1 完全相同,只是语法更简洁。

  3. public static string BootstrapBundle { get; private set; }

    这里我们有一个自动属性,这是一个具有隐藏(不可描述的)支持字段的属性。它编译为:

    private static string <BootstrapBundle>k__BackingField;
    public static string BootstrapBundle
    {
    get
    {
    return <BootstrapBundle>k__BackingField;
    }
    private set
    {
    <BootstrapBundle>k__BackingField = value;
    }
    }

    这意味着设置属性现在有效,设置后获取它将为您提供新值。

  4. private static string _bootstrapBundle;
    public static string BootstrapBundle { get; private set; } = _bootstrapBundle;

    这与#3 相同,只是隐藏的支持字段被初始化为您提供的值:

    private static string _bootstrapBundle;
    private static string <BootstrapBundle>k__BackingField = _bootstrapBundle;
    public static string BootstrapBundle
    {
    get
    {
    return <BootstrapBundle>k__BackingField;
    }
    private set
    {
    <BootstrapBundle>k__BackingField = value;
    }
    }

    这意味着现在有两个字段:一个是隐藏的,一个是可见的。隐藏字段最初会设置为可见字段的值(null),但之后,这两个字段将不会相互影响。

    这意味着如果您设置属性,然后获取属性,您将获得更新后的值。但是如果你读取可见字段,它的值将不会被更新。反之亦然:如果您更新该字段,该属性的值将不会改变。

关于c# - Expression-Bodied Function 与 Auto Properties 结合会导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36693511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com