2016-08-23 7 views
1

基本的に、私はこのような何か...Func <T>は常に同じオブジェクトですか?

class Bla 
    T Run(Func<T> myFun) 
    return myFun() 

    void SomeMethod() 
    Run(() => whatever()) 

、その後MYFUN常に同じオブジェクト、または新しいオブジェクトごとに行いますか?あるいは少し違う方法で策定されています...もし私がそれにロックをかけると、並列実行を妨げるでしょうか?

+0

'()=> whatever()'が毎回新しいデリゲートオブジェクトを作成するかどうか尋ねていますか? –

+0

@ LasseV.Karlsen:はい。 – FrankyBoy

+1

オブジェクトがどのように作成されたのかわからない場合は、そのオブジェクトがロック状態を格納するのに適していることを決して*決して*することはできません。 GetType()の場合はTrue、* this *の場合はtrue、メソッドの引数の場合はdouble、デリゲートオブジェクトの場合はtriple-trueです。常に、*常に* 'new object()'で独自のオブジェクトを作成します。 –

答えて

2

この:

() => whatever() 

は、新しいデリゲートオブジェクトごとに作成されます。二つのスレッドが同時にSomeMethodを呼び出す場合は、それらのそれぞれが独自のデリゲートを構築し、そのRunに渡されたデリゲートを実行できるだけのスレッドを保証しませんRunの内側にロックをかけることを意味します

You can test this in this .NET Fiddle

+0

くそっと思ったけど、私が間違っていると思っていた。また、そこにきちんとしたサイトは、そのことを知らなかった。 – FrankyBoy

関連する問題