Установить значение после возврата - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть эта функция:

public static IList<T> Reverse<T>(MyList<T> list)
{
    list.Reverse = true;
    return list;
}

public class MyList<T> : IList<T>
{
    public bool Reverse;
    ...
}

Эта функция работает хорошо, но список останется обратным.Я хочу установить для параметра «Реверс» значение «ложь», после того как я верну список обратного просмотра.

Я хочу сделать что-то вроде:

public static IList<T> Reverse<T>(MyList<T> list)
{
    list.Reverse = true;
    return list;
    // Here I want to set Reverse to false.
    // list.Reverse = false;
}

Например, используя метод:

Reverse<int>(Mylist)[1] 
// I want MyList.Reverse == false

Любая идея?Спасибо

1 Ответ

0 голосов
/ 16 декабря 2018

Простой ответ: невозможно выполнить код после вызова return.Что вы можете сделать, это.1. Вы можете заключить свой код в

try{
    //DoSomething 
    return Something
}
finally{
    //DoSomethingElse()
}

В этом случае DoSomethingElse будет работать.2. Для выполнения некоторых операций после возврата вы можете использовать ThreadPool.QueueUserWorkItem

public static IList<T> Reverse<T>(MyList<T> list)
{
    list.Reverse = true;
    //This will run after return when a thread pool thread becomes available
    ThreadPool.QueueUserWorkItem(delegate{ list.Reverse = false; });
    return list;
}

Так что более или менее то, что соответствует вашему ожидаемому поведению, будет:

public static IList<T> Reverse<T>(MyList<T> list)
{
    try{   
        list.Reverse = true;
        return list;
    }
    finally{
        ThreadPool.QueueUserWorkItem(delegate{ list.Reverse = false; });
    }
}

Если вы хотите достичь Reverse<int>(Mylist)[1] без изменения свойства Reverse, вам нужно создать новый экземпляр спискаБолее подробную информацию о ThreadPool.QueueUserWorkItem методе вы можете найти на https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.queueuserworkitem?view=netframework-4.7.2

...