2012-01-03 42 views
4

使用的參考變量,我想用參照ConfigurationService.ApplicationSettings.rect1變量縮短表達類似如何讓C#

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

喜歡的東西this.GdkWindow.GetPosition(refRect1.X, refRect1.Y)

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

,但有沒有辦法避免使用臨時變量?即使PHP有C#缺少一個功能?絕對失望的C#!

+3

如果你想創建引用int,你不認爲是託管的。即使有'ref'關鍵字,忘記了你用C++學到的東西(除了所有的OOP東西減去多繼承) – 2012-01-03 23:45:38

+0

我只想縮短代碼。有什麼方法可以爲'ConfigurationService.ApplicationSettings.rect1'結構創建一個簡短的別名嗎? – ezpresso 2012-01-03 23:47:49

+1

爲什麼你甚至想要參考它?只是把事情本身放在一個變量中。 – harold 2012-01-03 23:48:45

回答

6

這應該工作,假設rect1類型是Rectvar關鍵字不招人喜歡,但每個人都):

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

事實上,這將創建結構的副本,但我們應該關心?由於您只想閱讀字段,因此可以使用副本。

(注意:我不知道,如果是複印件)

+3

如果它是一個結構,它是一個副本。 – 2012-01-03 23:51:35

+0

@TomislavMarkovski:謝謝你確認我的直覺 – 2012-01-03 23:53:15

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

正如編譯器說的A property, indexer or dynamic member access may not be passed as an out or ref parameter

2

我不認爲這是圍繞使用臨時變量,因爲每次訪問ConfigurationService.ApplicationSettings.rect1的矩形對象的副本時作出的一種方式。

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