De struct (C# Reference)
sur MSDN :
Lorsque vous créez un objet struct à l'aide de l'opérateur new, il est créé et le constructeur approprié est appelé. Contrairement aux classes, les structs peuvent être instanciés sans utiliser l'opérateur new. Si vous n'utilisez pas new, les champs resteront non assignés et l'objet ne pourra pas être utilisé tant que tous les champs n'auront pas été initialisés.
D'après ce que j'ai compris, vous ne serez pas en mesure d'utiliser correctement un struct sans utiliser nouveau à moins que vous ne vous assuriez d'initialiser tous les champs manuellement. Si vous utilisez l'opérateur new, alors un constructeur correctement écrit a la possibilité de le faire pour vous.
J'espère que c'est clair. Si vous avez besoin d'éclaircissements à ce sujet, faites-le moi savoir.
Modifier
Il y a un long fil de commentaires, alors j'ai pensé ajouter un peu plus ici. Je pense que la meilleure façon de le comprendre est de l'essayer. Créez un projet console dans Visual Studio appelé "StructTest" et copiez-y le code suivant.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace struct_test
{
class Program
{
public struct Point
{
public int x, y;
public Point(int x)
{
this.x = x;
this.y = 5;
}
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
// It will break with this constructor. If uncommenting this one
// comment out the other one with only one integer, otherwise it
// will fail because you are overloading with duplicate parameter
// types, rather than what I'm trying to demonstrate.
/*public Point(int y)
{
this.y = y;
}*/
}
static void Main(string[] args)
{
// Declare an object:
Point myPoint;
//Point myPoint = new Point(10, 20);
//Point myPoint = new Point(15);
//Point myPoint = new Point();
// Initialize:
// Try not using any constructor but comment out one of these
// and see what happens. (It should fail when you compile it)
myPoint.x = 10;
myPoint.y = 20;
// Display results:
Console.WriteLine("My Point:");
Console.WriteLine("x = {0}, y = {1}", myPoint.x, myPoint.y);
Console.ReadKey(true);
}
}
}
Jouez avec. Enlevez les constructeurs et voyez ce qui se passe. Essayez d'utiliser un constructeur qui n'initialise qu'une variable (j'en ai commenté un... il ne compile pas). Essayez avec et sans l'option nouveau (J'ai commenté quelques exemples, décommentez-les et essayez-les).
3 votes
Une instance d'un
struct
est un objet. La distinction que vous comprenez probablement mal est celle entre les types de valeur et les types de référence.0 votes
Mais en C il n'y a pas d'objet et la structure n'est pas un objet. Donc en C# struct est implémenté comme un objet ?
1 votes
Penser à C# en termes de C n'est pas utile. Ignorez les différences syntaxiques, ce sont des langages complètement différents.
1 votes
KMC Même en C, il y a un objet. Vous ne comprenez pas ce que signifie le terme "objet" - ce qui est compréhensible, car il signifie beaucoup de choses différentes dans des contextes différents. En C++ (et je pense que le C est similaire) par exemple, c'est simplement un espace dans la mémoire : tout ce qui réside dans la mémoire est un objet.
0 votes
Réponse connexe : stackoverflow.com/a/3943596/380384 . Quand ne pas initialiser
struct
avecnew
.