如何在C#中利用变量的引用

4
我希望缩短类似以下表达式的长度:
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# 感到非常失望!


3
如果你想创建对int的引用,不要考虑托管。即使有 ref 关键字,也请忘记你在C ++中学到的内容(除了所有OOP内容和多继承)。 - Steve B
我只想缩短代码。有没有办法为 ConfigurationService.ApplicationSettings.rect1 结构体创建一个简短的别名? - ezpresso
1
为什么你需要它的引用?把这个东西本身放在一个变量里就好了。 - harold
@ezpresso,你不能将属性用作“out”参数的输入。在你的情况下,你必须使用临时变量。 - Tomislav Markovski
@Tomislav,ConfigurationService.ApplicationSettings.rect1 是一个公共字段,而不是属性。 - ezpresso
显示剩余2条评论
3个回答

6

假设rect1的类型是Rect(虽然不是每个人都喜欢var关键字),这应该可以正常工作:

Rect r = ConfigurationService.ApplicationSettings.rect1;
this.GdkWindow.GetPosition(r.X,
                           r.Y);

实际上,这将创建一个结构的副本,但我们是否应该关心?由于您只想读取字段,因此可以使用副本。

(请注意,我不确定它是否是副本)


3
如果它是一个结构体,那么它就是一份拷贝。 - Tomislav Markovski

3

这些都是嵌套属性,所以您无法简化它们,除非您先将它们存储在变量中。关于长命名空间,您可以采取以下做法:

using System.Data.Long.Namespace.Here.SqlClient = SQLALIAS;

然后像这样使用:SQLALIAS.ClassName。 至于第二个问题,要在.NET中使用指针,您需要在unsafe上下文中使用它们,并勾选“允许不安全代码”选项构建项目,尽管我不确定它是如何工作的,甚至是否会在您使用GdkWindow时编译。

unsafe
{
    int A = 5;
    int* B = &A;
}

关于您的更新:

您需要像这样调用 GetPosition。

int x, y;
GetPosition(out x, out y);

编译器会提示错误信息:属性、索引器或动态成员访问不能作为 out 或 ref 参数传递。


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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接