2009-08-01 18 views

Respuesta

17

Una estructura es un tipo de valor por lo que si se crea una copia, en realidad va a copiar físicamente los datos, mientras que con una clase sólo se copiará la referencia a los datos

+3

(Hasta que inserte un tipo de referencia en su estructura, en cuyo caso solo copiará la referencia para ese objeto) –

+3

Novatrust, esa no es una excepción a lo que describe IP. –

+0

El valor de un tipo de referencia es la referencia en sí misma, por lo que es de esperar. Todavía tengo que encontrar una buena manera de describir esto sin que suene confuso :( –

1

la diferencia es que una estructura es un valor de tipo que he encontrado útiles en situaciones 2

1) Interoperabilidad - puede especificar el diseño de memoria de una estructura, lo que puede garantizar que cuando se invocar una llamada no administrada.

2) Rendimiento: en algunos casos (muy limitados), las estructuras pueden ser más rápidas que las clases. En general, esto requiere que las estructuras sean pequeñas (he escuchado 16 bytes o menos) y no se cambian con frecuencia.

+0

complemento:) ........ – ShuggyCoUk

+0

Las estructuras de campo expuesto ofrecen sus mayores ventajas de rendimiento en los casos en que la frecuencia de dos operaciones está dentro de un par de órdenes de magnitud: (1) copia el estado encapsulado por una variable a otro; (2) modificar parte del estado encapsulado en una variable. Las únicas clases que pueden hacer # 1 más eficientemente que una estructura de cualquier tamaño son las clases inmutables, y las clases inmutables son muy malas en # 2 (cuanto más grande es la clase, peor es el rendimiento). En los casos en que las estructuras son utilizables, superarán las clases a menos que una de esas operaciones sea tan rara que su rendimiento no sea factor, – supercat

6

En C#, una estructura es un valor tipo, a diferencia de las clases que son tipos de referencia. Esto lleva a una gran diferencia en cómo se manejan o cómo se espera que se usen.

Probablemente deberías leer las estructuras de un libro. Las estructuras en C# no son primos cercanos de clase como en C++ o Java.

-1

Una estructura es un tipo de valor (como Int32), mientras que una clase es un tipo de referencia. Las estructuras se crean en la pila en lugar del montón. Además, cuando se pasa una estructura a un método, se pasa una copia de la estructura, pero cuando se pasa una instancia de clase, se pasa una referencia.

Si necesita crear su propio tipo de datos, por ejemplo, una estructura es a menudo una mejor opción que una clase, ya que puede usarla como los tipos de valores incorporados en .NET Framework. Hay algunos buenos ejemplos de estructura you can read here.

+2

"Las estructuras se crean en la pila en lugar del montón "no siempre - no loro esto es mucho más sutil. también debería decir que se pasó una _copia_ de una referencia. – ShuggyCoUk

+0

Además, esto es simplemente un detalle de implementación. –

+1

Tómelo con Microsoft , entonces, ya que esto es lo que dice MSDN: "Cuando llame al operador Nuevo en una clase, será todo ubicado en el montón Sin embargo, cuando instancia una estructura, se crea en la pila. "- http://msdn.microsoft.com/en-us/library/aa288471(VS.71).aspx –

1

Una de las razones principales es que, cuando se utilizan como variables locales durante una llamada a un método, las estructuras se asignan en la pila.

La asignación de la pila es barata, pero la gran diferencia es que la desasignación también es muy económica. En esta situación, el recolector de basura no tiene que rastrear las estructuras: se eliminan cuando regresan del método que las asignó cuando se saca el marco de pila.

  • editar - aclarado mi post re: comentario de Jon Skeet.
+3

Las estructuras se asignan "en línea" con la variable. Que * puede * estar en la pila, o puede estar en el montón si es parte de otro objeto. –

+0

Es cierto que venía de la perspectiva de las variables locales :) (por ejemplo, hacer un cálculo en un método que utiliza varias variables locales). Debería haber aclarado esto. –

+0

Esto se refiere a los detalles de implementación y no a las diferencias semánticas entre "clase" y "estructura". – jason

1

Las estructuras tienen muchas semánticas diferentes para las clases.Las diferencias son muchas, pero las principales razones de su existencia son:

  1. Pueden ser layed explícitamente en memmory
    • esto permite que ciertos escenarios de interoperabilidad
  2. Ellos pueden ser distribuido, de la pila
    • Hacer posible algún tipo de código de alto rendimiento de una manera mucho más simple
5

Todas las razones que veo en otras respuestas son interesantes y pueden ser útiles, pero si usted quiere leer acerca de por qué son requiere (al menos por el VM) y por qué era una error para que la JVM no los admita (tipos de valores definidos por el usuario), lea Demystifying Magic: High-level Low-level Programming. Tal como está, C# brilla al hablar sobre el potencial de llevar código seguro y administrado a la programación de sistemas. Esta es también una de las razones por las que creo que la CLI es una plataforma superior [a la JVM] para informática móvil. Algunas otras razones se enumeran en el documento vinculado.

