conceptual difference between 'struct' and 'class' ???

C

Chris

Hi,

I don't get the difference between a struct and a class !

ok, I know that a struct is a value type, the other a reference type, I
understand the technical differences between both, but conceptually speaking
: when do I define something as 'struct' and when as 'class' ?

for example : if I want to represent a 'Time' thing, containing :
- data members : hours, mins, secs
- some constructors
- some operator overloading functions maybe

do it define it as a struct or as a class ? and why ?

many thanks
Chris
 
M

Mickey Williams [C# MVP]

Use a class when object identity is more important than value.
Use a struct when the value contained by an instance is more important than
instance identity.

Structs are usually (not always) simpler types. Struct variables directly
contain their values, so when you pass a struct instance as a parameter, it
can be more expensive than passing an instance of a reference type, due to
the copying costs.

There are probably more, but these are the ones that come to mind.
 
N

Nicholas Paldino [.NET/C# MVP]

Chris,

Personally, for me, I see structures as data storage units where there
is not a lot of business logic associated with them. Things like integers,
dates, etc, etc, all have very small rule sets, whereas classes have much
larger, more complex relations.

Also, it seems that you want something like the TimeSpan structure, as
you are storing hours, minutes, and seconds, which is pretty much what this
does (it stores the amount of time between two points in time).

Hope this helps.
 
M

Mythran

Some things about structs vs classes I haven't seen mentioned prior to me
"starting" this post:

Pulled from
"ms-help://MS.VSCC/MS.MSDNQTR.2003FEB.1033/vbcn7/html/vaconstructuresandclasses.h
tm"

Similarities
Structures and classes are similar in the following respects:

*Both are container types, meaning that they contain other types as members.
*Both have members, which can include constructors, methods, properties,
fields, constants, enumerations, events, and event handlers.
*Members of both can have individualized accessibilities. For example, one
member can be declared Public and another Private.
*Both can implement interfaces.
*Both can have shared constructors, with or without parameters.
*Both can expose a default property, provided that property takes at least
one argument.
*Both can declare and raise events, and both can declare delegates.


Differences
Structures and classes differ in the following particulars:

*Structures are value types; classes are reference types.
*Structures use stack allocation; classes use heap allocation.
*All structure members are Public by default; class variables and constants
are Private by default, while other class members are Public by default. This
behavior for class members provides compatibility with the Visual Basic 6.0
system of defaults.
*A structure must have at least one nonshared variable or event member; a
class can be completely empty.
*Structure members cannot be declared as Protected; class members can.
*A structure procedure can handle events only if it is a Shared Sub
procedure, and only by means of the AddHandler statement; any class procedure can
handle events, using either the Handles keyword or the AddHandler statement.
*Structure variable declarations cannot specify initializers, the New
keyword, or initial sizes for arrays; class variable declarations can.
*Structures implicitly inherit from the ValueType class and cannot inherit
from any other type; classes can inherit from any class or classes other than
ValueType.
*Structures are not inheritable; classes are.
*Structures are never terminated, so the common language runtime (CLR) never
calls the Finalize method on any structure; classes are terminated by the garbage
collector, which calls Finalize on a class when it detects there are no active
references remaining.
*A structure does not require a constructor; a class does.
*Structures can have nonshared constructors only if they take parameters;
classes can have them with or without parameters.
*Every structure has an implicit public constructor without parameters. This
constructor initializes all the structure's data members to their default values.
You cannot redefine this behavior.

Instances and Variables
Because structures are value types, each structure variable is permanently bound
to an individual structure instance. But classes are reference types, and an
object variable can refer to various class instances. This distinction affects
your usage of structures and classes in the following ways:

A structure variable implicitly includes an initialization of the members using
the structure's parameterless constructor. Therefore, Dim S As Struct1 is
equivalent to Dim S As Struct1 = New Struct1().
When you assign one structure variable to another, or pass a structure instance
to a procedure argument, the current values of all the variable members are
copied to the new structure. When you assign one object variable to another, or
pass an object variable to a procedure, only the reference pointer is copied.
You can assign the value Nothing to a structure variable, but the instance
continues to be associated with the variable. You can still call its methods and
access its data members, although variable members are reinitialized by the
assignment. In contrast, if you set an object variable to Nothing, you dissociate
it from any class instance, and you cannot access any members through the
variable until you assign another instance to it.
An object variable can have different class instances assigned to it at different
times, and several object variables can refer to the same class instance at the
same time. Changes you make to the values of class members affect those members
when accessed through another variable pointing to the same instance. Structure
members, however, are isolated within their own instance. Changes to their values
are not reflected in any other structure variables, even in other instances of
the same Structure declaration.
Equality testing of two structures must be performed with a member-by-member
test. Two object variables can be compared using the Equals method. Equals
indicates whether the two variables point to the same instance.
 
M

Mythran

Then again, this is a C# group w00ps...the documentation I posted is for VB7
structures and classes...sorry.

Mythran
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top