запутался в передаче по ссылке и передаче по значению в С#

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

elf attacked orc for 20 damage!
Current Health for orc is 80
elf attacked orc for 20 damage!
Current Health for orc is 80

это запутало меня в передаче по ссылке, потому что я не ожидал, что здоровье в основном будет 80, так как я передал объект по значению. Может кто-нибудь объяснить, как результат по здоровью в основной функции программы был 80 вместо 100?

//MAIN class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace passingTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // Enemy Objects
            Enemy elf = new Enemy("elf", 100, 1, 20);
            Enemy orc = new Enemy("orc", 100, 1, 20);
            elf.Attack(orc);
            Console.WriteLine("{0} attacked {1} for {2} damage!", elf.Nm, orc.Nm, elf.Wpn);
            Console.WriteLine("Current Health for {0} is {1}", orc.Nm, orc.Hlth);
            Console.ReadLine();

        }
    }
}

// Enemy Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace passingTest
{
    class Enemy
    {
        // variables
        string nm = "";
        int hlth = 0;
        int lvl = 0;
        int wpn = 0;

        public string Nm
        {
            get { return nm; }
            set { nm = value; }
        }
        public int Wpn
        {
            get { return wpn; }
            set { wpn = value; }
        }
        public int Hlth
        {
            get { return hlth; }
            set { hlth = value; }
        }
        public Enemy(string name, int health, int level, int weapon)
        {
            nm = name;
            hlth = health;
            lvl = level;
            wpn = weapon;
        }
        public void Attack(Enemy rival){
            rival.hlth -= this.wpn;
            Console.WriteLine("{0} attacked {1} for {2} damage!", this.nm, rival.nm, this.wpn);
            Console.WriteLine("Current Health for {0} is {1}", rival.nm, rival.hlth);
        }
    }
}

person soso    schedule 18.12.2015    source источник
comment
Не очень понятно, что вас смущает, в методе атаки урон здоровью орка и потом вы просто печатаете его снова на главной   -  person Roni Axelrad    schedule 19.12.2015
comment
Если вы запутались, почему бы просто не выполнить поиск C# MSDN в Google на ref vs value   -  person MethodMan    schedule 19.12.2015


Ответы (2)


В C#/.NET передача объекта по ссылке или по значению определяется типом объекта. Если объект является ссылочным типом (т. е. он объявлен с помощью class), он передается по ссылке. Если объект является типом значения (т. е. он объявлен с помощью struct), он передается по значению.

Если вы измените объявление врага на

struct Enemy

вы увидите семантику передачи по значению.

person gregstoll    schedule 18.12.2015

В C# классы считаются ссылочными типами. Ссылочный тип — это тип, значением которого является ссылка на соответствующие данные, а не сами данные. Например, рассмотрим следующий код:

Вот ссылка с дополнительной информацией по этому вопросу: http://jonskeet.uk/csharp/parameters.html< /а>

person Nichole Boseman    schedule 18.12.2015