我想缩短像
这样的表达方式this.GdkWindow.GetPosition(ConfigurationService.ApplicationSettings.rect1.X,
ConfigurationService.ApplicationSettings.rect1.Y);
类似于this.GdkWindow.GetPosition(refRect1.X, refRect1.Y)
,引用了ConfigurationService.ApplicationSettings.rect1
变量。
在C ++中,我能够使用对象(或变量)的引用,如下所示:
Rect& refRect1 = very.very2.very3.long_variable.rect1;
GetPosition(refRect1.x, refRect1.y);
如何在C#中使用相同的内容?
如何像以下C ++代码那样引用int
变量:
int A = 5;
int& B = A;
B = 12;
更新: GetPosition
方法声明为void GetPosition(out int x, out int y)
。该方法使用一些数据填充ConfigurationService.ApplicationSettings.rect1
结构。这就是为什么我想使用参考。
我知道我可以这样做:
var rect = new Gdk.Rectangle();
this.GdkWindow.GetPosition(out rect.X, out rect.Y);
this.GdkWindow.GetSize(out rect.Width, out rect.Height);
ConfigurationService.ApplicationSettings.rect1 = rect;
但有没有办法避免使用临时变量? C#是否缺少PHP的功能?对C#绝对失望!
答案 0 :(得分:6)
这应该有效,假设rect1
的类型为Rect
(var
关键字不受欢迎,但每个人都不喜欢):
Rect r = ConfigurationService.ApplicationSettings.rect1;
this.GdkWindow.GetPosition(r.X,
r.Y);
实际上,这将创建结构的副本,但我们应该关心吗?由于您只想阅读字段,因此可以使用副本。
(注意我不确定它是否是副本)
答案 1 :(得分:3)
这些都是嵌套属性,因此除非先将它们存储在变量中,否则不能缩短它们。关于长命名空间,您可以执行类似
的操作using System.Data.Long.Namespace.Here.SqlClient = SQLALIAS;
然后像SQLALIAS.ClassName
一样使用它。
至于第二个问题,要在.NET中使用指针,你需要在unsafe
上下文中使用它们并使用选项“允许不安全代码”来构建你的项目,虽然我不确定它是如何工作的,即使它是将在Mono下编译,我认为你使用的是GdkWindow
。
unsafe
{
int A = 5;
int* B = &A;
}
跟进您的更新:
你必须像这样调用GetPosition。
int x, y;
GetPosition(out x, out y);
编译器说A property, indexer or dynamic member access may not be passed as an out or ref parameter
。
答案 2 :(得分:2)
我认为没有办法使用临时变量,因为每次访问ConfigurationService.ApplicationSettings.rect1时都会生成一个Rect对象的副本。
如果Rect.X和Rect.Y是公共字段,您可以这样做:
Rect r;
this.GdkWindow.GetPosition(out r.X, out r.Y);
ConfigurationService.ApplicationSettings.rect1 = r;
如果他们是属性,您需要:
int x, y;
this.GdkWindow.GetPosition(out x, out y);
ConfigurationService.ApplicationSettings.rect1 = new Rect(x, y);