C# static vs instance methods
I'm risking it this might be a newb question but here goes. I'm tempted to add a method to a class that could possible have thousands and thousands of instances in memory at a given time. Now, the other option is creating a static class with a static method, and just create the [static] method there, instead of an instance method in the class. Something like so:
This:
public static class P开发者_如何转开发etOwner
{
public static void RenamePet(Pet pet, string newName)
{
pet.Name = newName;
}
}
Instead of this:
public class Pet
{
public string Name { get; set; }
public void Rename(string newName)
{
this.Name = newName;
}
}
I'm just wondering if the static class alternative would take considerably less memory.
Thanks!
Only data fields require storage per instance, subject to certain conditions and optimisations. For instance, 10,000 instances of a class that define an Int32 member will consume ~40,000 bytes of memory.
Strings, on the other hand, are not so simple due to interning. You can try this as an example:
object.ReferenceEquals("", string.Empty) // returns true!
If the same 10,000 instances also define a string, and that string is the same for each instance, then you're going to have 10,000 references pointing at the same data, reducing overhead considerably (but in a 32-bit environment, there's another 40,000 bytes taken up by the references).
Methods, as pointed out by others, whether static or instance, are only loaded once.
The decision to use either instance or static methods is not influenced by performance reasons, but by how the method is intended to be used. In your case, the method requires an instance of the type as its first parameter so it may as well be an instance method.
Static methods, in my experience, are most useful as an alternative to a type's constructor for returning a new instance. Constructors, once invoked, have to either return a new instance or throw an exception, which may not be desirable. Static methods can return null if something fails, or return a cached instance (the latter of which is useful if the constructor is an expensive operation).
Methods only exist once in memory, regardless if they are static or not, so there is no difference at all in memory usage.
In addition to Guffa's answer:
Methods only exist once in memory, regardless if they are static or not, so there is no difference at all in memory usage.
The instance method has a class instance passed to it as an invisible(which can be explicitly accessed through this
) parameter, essentially making the newName of void Rename(string newName)
a second parameter passed to your instance method; thus the resulting burned instructions for static void RenamePet(Pet pet, string newName)
and void Rename(string newName)
look essentially the same, so they has no differences on performance or whatsoever
It doesn't make a difference, methods (static or instance) are only loaded once into memory and JIted, they don't consume more memory just because they are instance methods.
The amount of instances of a class, does not effect how much memory the method uses.
With respect to memory static and instance methods are same except the fact that instance methods can contain data members where as static methods can have only static data members.
In case of memory it doesn't make any difference,Methods exist only once in the memory regardless of being static or instance but static methods are minutely faster to invoke than instance methods because Instance methods actually use the ‘this’ instance pointer as the first parameter, so an instance method will always have that overhead
So static methods have little advantage over instance methods in case of performance but for memory usage they both use same amount.
You don't need a method "Rename" at all; you already have one, it's the setter of the Name property. Instance methods do not require more and more memory on a per instance basis, that would be silly.
Don't make design decisions like this before profiling your code. Adding an instance method to a class is not going to cause a performance bottleneck, and even if it did, you shouldn't start out with a bad design based on a guess; prove it is a bottleneck and make adjustments as necessary.
精彩评论