Je suis nouveau à C # venant d'un Java Contexte. Je travaille sur une cession à la maison pour une entrevue de codage. J'écris normalement mon code comme suit (Java):
public class Test {
//fields
private string fieldA;
private int fieldB;
public Test () {
//.....
}
public String getFieldA() {
return fieldA;
}
//ETC.
}
Le point est que j'utilise des getters/setters comme ci-dessus. Maintenant, j'ai une affectation de codage à faire pour un entretien d'embauche et utiliser C # J'ai trébuché sur les propriétés automatiques. J'étais initialement légèrement confus à ce sujet, mais comprends ce qu'il fait maintenant et l'avez utilisé.
Donc, pour les champs j'écrirais
public string fieldA {get; set;}
Il se sent bizarre de déclarer des champs publics comme ça et ne violent-t-il pas certains OOP Principes d'encapsulation?
Ma question est que devrais-je simplement aller de l'avant et utiliser des propriétés automatiques pour montrer aux intervieweurs que je sais ce que c'est? Au cas où je voudrais empêcher de définir un champ, je pouvais simplement utiliser:
public string fieldA {get; private set;}
Mais cela semblerait-il comme si je ne suivez pas d'encapsulation "règles", je ne voudrais évidemment pas risquer cela. Je pourrais l'écrire comme je le fais à Java.
En général, quelle est votre vue sur l'utilisation de propriétés automatiques?
À un premier coup d'œil, ces deux lignes peuvent sembler identiques:
public string A;
public string B {get; set;}
mais ils ne sont pas pareils du tout. Comme vous le saurez, si vous utilisez un champ public et à l'avenir, vous devez ajouter une certaine logique lors de l'obtention ou de la définition de la valeur, vous ne pouvez pas (sauf si vous cassez l'interface que vous fournissez à d'autres). Vous ne pouvez pas, car la valeur n'est pas encapsulée.
Avec une propriété automatique, vous pouvez plutôt ajouter plus de logique quand vous le souhaitez, sans qu'il soit nécessaire de modifier l'interface fournie par votre classe. Il suffit de remplacer la propriété automatique par une standard. Ou, vice-versa, vous pouvez remplacer la propriété standard avec un automatique. À un utilisateur externe, rien ne change.
Donc non, vous n'êtes même pas une encapsulation à distance. Vous utilisez simplement un sucre syntaxique pratique.
Si vous le pouvez, utilisez-les. Dans les coulisses, le compilateur fait plus que de faire un champ public. Le champ est toujours privé.
La propriété automatique
public string MyField { get; private set; }
serait converti en quelque chose comme ça (la version longue)
private string _myfield;
public string MyField
{
get
{
return _myfield;
}
private set
{
_myfield = value;
}
}
En interne, le compilateur générera des méthodes Getter et Setter comme vous les connaissez de Java. Donc, il n'y a aucune violation d'aucun OOP Principes.
Les propriétés automatiques sont une manière idiomatique de faire des getters/setters en C #. Si vous vous rendez partis à une interview et que vous souhaitez montrer que vous avez couru le C #, par tous les moyens, utilisez des propriétés automatiques. Surtout si vous venez d'un Java Contexte, il devrait être rassurant aux intervieweurs s'ils voient que vous êtes déjà un pas à l'avance de l'écriture Java dans Visual Studio .
Cependant, vous avez raison en utilisant public string fieldA {get; set;}
L'aveugle est une odeur de code. Il est très tentant et pratique de définir un ensemble de propriétés initiales comme publique et ne reviendrez jamais à revoir si elles devraient faire partie de l'interface de classe ou non. Et vous pouvez réellement casser l'encapsulation (comme dans "Information cache") de cette façon.
Donc, pour résumer: utilisez-les, mais faites attention à ne pas les transformer en champs publics glorifiés.
Je sais que la technologie basée sur XAML (WPF, Windows Phone) n'acceptera pas de champs publics comme
public string a;
... pour la liaison de données dans XAML.
Vous devez plutôt utiliser des propriétés publiques comme:
public string a { get; set; }
Même s'ils ressemblent à la même chose. Alors oui, ça fait la différence.