对c#中的引用传递和值传递感到困惑
Posted
技术标签:
【中文标题】对c#中的引用传递和值传递感到困惑【英文标题】:confused about Passing by reference and passing by value in c# 【发布时间】:2016-03-25 17:49:32 【问题描述】:我是这里的新程序员。我有以下代码。我按值传递对象,但是当我打印结果时,我得到了这个
elf attacked orc for 20 damage!
Current Health for orc is 80
elf attacked orc for 20 damage!
Current Health for orc is 80
这让我对按引用传递感到困惑,因为我没想到 main 中的运行状况为 80,因为我按值传递了对象。有人能解释一下程序 main 函数中的健康结果是 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);
【问题讨论】:
不清楚是什么让你感到困惑,在攻击方法中兽人健康受损,然后你只需在主页面上再次打印它 如果您感到困惑,为什么不在ref vs value
上进行 C# MSDN google 搜索
【参考方案1】:
在 C#/.NET 中,对象是通过引用传递还是通过值传递取决于对象的类型。如果对象是引用类型(即用class
声明),则通过引用传递。如果对象是值类型(即用struct
声明),则按值传递。
如果将 Enemy 的声明更改为
struct Enemy
您将看到按值传递的语义。
【讨论】:
【参考方案2】:在 C# 中,类被视为引用类型。引用类型是一种类型,它的值是对适当数据的引用,而不是数据本身。例如,考虑以下代码:
这里有一个链接,其中包含有关该主题的更多信息:http://jonskeet.uk/csharp/parameters.html
【讨论】:
以上是关于对c#中的引用传递和值传递感到困惑的主要内容,如果未能解决你的问题,请参考以下文章