When should I use a struct instead of a class?

MSDN says that you should use structs when you need lightweight objects. Are there any other scenarios when a struct is preferable over a class?

Edit:
Some people have forgotten that:
1. structs can have methods!
2. structs have no inheritance capabilites.

Another Edit:
I understand the technical differences, I just don't have a good feel for WHEN to use a struct.


MSDN has the answer: Choosing Between Classes and Structures.

Basically, that page gives you a 4-item checklist and says to use a class unless your type meets all of the criteria.

Do not define a structure unless the type has all of the following characteristics:

  • It logically represents a single value, similar to primitive types (integer, double, and so on).
  • It has an instance size smaller than 16 bytes.
  • It is immutable.
  • It will not have to be boxed frequently.

  • I am surprised I have not read at any of the previous answer this, which I consider the most crucial aspect :

    I use structs when I want a type with no identity. For example a 3D point:

    public struct ThreeDimensionalPoint
    {
        public readonly int X, Y, Z;
        public ThreeDimensionalPoint(int x, int y, int z)
        {
            this.X = x;
            this.Y = y;
            this.Z = z;
        }
    
        public override string ToString()
        {
            return "(X=" + this.X + ", Y=" + this.Y + ", Z=" + this.Z + ")";
        }
    
        public override int GetHashCode()
        {
            return (this.X + 2) ^ (this.Y + 2) ^ (this.Z + 2);
        }
    
        public override bool Equals(object obj)
        {
            if (!(obj is ThreeDimensionalPoint))
                return false;
            ThreeDimensionalPoint other = (ThreeDimensionalPoint)obj;
            return this == other;
        }
    
        public static bool operator ==(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2)
        {
            return p1.X == p2.X && p1.Y == p2.Y && p1.Z == p2.Z;
        }
    
        public static bool operator !=(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2)
        {
            return !(p1 == p2);
        }
    }
    

    If you have two instances of this struct you don't care if they are a single piece of data in memory or two. You just care about the value(s) they hold.


    Bill Wagner has a chapter about this in his book "effective c#" (http://www.amazon.com/Effective-Specific-Ways-Improve-Your/dp/0321245660). He concludes by using the following principle:

  • Is the main responsability of the type data storage?
  • Is its public interface defined entirely by properties that access or modify its data members?
  • Are you sure your type will never have subclasses?
  • Are you sure your type will never be treated polymorphically?
  • If you answer 'yes' to all 4 questions: use a struct. Otherwise, use a class.

    链接地址: http://www.djcxy.com/p/82802.html

    上一篇: .Net中值类型的用法是什么?

    下一篇: 什么时候应该使用结构而不是类?