2013-03-12 3 views
0
static void increment(int num) 
{ 
    num++; 
} 

static void Main(string[] args) 
{ 
    int x = 30; 
    Console.WriteLine(x); 
    increment(x); 
    Console.WriteLine(x); 
} 

Привет, я задаюсь вопросом, почему результат этого кода и , NO ЛЮБОЕ ИЗМЕНЕНИЕ? благодаря!почему результаты этого кода одинаковы?

+7

обратитесь к основному учебнику –

+0

попробуйте инициализировать вне метода – Kiran

+0

Хотя я потерял много репутации, Я рад получить ответ! – user2049259

ответ

4

Поскольку в приращении функции, параметр передается по значению, а не по ссылке.

Если вы хотите увидеть х изменилось, либо сделать

static int increment (int num)//parameter passed by value, but function now returns an incremented value, not void. 
    { 
     num++; 
     return num; 
    } 
     static void Main (string[] args) 
    { 
     int x=30; 

     Console.WriteLine(x); 
     x = increment(x); 
     Console.WriteLine(x); 
    } 

или

static void increment (ref int num)//num is passed by ref now 
    { 
     num++; 
    } 
     static void Main (string[] args) 
    { 
     int x=30; 

     Console.WriteLine(x); 
     increment(ref x); 
     Console.WriteLine(x); 
    } 
0

Потому что int является value type. Он не передается по ссылке. Он передается по значению (копия создана и передана в метод). Таким образом, любые изменения параметра num в методе increment не влияют на значение x в вызывающем коде. Только копия значения x изменяется в increment.

static void increment(int num) // here you have copy of x 
{ 
    num++; // copy is modified 
} 

static void Main(string[] args) 
{ 
    int x = 30; 
    Console.WriteLine(x); 
    increment(x); // x stays here and not passed into method 
    Console.WriteLine(x); 
} 
+0

спасибо! хотя я потерял много репутации, все еще счастлив получить ответ! – user2049259

+1

@ user2049259 один нисходящий не очень репутационный :) –

1

Причина в том, что значение int передается, а не ссылка.

Если вы изменили приращение принять (исх целое) и назвал его - increment (ref x) было бы изменить его

+0

спасибо! хотя я потерял много репутации, все еще счастлив получить ответ! – user2049259

+0

надеюсь, ваше славное спасибо получит вас назад :) – NDJ

1

Ваш метод приращения по существу абсолютно ничего не делает. Он не возвращает измененное значение. Линия num++ будет увеличивать num на один, но тогда вы ничего не возвращаете. Таким образом, num всегда будет одинаковым. Вы могли бы пройти мимо исх используя ref ключевое слово, например

static void increment (ref int num) 
{ 
    num++; 
} 

Что бы изменить значение NUM дает вам 31 на второй WriteLine вызова.

+0

спасибо! хотя я потерял много репутации, все еще счастлив получить ответ! – user2049259

0

Причина в том, что вы передали числовую переменную по значению не по ссылке. При передаче по значению значение переменной копируется в локальную копию, тогда локальная копия увеличивается, но уничтожается позже после завершения метода. Если вы передаете переменную по ссылке, то адрес переменной передается методу, а исходная переменная изменяется, а не ее копия.

static void increment (ref int num) 
    { 
     num++; 
    } 

И тогда вы вызываете этот метод с

increment(ref x); 

типа int это значение и, как и все другие типы значений всегда передаются по значению, если ключевое слово ref не используется. В отличие от них, типы классов передаются как ссылки, а их изменение в методах изменяет исходный объект.

0

x определено локально.

При попытке напечатать Console.WriteLine(num); в increment (int num)

Он напечатает 31.

0

ИНТ тип значения, вы должны объявить параметр как исх:

static void increment (ref int num) 
Смежные вопросы