第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

構(gòu)造函數(shù)可以是異步的嗎?

構(gòu)造函數(shù)可以是異步的嗎?

C#
德瑪西亞99 2019-07-13 10:47:23
我有一個(gè)項(xiàng)目,我試圖在構(gòu)造函數(shù)中填充一些數(shù)據(jù):public class ViewModel{     public ObservableCollection<TData> Data { get; set; }     async public ViewModel()     {         Data = await GetDataTask();     }     public Task<ObservableCollection<TData>> GetDataTask()     {         Task<ObservableCollection<TData>> task;         //Create a task which represents getting the data         return task;     }}不幸的是,我收到了一個(gè)錯(cuò)誤:改性劑async對(duì)此項(xiàng)目無(wú)效。當(dāng)然,如果我包裝一個(gè)標(biāo)準(zhǔn)方法并從構(gòu)造函數(shù)調(diào)用它:public async void Foo(){     Data = await GetDataTask();}效果很好。同樣的,如果我用舊的內(nèi)出方式GetData().ContinueWith(t => Data = t.Result);這也很管用。我只是想知道為什么我們不能打電話(huà)await直接從構(gòu)造函數(shù)中刪除。可能有很多(甚至明顯的)邊緣情況和反對(duì)它的理由,我只是想不出任何。我也四處尋找解釋?zhuān)坪跽也坏饺魏谓忉尅?
查看完整描述

3 回答

?
拉丁的傳說(shuō)

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

構(gòu)造函數(shù)的作用非常類(lèi)似于返回構(gòu)造類(lèi)型的方法。和async方法不能返回任何類(lèi)型,它必須是“火而忘”。void,或Task.

如果類(lèi)型的構(gòu)造函數(shù)T實(shí)際上回來(lái)了Task<T>,我想這會(huì)讓人很困惑。

如果異步構(gòu)造函數(shù)的行為方式與async void方法,這種類(lèi)型破壞了構(gòu)造函數(shù)的意義。構(gòu)造函數(shù)返回后,您應(yīng)該得到一個(gè)完全初始化的對(duì)象。而不是將來(lái)在某個(gè)未定義的點(diǎn)上被正確初始化的對(duì)象。也就是說(shuō),如果幸運(yùn)的話(huà),異步初始化不會(huì)失敗。

這一切只是猜測(cè)而已。但在我看來(lái),擁有異步構(gòu)造函數(shù)的可能性會(huì)帶來(lái)更多的麻煩。

如果你真的想要的“火和忘記”語(yǔ)義學(xué)async void方法(如果可能的話(huà),應(yīng)該避免),您可以輕松地將所有代碼封裝在async void方法,并從構(gòu)造函數(shù)中調(diào)用它,正如您在問(wèn)題中提到的那樣。


查看完整回答
反對(duì) 回復(fù) 2019-07-13
?
天涯盡頭無(wú)女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

由于不可能創(chuàng)建異步構(gòu)造函數(shù),所以我使用了一個(gè)靜態(tài)異步方法,該方法返回由私有構(gòu)造函數(shù)創(chuàng)建的類(lèi)實(shí)例。這不雅致,但效果不錯(cuò)。

   public class ViewModel       
   {       
    public ObservableCollection<TData> Data { get; set; }       

    //static async method that behave like a constructor       
    async public static Task<ViewModel> BuildViewModelAsync()  
    {       
     ObservableCollection<TData> tmpData = await GetDataTask();  
     return new ViewModel(tmpData);
    }       

    // private constructor called by the async method
    private ViewModel(ObservableCollection<TData> Data)
    {
     this.Data=Data;   
    }
   }


查看完整回答
反對(duì) 回復(fù) 2019-07-13
?
蠱毒傳說(shuō)

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

您的問(wèn)題類(lèi)似于創(chuàng)建文件對(duì)象和打開(kāi)文件。實(shí)際上,在實(shí)際使用對(duì)象之前,有很多類(lèi)需要執(zhí)行兩個(gè)步驟:Create+Initialization(通常稱(chēng)為類(lèi)似于Open)。

它的優(yōu)點(diǎn)是構(gòu)造函數(shù)可以是輕量級(jí)的。如果需要,可以在實(shí)際初始化對(duì)象之前更改一些屬性。設(shè)置所有屬性時(shí),Initialize/Open函數(shù)來(lái)準(zhǔn)備要使用的對(duì)象。這,這個(gè)Initialize函數(shù)可以是異步的。

缺點(diǎn)是您必須信任您的類(lèi)的用戶(hù),他將調(diào)用該用戶(hù)。Initialize()在他使用你類(lèi)的任何其他函數(shù)之前。事實(shí)上,如果你想讓你的課充分證明(傻瓜證明?)您必須簽入每個(gè)函數(shù)Initialize()已經(jīng)被召喚了。

使這更容易的模式是聲明構(gòu)造函數(shù)私有,并使一個(gè)公共靜態(tài)函數(shù)來(lái)構(gòu)造對(duì)象并調(diào)用。Initialize()在返回構(gòu)造的對(duì)象之前。這樣,您就會(huì)知道每個(gè)訪(fǎng)問(wèn)對(duì)象的人都使用了Initialize功能。

該示例顯示了一個(gè)類(lèi),該類(lèi)模擬所需的異步構(gòu)造函數(shù)。

public MyClass{
    public static async Task<MyClass> CreateAsync(...)
    {
        MyClass x = new MyClass();
        await x.InitializeAsync(...)
        return x;
    }

    // make sure no one but the Create function can call the constructor:
    private MyClass(){}

    private async Task InitializeAsync(...)
    {
        // do the async things you wanted to do in your async constructor
    }

    public async Task<int> OtherFunctionAsync(int a, int b)
    {
        return await OtherFunctionAsync(a, b);
    }

使用情況如下:

public async Task<int> SomethingAsync(){
    // Create and initialize a MyClass object
    MyClass myObject = await MyClass.CreateAsync(...);

    // use the created object:
    return await myObject.OtherFunctionAsync(4, 7);}


查看完整回答
反對(duì) 回復(fù) 2019-07-13
  • 3 回答
  • 0 關(guān)注
  • 631 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)