L'utilisation d'initialiseurs d'objets C # présente-t-elle des avantages?
En C++, il n'y a pas de références et tout est encapsulé dans un objet. Il est donc logique de les utiliser au lieu d'initialiser les membres après la création de l'objet.
Quel est le cas pour leur utilisation en C #?
Comment: initialiser des objets à l'aide d'un initialiseur d'objet (Guide de programmation C #)
Un avantage souvent oublié est atomicity. Ceci est utile si vous utilisez une double vérification de verrouillage sur un objet. L'initialiseur d'objet renvoie le nouvel objet après avoir initialisé tous les membres auxquels vous l'avez indiqué. De l'exemple sur l'article MSDN:
StudentName student = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
ID = 116
};
Serait traduit à quelque chose comme ce qui suit:
StudentName _tempStudent = new StudentName();
_tempStudent.FirstName = "Craig";
_tempStudent.LastName = "Playstead";
_tempStudent.ID = 116;
StudentName student = _tempStudent;
Cela garantit que student
n'est jamais partiellement initialisé. Il sera soit null
, soit entièrement initialisé, ce qui est utile dans les scénarios multithreads.
Pour plus d'informations à ce sujet, vous pouvez consulter this article.
Un autre avantage est qu'il vous permet de créer des objets anonymes (par exemple, pour créer une projection ou pour joindre plusieurs clés dans LINQ).
Il existe une raison potentielle pour pas utiliser les initialiseurs d’objets: en cas d’exception lors de l’initialisation, la pile d’appel dans le débogueur Visual Studio renverra uniquement l’expression de l’initialiseur et non la ligne spécifique où l’exception s’est produite.
Si vous utilisez des bibliothèques ou des services externes comportant des exceptions mal nommées, ou si vous utilisez des bibliothèques avec du code natif dans lequel vous ne pouvez pas voir le code qui lève l'exception (par exemple, Xamarin sur Android), les initialiseurs d'objet peuvent rendre plus difficile le débogage de votre code car vous ne savez pas quel paramètre a provoqué la levée de l'exception.
Exemple: Imaginez qu'il s'agit de votre code, mais que vous ne pouvez pas lire la source de ExternalService car elle est externe à votre application. Vous ne saurez pas que c'est le paramètre "charlie" qui a causé l'erreur dans ExternalService.
var instance = new ClassToBeInitialized
{
alpha = "alpha",
bravo = ExternalService(0),
charlie = ExternalService(1)
};
private static string ExternalService(int parameter)
{
if (parameter == 1)
{
throw new Exception("The external service crashed");
}
return "correctStringResult";
}
Les avantages sont l'utilisation d'objets anonymes, les requêtes linq, parfois une surcharge inutile des constructeurs juste pour passer des paramètres
Je pense que cela favorise la lisibilité.
En guise de remarque, dans l'exemple donné dans le lien indiqué, je préfère parfois avoir un sélecteur privé pour les propriétés (Prénom et Nom), mais cela dépend de votre conception.
L'initialisation d'objet présente 3 avantages principaux
Évitez les frappes au clavier. L’efficacité des logiciels est parfois mesurée par le nombre de touches qu’il faut pour écrire une fonction spécifique.
Facile à lire et à maintenir.
Approche de gain de temps.
Voyons comment cela peut éviter beaucoup de frappes:
Avant c # 3.0, nous faisions l'initialisation comme ceci-
public class Employee
{
public string Name { get; set; }
public int Id { get; set; }
public string Department { get; set; }
public int salary { get; set; }
}
class Program
{
static void Main(string[] args)
{
Employee emp=new Employee();
emp.Name = "Kumar";
emp.Department = "IT";
emp.Id = 101;
emp.salary = 80000;
Console.ReadLine();
}
}
Maintenant, après c # 3.0, nous allons initialiser en une ligne comme suit.
class Program
{
static void Main(string[] args)
{
Employee emp = new Employee {Name = "Kisan",Id = 55,Department = "IT",salary = 20000};
}
}