J’ai une classe appelée BaseRobot
:
var robot2 = new BaseRobot(0, 0, 0); private Point mHome; public Point Home { get { return mHome; } }
C’est là que la maison d’origine est créée. Je souhaite créer une nouvelle maison dans le program.cs
. J’ai le code suivant, mais cela ne fonctionne pas, il y a une erreur qui dit
Impossible de modifier la valeur de retour car il ne s’agit pas d’une variable.
Code:
robot2.Home.X = 1 robot2.Home.Y = 5; { Console.WriteLine("===New robot at specified home position==="); SsortingngBuilder ab = new SsortingngBuilder(); ab.AppendFormat("Robot#2 has home at .\r\n ", robot2.Home.X, robot2.Home.Y); ab.AppendFormat("It is facing {0} ", robot2.Orientation); ab.AppendFormat("and is currently at .\r\n", robot2.Position.X, robot2.Position.Y); Console.WriteLine(ab.ToSsortingng()); }
Comment atsortingbuez-vous de nouvelles valeurs à x et à Y?
Vous devez définir la propriété Home
directement, il est généralement préférable de créer un nouvel object Point
…
robot2.Home = new System.Drawing.Point(1, 5);//x, y
Aussi, afin de permettre que vous deviez appliquer un accesseur set
à votre propriété d’ Home
…
public Point Home { get { return mHome; } set { mHome = value; } }
Si vous voulez en savoir plus sur les raisons pour lesquelles le compilateur ne vous laissera pas atsortingbuer la valeur directement à la propriété X
, consultez quelques-unes des réponses ici
Vous devez changer votre code comme ceci:
private Point mHome; public Point Home { get { return mHome; } set { mHome = value; } }
et le mettre comme ceci:
robot2.Home = new Point(1, 5);
Les structures étant immuables, la modification de valeur renvoie en fait une nouvelle instance de Point
, mais votre propriété n’a pas de paramètre de définition.
Vous devez append un accesseur set
à la propriété Home
:
private Point mHome; public Point Home { get { return mHome; } set { mHome = value; } }
System.Drawing.Point
est un type de valeur, ce qui signifie que votre propriété Home
renvoie une copie du mHome
privé plutôt qu’une référence à celui-ci.
Vous devrez append un séparateur pour la propriété Home et ajuster votre code pour:
private Point mHome; public Point Home { get { return mHome; } set {mHome = value;} }
Ajustez votre code d’appel pour atsortingbuer un nouveau point à la maison:
robot2.Home = new Point(1, 5);
En plus de la solution déjà mentionnée pour créer un séparateur de propriétés publiques, vous pouvez également:
Créer des méthodes de public void SetHomeX(double x) { mHome.X = x; } public void SetHomeY(double y) { mHome.Y = y; }
public void SetHomeX(double x) { mHome.X = x; } public void SetHomeY(double y) { mHome.Y = y; }
Exposer le terrain comme public public Point Home;
Remarque: exposer un dossier comme public est généralement considéré comme une solution peu intéressante. Mais peut être utile dans certaines situations.
J’ai rencontré quelque part cette bonne explication (je vais l’adapter à ce cas en cours):
C’est une mauvaise partie de la conception C #.
En interne, des éléments tels que robot2.Home
sont implémentés en tant que propriétés. Ainsi, lorsque vous essayez d’atsortingbuer une valeur à Home.X
, une fonction get pour Home
est appelée sous le capot (et c’est là que ” Impossible de modifier la valeur de retour de .. ” va de). Lorsque cela est fait, vous ne pouvez pas affecter un membre individuel ( X
) de la structure Point
, mais vous devez affecter la structure entière.
Donc, en C #, vous devez lire la valeur dans un Point
, puis le modifier:
robot2.Home = robot2.Home + new Point (deltaX, deltaY);
Ou (si nous ne sums pas intéressés par la valeur précédente (comme dans ce cas)), affectez-la simplement à la nouvelle:
robot2.Home = new Point (1f, 5f);
PS: Bien sûr, vous devez également append un séparateur pour la propriété Home (comme il est mentionné dans d’autres réponses).
C’est une hypothèse, mais les propriétés X et Y ne sont probablement que des accesseurs, comme la propriété Your Home.
Existe-t-il une fonction dans votre classe de robot pour déplacer la position? Utiliser ça. si non donner un exemple complet s’il vous plaît