Es importante tener en cuenta que rara vez, o nunca, verá una mejora observable en el rendimiento del uso de una estructura. El recolector de basura es extremadamente rápido, y en muchos casos realmente superará las estructuras. Cuando agregas los matices de ellos, ciertamente no son una herramienta de primera elección. Sin embargo, cuando los necesita y tiene resultados de perfilador o construcciones de nivel de sistema para probarlo, hacen el trabajo.

Editar: Si desea una respuesta de por qué los necesitamos a diferencia de lo que hacen, ^^^

+0

fragmentar estructuras desde un búfer no administrado es impresionante para el rendimiento :) – ShuggyCoUk

+0

Algunos tipos de cosas se describen mejor como un conjunto fijo de valores independientes; las operaciones en ellos se enfocarán en dos operaciones básicas: establecer una propiedad de una ubicación de almacenamiento igual a algún valor, o hacer que todas las propiedades de una ubicación coincidan con las de otra. Las clases mutables no compartidas son buenas al principio, pero malas en el segundo. Las clases inmutables que se pueden compartir son malas al principio, pero excelentes en el segundo. Las estructuras de campo expuesto son excelentes para el primero y decentes para el segundo. Las llamadas estructuras inmutables son malas al principio y decentes en el segundo. – supercat

+0

En lugar de decir que "rara vez se verá una mejora en el rendimiento al usar una estructura", sería útil saber qué tipos de estructuras se están comparando con qué tipos de clases y cuál es el patrón de uso. Tenga en cuenta también que en escenarios donde ninguna de las dos operaciones antes mencionadas domina, las ventajas de rendimiento de las estructuras * aumentan con el tamaño * hasta que llegan a ser tan grandes como para volar la pila. Solo cuando domina la segunda operación, los objetos de clase grande superan sustancialmente a las estructuras grandes. – supercat

8

Una diferencia importante entre la semántica de class y struct es que struct s tienen semántica de valor. Lo que esto significa es que si tiene dos variables del mismo tipo, cada una tiene su propia copia de los datos. Por lo tanto, si una variable de un tipo de valor determinado se establece igual a otra (del mismo tipo), las operaciones en una no afectarán a la otra (es decir, la asignación de tipos de valores crea una copia). Esto está en marcado contraste con los tipos de referencia.

Hay otras diferencias: tipos

  1. de valor son implícitamente sealed (no es posible derivar de un tipo de valor).
  2. Los tipos de valores no pueden ser null.
  3. Los tipos de valor reciben un constructor predeterminado que inicializa el tipo de valor a su valor predeterminado.
  4. Una variable de un tipo de valor es siempre un valor de ese tipo. Contraste esto con las clases donde una variable de tipo A podría referirse a una instancia de tipo B si B deriva de A.

Debido a la diferencia en la semántica, es inapropiado referirse a struct como "clases ligeras".

+0

"dos variables del mismo tipo, cada una tiene su propia copia de los datos" ... ¿no es lo mismo que var x = new SomeClass() y var y = new SomeClass()? Ambos tendrían su propia copia de los datos. –

+3

@Vince: Míralo así. Si tiene 'var x = new SomeClass();' y 'var y = x;' entonces mutating 'x' mutará' y'. Pero si tiene 'var x = new SomeStruct();' y 'var y = x;' este no es el caso. – jason

3

Este es un mito de que struct siempre se crea en montón. Ok, es correcto que struct es el tipo de valor y la clase es el tipo de referencia.Pero recuerde que

1. Un tipo de referencia siempre va en el Heap.
2. Los tipos de valores van donde fueron declarados.

Ahora lo que significa que la segunda línea es voy a explicar con más adelante ejemplo

Considere el siguiente método

public void DoCalulation() 
    { 
     int num; 
     num=2; 
    } 

Aquí num es una variable local por lo que se creará en pila.

Ahora consideremos el siguiente ejemplo

public class TestClass 
{   
    public int num; 
} 
public void DoCalulation() 
{ 
    TestClass myTestClass = new TestClass(); 
    myTestClass.num=2; 
} 

Este num vez que se se crea el num en heap.Ya en algunos casos los tipos de valor realizar más de los tipos de referencia, ya que no requieren la recolección de basura.

también remeber:

El valor de un tipo de valor es siempre un valor de ese tipo. El valor de un tipo de referencia siempre es una referencia.

Y tiene que pensar en el problema de que si espera que haya mucha instanciación, entonces eso significa que habrá más espacio en el montón, y más es el trabajo del recolector de basura. Para ese caso, puede elegir las estructuras .

Cuestiones relacionadas