Classes são tipos de referência e estruturas são tipos de valores.
Quando digo que Classes são tipos de referência,
basicamente elas conterão o endereço de uma variável de instância.
Por exemplo:
Class MyClass
{
Public Int DataMember; //By default, accessibility of class data members
//will be private. So I am making it as Public which
//can be accessed outside of the class.
}
No método principal,
posso criar uma instância dessa classe usando o novo operador que aloca memória para essa classe
e armazena o endereço base na variável do tipo MyClass (_myClassObject2).
Static Public void Main (string[] arg)
{
MyClass _myClassObject1 = new MyClass();
_myClassObject1.DataMember = 10;
MyClass _myClassObject2 = _myClassObject1;
_myClassObject2.DataMember=20;
}
No programa acima, MyClass _myClassObject2 = _myClassObject1; A instrução indica que ambas as variáveis do tipo MyClass
- myClassObject1
- myClassObject2
e apontará para o mesmo local de memória.
Basicamente, atribui o mesmo local de memória a outra variável do mesmo tipo.
Portanto, se qualquer alteração que fizermos em qualquer um dos objetos, digite MyClass, terá efeito sobre outro,
pois ambos apontam para o mesmo local de memória.
"_myClassObject1.DataMember = 10;" nessa linha, os membros de dados do objeto conterão o valor 10.
"_myClassObject2.DataMember = 20;" nessa linha, o membro de dados do objeto conterá o valor de 20.
Eventualmente, estamos acessando de um objeto por meio de ponteiros.
Diferentemente das classes, as estruturas são tipos de valor. Por exemplo:
Structure MyStructure
{
Public Int DataMember; //By default, accessibility of Structure data
//members will be private. So I am making it as
//Public which can be accessed out side of the structure.
}
Static Public void Main (string[] arg)
{
MyStructure _myStructObject1 = new MyStructure();
_myStructObject1.DataMember = 10;
MyStructure _myStructObject2 = _myStructObject1;
_myStructObject2.DataMember = 20;
}
No programa acima,
instanciar o objeto do tipo MyStructure usando o novo operador e
armazenar o endereço na variável _myStructObject do tipo MyStructure e
atribuir o valor 10 ao membro de dados da estrutura usando "_myStructObject1.DataMember = 10".
Na próxima linha,
estou declarando outra variável _myStructObject2 do tipo MyStructure e atribuindo _myStructObject1 a isso.
Aqui, o compilador .NET C # cria outra cópia do objeto _myStructureObject1 e
atribui esse local de memória à variável MyStructure _myStructObject2.
Portanto, qualquer alteração que fizermos em _myStructObject1 nunca terá efeito em outra variável _myStructObject2 do tipo MyStructrue.
É por isso que estamos dizendo que Estruturas são tipos de valor.
Portanto, a classe Base imediata para a classe é Object e a classe Base imediata para Structure é ValueType que herda de Object.
As classes apoiarão uma herança, enquanto as estruturas não.
Como estamos dizendo isso?
E qual é a razão por trás disso?
A resposta é Classes.
Pode ser abstrato, selado, estático e parcial e não pode ser Privado, Protegido e protegido interno.