2012-01-03 3 views
4

Я хотел бы сократить выражение какКак использовать ссылки на переменную в C#

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#?

И как я могу сделать ссылку на переменную int как следующий C++ код делает:

int A = 5; 
int& B = A; 
B = 12; 

Update: Метод 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 минус множественное наследование) –

+0

Я просто хочу сократить код. Есть ли способ сделать короткий псевдоним имени для 'ConfigurationService.ApplicationSettings.rect1' struct? – ezpresso

+1

Почему вы даже хотите ссылку на него? Просто поставьте вещь в переменную .. – harold

ответ

6

Это должно работает, предполагая, что тип rect1 является Rect (var ключевое слово не понравилось, но все):

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

На самом деле, это создаст копию структуры, но мы должны заботиться? Поскольку вы хотите читать только поле, можно использовать копию.

(обратите внимание, я не уверен, если это копия)

+3

Если это структура, это копия. –

+0

@TomislavMarkovski: спасибо за подтверждение моей интуиции –

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.

Если 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); 
Смежные вопросы