2014-12-18 7 views
-1

Рассмотрим следующий пример: здесь int i передан для справки.Is Out Out может использоваться для передачи ссылочного типа (i.e) объектов?

Мой вопрос: могу ли я передать ссылочный тип ? как объект (т.е.) статической силы сумма (из OutExample эрстед)

class OutExample 
{ 
    static void Sum(out int i) 
    { 
     i = 5; 
    } 
    static void Main(String[] args) 
    { 
    int val; 
    Sum(out val); 
    Console.WriteLine(val); 
    Console.Read(); 
    } 
} 

Теперь ниже код, имеющий некоторую ошибку,

class OutExample 
{ 
    int a; 
    static void Sum(out OutExample oe) 
    { 
    oe.a = 5; 
    } 
    static void Main(String[] args) 
    { 
    int b; 
    OutExample oe1=new OutExample(); 
    Sum(out oe); 
    oe.b=null; 
    Console.WriteLine(oe.b); 
    Console.Read(); 
    } 
    } 

Наконец получил ответ!

class OutExample 
{ 
int a; 
int b; 

static void Sum(out OutExample oe) 
{ 
    oe = new OutExample(); 
    oe.a = 5; 
} 

static void Main(String[] args) 
{ 
    OutExample oe = null; 
    Sum(out oe); 
    oe.b = 10; 
    Console.WriteLine(oe.a); 
    Console.WriteLine(oe.b); 
    Console.Read(); 
} 
} 
+4

Вы попробовали? Это сработало? –

+0

Вы пробовали? –

+0

Я пробовал приведенный выше код, его хорошо работает. @MarcGravell – Balaji

ответ

1

Вы должны создать новый OutExample внутри метода Sum:

class OutExample 
{ 
    int a; 
    int b; 

    static void Sum(out OutExample oe) 
    { 
     oe = new OutExample(); 
     oe.a = 5; 
    } 

    static void Main(String[] args) 
    { 
     OutExample oe = null; 
     Sum(out oe); 
     oe.b = 10; 
     Console.WriteLine(oe.a); 
     Console.WriteLine(oe.b); 
     Console.Read(); 
    } 
} 
+0

Ок, но ** b ** подчеркнуто красным цветом, класс не содержит определения для ** b ** – Balaji

+0

Это правда. Вы определили 'b' внутри' Main', поэтому это локальная переменная, а не поле класса, такое как 'a'. – t3chb0t

+0

определение ** b ** находится только в ** Основной **, то как это может быть не локальная переменная? – Balaji

1

Да ...

static void Sum(out OutExample oe) 
{ 
    oe = null; 
    // or: oe = new OutExample(); 
} 
class OutExample {} 
+0

Если это ** null ** как я могу использовать его в ** Main() **? – Balaji

+0

@Balaji, что до 'Main'! и, конечно, 'Sum' может установить его на ненулевой экземпляр –

+0

, можете ли вы полностью отредактировать приведенные выше pgm и ваш ответ тоже? – Balaji

1

Я хотел бы предложить вам пересмотреть что-то. Тип ссылки - это ссылка на место хранения. Переходя в out, вы передаете ссылку на эти ссылки. Почему бы вам не перейти напрямую на ref?

+0

Я думаю, что @Balaji использует 'out', потому что он хотел узнать, как это работает. Вопросы, будь то хорошая или плохая практика, придут позже :-) – t3chb0t