如果我包含f1()。
,则不会编译以下代码然而,我看到X&在智能感知中的Y,在调用f2()的调用中调用calculateXY()时的值。
f1()编译错误为:object does not contain a definition or x {or for y for that matter
,.x为红色下划线。
private object calculateXY(int id) {
// bla bla bla
return (new { x = calX, y = calY });
}
/*
f1() {
var p = calculateXY(10);
p.x + 1;
}
*/
f2() {
var p = calculateXY(10);
//p.x + 1;
}
答案 0 :(得分:2)
我添加这个只是为了完成答案。 在整个解决方案中,此类仅实例化两次。它很小所以我觉得我没事。
public class plotPoint {
public plotPoint (int x, int y){
this.x = x;
this.y = y;
}
public int x { get; set; }
public int y { get; set; }
}
和
private plotPoint calculateXY(int id) {
//bla bla bla
return (new plotPoint(_pointX, _pointY));
}
虽然我并不喜欢这个名字。
我想我最近一直在做很多javascript。 JS会对我希望逃避的事情有疑问。哦,好吧。
因此,我们看到了另一个无谓的疯狂使用全局变量的死亡。
感谢大家的投入。
答案 1 :(得分:0)
calculateXY返回一个没有x或y属性的对象。您 可以返回动态,或使用反射来读取x和y - 的 KMoussa 强>
和
正如@KMoussa所说,你正在归还一个物体。最好的办法是回归 动态,但如果你要返回一个对象,你应该返回一个 适当的类或结构。 - TyCobb
谢谢你们。
答案 2 :(得分:0)
我建议写一个IntPoint
课程:
public class IntPoint { int X; int Y; }
然后归来。确保将方法的返回类型声明为IntPoint
,这样您就可以轻松使用返回值而不会产生任何废话:
private IntPoint CalculateXY(int id) {
// bla bla bla
return new IntPoint { X = calX, Y = calY };
}
...
IntPoint ip = CalculateXY(12);
Console.WriteLine(ip.X);
我不建议使用dynamic
。如果按照我上面建议的方式执行此操作,则会将编译器放在您的角落,代表您工作,以确保调用您的方法的任何代码都知道它正在获取并正确使用它。 dynamic
用于其他事情,通常是相当异乎寻常的事情 - 我已经了解它多年并且从未在生产代码中使用它。
与原始示例一样,匿名类型几乎从不从方法返回。由于您已经发现的原因,这也是异国情调的东西。有时候找一个合适的返回类型会更麻烦(或者写一个,就像我们上面所做的那样),但这通常是值得的。
这是另一种选择:
private void CalculateXY(int id, out int x, out int y) {
// bla bla bla
x = calX;
y = calY;
}
像......一样打电话。
int x, y;
CalculateXY(32, out int x, out int y);
这不是我最喜欢的,但它是一个强类型,正确命名的选项,并且不需要编写一个新类来保存返回类型。我不介意在代码中看到它。
在评论中,@ KMoussa建议Tuple<int,int>
作为返回类型。这是可行的,如果它是一个私人助手函数,那不是你能做的最糟糕的事情,但如果代码被维护了“Item2 谁?”随着时间的推移,成本将超过编写快速课程的前期成本。 Tuple
是IIRC,最初设计用于执行现在使用的匿名类型。