Can static generic function interfere with each other (c#)?












0















Suppose there is a static extension function for caching the results like this:



public static Func<T, R> Memoize<T, R>(this Func<T, R> func)
{
var cache = new Dictionary<T, R>();
R result = default(R);
return x => cache.TryGetValue(x, out result) ? result : cache[x] = func(x);
}


If in the main method I declare



Func<int, int> func1;
func1 = (x) => x + 1; // one method with <int, int>
func1 = func1.Memoize();

Func<int, long> func2;
func2 = (x) => x - 1; // other method with <int, long>
func2 = func2.Memoize();


they will work fine. But what if I declare both delegates with identical type signature? Will they corrupt the results for each other if they are called?










share|improve this question




















  • 1





    This is an extension method so while technically it is a static mehod, you are using an instance (called func in this case) so no, they should not collide.

    – Zohar Peled
    Jan 1 at 15:27











  • Thanks. They also do not collide even if non-extension. I suppose they would if the dictionary was separate static field.

    – Timofeus
    Jan 1 at 16:09
















0















Suppose there is a static extension function for caching the results like this:



public static Func<T, R> Memoize<T, R>(this Func<T, R> func)
{
var cache = new Dictionary<T, R>();
R result = default(R);
return x => cache.TryGetValue(x, out result) ? result : cache[x] = func(x);
}


If in the main method I declare



Func<int, int> func1;
func1 = (x) => x + 1; // one method with <int, int>
func1 = func1.Memoize();

Func<int, long> func2;
func2 = (x) => x - 1; // other method with <int, long>
func2 = func2.Memoize();


they will work fine. But what if I declare both delegates with identical type signature? Will they corrupt the results for each other if they are called?










share|improve this question




















  • 1





    This is an extension method so while technically it is a static mehod, you are using an instance (called func in this case) so no, they should not collide.

    – Zohar Peled
    Jan 1 at 15:27











  • Thanks. They also do not collide even if non-extension. I suppose they would if the dictionary was separate static field.

    – Timofeus
    Jan 1 at 16:09














0












0








0








Suppose there is a static extension function for caching the results like this:



public static Func<T, R> Memoize<T, R>(this Func<T, R> func)
{
var cache = new Dictionary<T, R>();
R result = default(R);
return x => cache.TryGetValue(x, out result) ? result : cache[x] = func(x);
}


If in the main method I declare



Func<int, int> func1;
func1 = (x) => x + 1; // one method with <int, int>
func1 = func1.Memoize();

Func<int, long> func2;
func2 = (x) => x - 1; // other method with <int, long>
func2 = func2.Memoize();


they will work fine. But what if I declare both delegates with identical type signature? Will they corrupt the results for each other if they are called?










share|improve this question
















Suppose there is a static extension function for caching the results like this:



public static Func<T, R> Memoize<T, R>(this Func<T, R> func)
{
var cache = new Dictionary<T, R>();
R result = default(R);
return x => cache.TryGetValue(x, out result) ? result : cache[x] = func(x);
}


If in the main method I declare



Func<int, int> func1;
func1 = (x) => x + 1; // one method with <int, int>
func1 = func1.Memoize();

Func<int, long> func2;
func2 = (x) => x - 1; // other method with <int, long>
func2 = func2.Memoize();


they will work fine. But what if I declare both delegates with identical type signature? Will they corrupt the results for each other if they are called?







c# static






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 1 at 16:13







Timofeus

















asked Jan 1 at 15:17









TimofeusTimofeus

747




747








  • 1





    This is an extension method so while technically it is a static mehod, you are using an instance (called func in this case) so no, they should not collide.

    – Zohar Peled
    Jan 1 at 15:27











  • Thanks. They also do not collide even if non-extension. I suppose they would if the dictionary was separate static field.

    – Timofeus
    Jan 1 at 16:09














  • 1





    This is an extension method so while technically it is a static mehod, you are using an instance (called func in this case) so no, they should not collide.

    – Zohar Peled
    Jan 1 at 15:27











  • Thanks. They also do not collide even if non-extension. I suppose they would if the dictionary was separate static field.

    – Timofeus
    Jan 1 at 16:09








1




1





This is an extension method so while technically it is a static mehod, you are using an instance (called func in this case) so no, they should not collide.

– Zohar Peled
Jan 1 at 15:27





This is an extension method so while technically it is a static mehod, you are using an instance (called func in this case) so no, they should not collide.

– Zohar Peled
Jan 1 at 15:27













Thanks. They also do not collide even if non-extension. I suppose they would if the dictionary was separate static field.

– Timofeus
Jan 1 at 16:09





Thanks. They also do not collide even if non-extension. I suppose they would if the dictionary was separate static field.

– Timofeus
Jan 1 at 16:09












1 Answer
1






active

oldest

votes


















1














I'm not sure why you think the type signatures would have any impact on your Memoize function. Each invocation of Memoize instantiates its own dictionary. Therefore func1 and func2 would operate independenty of one another regardless of the types involved.



To clarify a bit further, the function you return from Memoize captures the dictionary in a closure and thus has a reference to the instance created on the first line. Since you call Memoize twice, there are two separate dictionaries in play.






share|improve this answer
























  • I was under the impression that static methods are created once on first calling, so if one Memoize<int, int> was present the program would use it if called from another delegate.

    – Timofeus
    Jan 1 at 16:11











  • Static methods are not "created" -- they are just methods that do not require an instance of the surrounding class to operate (i.e. they have no access to this). However, each invocation of a static method operates independently -- you are creating a dictionary upon each invocation, so each function returned has its own unique copy.

    – Kirk Woll
    Jan 1 at 16:13











  • Yes, I meant static instances, not methods.

    – Timofeus
    Jan 1 at 16:16











  • There is no such thing as "static instances" in C#. What you have is a static method.

    – Kirk Woll
    Jan 1 at 16:16











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53996590%2fcan-static-generic-function-interfere-with-each-other-c%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














I'm not sure why you think the type signatures would have any impact on your Memoize function. Each invocation of Memoize instantiates its own dictionary. Therefore func1 and func2 would operate independenty of one another regardless of the types involved.



To clarify a bit further, the function you return from Memoize captures the dictionary in a closure and thus has a reference to the instance created on the first line. Since you call Memoize twice, there are two separate dictionaries in play.






share|improve this answer
























  • I was under the impression that static methods are created once on first calling, so if one Memoize<int, int> was present the program would use it if called from another delegate.

    – Timofeus
    Jan 1 at 16:11











  • Static methods are not "created" -- they are just methods that do not require an instance of the surrounding class to operate (i.e. they have no access to this). However, each invocation of a static method operates independently -- you are creating a dictionary upon each invocation, so each function returned has its own unique copy.

    – Kirk Woll
    Jan 1 at 16:13











  • Yes, I meant static instances, not methods.

    – Timofeus
    Jan 1 at 16:16











  • There is no such thing as "static instances" in C#. What you have is a static method.

    – Kirk Woll
    Jan 1 at 16:16
















1














I'm not sure why you think the type signatures would have any impact on your Memoize function. Each invocation of Memoize instantiates its own dictionary. Therefore func1 and func2 would operate independenty of one another regardless of the types involved.



To clarify a bit further, the function you return from Memoize captures the dictionary in a closure and thus has a reference to the instance created on the first line. Since you call Memoize twice, there are two separate dictionaries in play.






share|improve this answer
























  • I was under the impression that static methods are created once on first calling, so if one Memoize<int, int> was present the program would use it if called from another delegate.

    – Timofeus
    Jan 1 at 16:11











  • Static methods are not "created" -- they are just methods that do not require an instance of the surrounding class to operate (i.e. they have no access to this). However, each invocation of a static method operates independently -- you are creating a dictionary upon each invocation, so each function returned has its own unique copy.

    – Kirk Woll
    Jan 1 at 16:13











  • Yes, I meant static instances, not methods.

    – Timofeus
    Jan 1 at 16:16











  • There is no such thing as "static instances" in C#. What you have is a static method.

    – Kirk Woll
    Jan 1 at 16:16














1












1








1







I'm not sure why you think the type signatures would have any impact on your Memoize function. Each invocation of Memoize instantiates its own dictionary. Therefore func1 and func2 would operate independenty of one another regardless of the types involved.



To clarify a bit further, the function you return from Memoize captures the dictionary in a closure and thus has a reference to the instance created on the first line. Since you call Memoize twice, there are two separate dictionaries in play.






share|improve this answer













I'm not sure why you think the type signatures would have any impact on your Memoize function. Each invocation of Memoize instantiates its own dictionary. Therefore func1 and func2 would operate independenty of one another regardless of the types involved.



To clarify a bit further, the function you return from Memoize captures the dictionary in a closure and thus has a reference to the instance created on the first line. Since you call Memoize twice, there are two separate dictionaries in play.







share|improve this answer












share|improve this answer



share|improve this answer










answered Jan 1 at 15:48









Kirk WollKirk Woll

61.6k16159173




61.6k16159173













  • I was under the impression that static methods are created once on first calling, so if one Memoize<int, int> was present the program would use it if called from another delegate.

    – Timofeus
    Jan 1 at 16:11











  • Static methods are not "created" -- they are just methods that do not require an instance of the surrounding class to operate (i.e. they have no access to this). However, each invocation of a static method operates independently -- you are creating a dictionary upon each invocation, so each function returned has its own unique copy.

    – Kirk Woll
    Jan 1 at 16:13











  • Yes, I meant static instances, not methods.

    – Timofeus
    Jan 1 at 16:16











  • There is no such thing as "static instances" in C#. What you have is a static method.

    – Kirk Woll
    Jan 1 at 16:16



















  • I was under the impression that static methods are created once on first calling, so if one Memoize<int, int> was present the program would use it if called from another delegate.

    – Timofeus
    Jan 1 at 16:11











  • Static methods are not "created" -- they are just methods that do not require an instance of the surrounding class to operate (i.e. they have no access to this). However, each invocation of a static method operates independently -- you are creating a dictionary upon each invocation, so each function returned has its own unique copy.

    – Kirk Woll
    Jan 1 at 16:13











  • Yes, I meant static instances, not methods.

    – Timofeus
    Jan 1 at 16:16











  • There is no such thing as "static instances" in C#. What you have is a static method.

    – Kirk Woll
    Jan 1 at 16:16

















I was under the impression that static methods are created once on first calling, so if one Memoize<int, int> was present the program would use it if called from another delegate.

– Timofeus
Jan 1 at 16:11





I was under the impression that static methods are created once on first calling, so if one Memoize<int, int> was present the program would use it if called from another delegate.

– Timofeus
Jan 1 at 16:11













Static methods are not "created" -- they are just methods that do not require an instance of the surrounding class to operate (i.e. they have no access to this). However, each invocation of a static method operates independently -- you are creating a dictionary upon each invocation, so each function returned has its own unique copy.

– Kirk Woll
Jan 1 at 16:13





Static methods are not "created" -- they are just methods that do not require an instance of the surrounding class to operate (i.e. they have no access to this). However, each invocation of a static method operates independently -- you are creating a dictionary upon each invocation, so each function returned has its own unique copy.

– Kirk Woll
Jan 1 at 16:13













Yes, I meant static instances, not methods.

– Timofeus
Jan 1 at 16:16





Yes, I meant static instances, not methods.

– Timofeus
Jan 1 at 16:16













There is no such thing as "static instances" in C#. What you have is a static method.

– Kirk Woll
Jan 1 at 16:16





There is no such thing as "static instances" in C#. What you have is a static method.

– Kirk Woll
Jan 1 at 16:16




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53996590%2fcan-static-generic-function-interfere-with-each-other-c%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

MongoDB - Not Authorized To Execute Command

in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith

How to fix TextFormField cause rebuild widget in Flutter