octobre
2007
Partons du code suivant :
{
private int _x;
private int _y;
public int X
{
get { return _x; }
set { _x = value; }
}
public int Y
{
get { return _y; }
set { _y = value; }
}
}
public class Rectangle
{
private Point _p1;
private point _p2;
public Point P1
{
get { return _p1; }
set { _p1 = value; }
}
public Point P2
{
get { return _p2; }
set { _p2 = value; }
}
}
En C# 3.0, ce code pourra être réduit à ça :
{
public int X { get; set; }
public int Y { get; set; }
}
public class Rectangle
{
public Point P1 { get; set; }
public Point P2 { get; set; }
}
Le code C# 2.0 suivant
p1.X = 10;
p1.Y = 10;
Point p2 = new Point();
p2.X = 20;
p2.Y = 20;
Rectangle r = new Rectangle();
r.P1 = p1;
r.P2 = p2;
peut s’écrire en C# 3.0 comme ceci :
P1 = new Point { X = 10, Y = 10 },
P2 = new Point { X = 20, Y = 20 } };
mais également, et c’est encore mieux, comme ceci :
P1 = { X = 10, Y = 10 },
P2 = { X = 20, Y = 20 } };
Ceci est possible grâce aux objects initializers.
Avec C# 3.0, une autre nouveauté est les collections initializers :
Le code suivant, écrit en C# 2.0,
Point p = new Point();
p.X = 10;
p.Y = 10;
points.Add(p);
p = new Point();
p.X = 20;
p.Y = 20;
points.Add(p);
pourra s’écrire en C# 3.0 comme ceci :
List<Point> points = new List<Point>() { new Point { X = 10, Y = 10 }, new Point { X = 20, Y = 20 }};
Si on suit la logique des objects initializers, on pourrait envisager d’écrire ceci :
List<Point> points = new List<Point>() { { X = 10, Y = 10 }, { X = 20, Y = 20 }};
mais non, ça ne marche pas
En réalité, je pense que je sais pourquoi :
Les collections initializers s’appliquent à tous les IEnumerable avec une méthode Add. Quand la méthode Add prend plusieurs paramètres, ceux-ci sont regroupés entre accolades, d’où l’ambigüeté :
Dictionary<string, string> dico = new Dictionary<string, string> {{ "key1", "value1" }, { "key2", "value2" }};
Il n’en demeure pas moins que quand j’aurai un peu de temps, j’essaierai de creuser pour MMCS31.