C#引用类型

值类型是按值传递(copy整个对象中的数据,对新对象数据的修改是不会影响到原对象的),而引用类型是按引用传递(仅仅 copy 的是引用--暂时可以把它当作内存地址吧)了!而不仅仅是看它们各自的名称,呵呵。在 C# 中,值类型因为都是按值传递,所以也就不存在对象生命周期,引用计数啊什么的。在 unsafe 的情况下,我们甚至还可以像 C++ 中的那样申

明值类型的指针!但是对于引用类型,这确是不行的。我想,C#中,引用类型的对象都是由系统来管理的;如果再允许我们用指针来指来指去的,整个程序非得乱套了不可!

那么我们再来看看上次那些 C# 的代码

----------------------------------------
// MyClass definition
public class MyClass
{
  public int Value;
}


// ----------------------------------------
// Tester methods
public static void TestRef(ref MyClass m1)
{
  // 这里的 m1 也就相当于大家所说的指向指针的指针:
  // m1 指向 Main 中的 m,而 m 则指向那个实际的 MyClass 的实例
  // 相当于 C++ 中的
  // MyClass** m1 = &m;
  // (*m1)->Value = 10;
  //
  m1.Value = 10;
}

public static void TestNoRef(MyClass m1)
{
  // 这里是一个普通的传递引用类型的例子。相当于:
  // MyClass m1 = m;
  // m1.Value = 20;
  //
  // m1 复制了 m 中的内容,也就是说现在 m1 也和 m 一样,指向了 m 指向的实例
  // 所以这里对 m1 的修改也会影响到 Main 中的 m。
  //
  m1.Value = 20;
}

public static void TestCreateRef(ref MyClass m1)
{
  // 这里的 m1 也是一个指向引用的引用:
  // m1 指向 Main 中的 m,而 m 则指向那个实际的 MyClass 的实例
  // 相当于 C++ 中的
  // MyClass** m1 = &m;
  // *m1 = new MyClass();
  // (*m1)->Value = 100;
  // 在上面的 *m1 = new MyClass() 这个调用的时候,实际上只是将 Main 中 m 的值(引用)给修改了,
  // 也就是说现在 m1 指向 Main 中的 m,而 m 现在则指向了这个新生成的实例。
  // 所以这里 m1.Value = 100 是会影响到 Main 中的结果的
  //
  m1 = new MyClass();
  m1.Value = 100;
}

public static void TestCreateNoRef(MyClass m1)
{
  // 在这个方法里面,我们新申明了一个 MyClass 的实例,而让 m1 指向了这个实例
  // 这时候,实际上将 m1 的值修改了, m1 和 Main 中的 m 各自指向不同的实例
  // 所以对 m1 做的任何修改都不会影响到 m 了
  //
  m1 = new MyClass();
  m1.Value = 200;
}

public static void Main()
{
  MyClass m = new MyClass();
  m.Value = 1;

  TestRef(ref m);
  Console.WriteLine(m.Value);

  TestNoRef(m);
  Console.WriteLine(m.Value);

  TestCreateRef(ref m);
  Console.WriteLine(m.Value);

  TestCreateNoRef(m);
  Console.WriteLine(m.Value);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值