首页 > 解决方案 > 在 get 中返回值和分配属性有什么区别?

问题描述

如果我想让它方便返回任务的非异步方法。

public static Task CompletedTaskA { get { return Task.CompletedTask; } }

public static Task CompletedTaskB { get; } = Task.CompletedTask;

对于任何类型的上下文,是否应该优先选择一个?或者他们是一样的?我也想知道字符串也是如此,基本上我对属性所做的任何事情,即:

get {return "some string"; }对比{ get; } = "some string";

编辑:我想澄清我对上述道具的使用。我有几个事件处理程序,它们将 Task 作为返回类型,由我正在使用的库提供给我。一个此类事件的示例:

private Task Client_MessageReceived(Message message)
{
   Task.Run(async ()=> await HandleMessageReceived(message));

   // here is where i would use it
   return CompletedTask; // A OR B?
}

private async Task HandleMessageReceived(Message message)
{
   // Do stuff with message that might take long and block the handler
}

我的意图是将已完成的任务保存在一个字段中(在这种情况下我选择一个只读属性)并继续使用它来满足任务返回。我想知道上述示例中的一个是否一直使用相同的已完成任务,而另一个每次都一直要求另一个已完成的任务?

标签: c#.netasynchronouspropertiestask

解决方案


如果您去SharpLab并查看以下代码:

public class C 
{
    public void M() 
    {
    }

    public string Greetig_1
    {
        get{return "hello";}
    }

    public string Greeting_2{get;} = "hello";
}

您可以看到它Greeting_2由成员变量支持:

public class C
{
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly string <Greeting_2>k__BackingField = "hello";

    public string Greeting_1
    {
        get
        {
            return "hello";
        }
    }

    public string Greeting_2
    {
        [CompilerGenerated]
        get
        {
            return <Greeting_2>k__BackingField;
        }
    }

    public void M()
    {
    }
}

这一直持续到 IL 级别。由于Greeting_2由成员变量支持,该变量在构造函数中初始化。

在您的示例中,Task.CompletedTask您最终得到的是:

public static Task CompletedTaskB { get; } = Task.CompletedTask;

缓存Task, 而:

public static Task CompletedTaskA { get { return Task.CompletedTask; } }

每次调用以获取CompletedTask对象。Task实际上,这将由 JIT 内联。该方法还具有不向您的类添加额外(隐藏)成员变量的优点,如果您有很多实例并且担心内存使用情况,这可能是一个问题。


推荐阅读