栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

理解C#中参数的值和引用以及传递结构和类引用的区别

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

理解C#中参数的值和引用以及传递结构和类引用的区别

值与引用参数之间的区别:
在 C# 中,既可以通过值也可以通过引用传递参数。在调用环境中通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更改。若要通过引用传递参数,请使用 ref 或 out 关键字。
下面的示例阐释值与引用参数之间的区别:

class Program
{
  static void Main(string[] args)
  {
    int arg;

    // Passing by value.
    // The value of arg in Main is not changed.
    arg = 4;
    squareval(arg);
    Console.WriteLine(arg);
    // Output: 4

    // Passing by reference.
    // The value of arg in Main is changed.
    arg = 4;
    squareRef(ref arg);
    Console.WriteLine(arg);
    // Output: 16 
  }

  static void squareval(int valParameter)
  {
    valParameter *= valParameter;
  }

  // Passing by reference
  static void squareRef(ref int refParameter)
  {
    refParameter *= refParameter;
  }
}

向方法传递结构和向方法传递类引用之间的区别

下面的示例演示如何使用 结构 到方法与通过 类 实例不同传递给方法。在此示例中,两个参数 (结构和类实例) 将值和两个方法通过更改参数的一个字段的值。但是,这两个方法的结果是不同的,因为的传递,当您通过时结构什么不同通过,则可以通过类的实例。
由于结构是 值类型,那么,当您对方法的 使用结构值 ,方法受到并对结构参数的副本。方法无法访问原始结构中调用方法并不能将其更改任何方式。该方法可以仅更改副本。
类的实例是 引用类型,而不是值类型。当对方法的 引用类型通过值 ,方法进行引用的复制到类实例。即方法受到实例,而不是复制实例的地址的副本。在调用方法的类实例都有一个地址,在调用方法的参数的地址的副本,因此,两个地址是否引用同一对象。由于该参数包含该地址的副本,调用方法不能更改类实例的地址在调用方法的。但是,调用方法可以使用该地址访问原始地址和该副本引用的类成员。如果调用方法将类成员,在调用方法的原始类的实例也会发生更改。
下面的示例的输出显示差异。,因为该方法在参数中使用该地址查找类的实例,的指定字段调用将类实例的 willIChange 字段的值传递给方法 ClassTaker 。调用不更改结构的 willIChange 字段在调用方法为方法 StructTaker ,因为参数的值是结构的副本,而不是复制其地址。 StructTaker 更改该副本,因此,该副本丢失,在向 StructTaker 调用完成时。

class TheClass
{
  public string willIChange;
}

struct TheStruct
{
  public string willIChange;
}

class TestClassAndStruct
{
  static void ClassTaker(TheClass c)
  {
    c.willIChange = "Changed";
  }

  static void StructTaker(TheStruct s)
  {
    s.willIChange = "Changed";
  }

  static void Main()
  {
    TheClass testClass = new TheClass();
    TheStruct testStruct = new TheStruct();

    testClass.willIChange = "Not Changed";
    testStruct.willIChange = "Not Changed";

    ClassTaker(testClass);
    StructTaker(testStruct);

    Console.WriteLine("Class field = {0}", testClass.willIChange);
    Console.WriteLine("Struct field = {0}", testStruct.willIChange);

    // Keep the console window open in debug mode.
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
  }
}

输出:

  Class field = Changed
  Struct field = Not Changed


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/124497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号