为什么我需要“;out”;带有C#中的字符串

本文关键字:带有 字符串 out 为什么 | 更新日期: 2023-09-27 18:10:12

我知道string是C#中的一个值类型。我知道C#中的所有内容都是通过值传递的。

但如果它是一个值类型,就不需要"out"或"ref",对吧?

为什么我需要“;out”;带有C#中的字符串

String是一种引用类型(类(,正如其他人所指出的那样。只是它是不可变的,这使得它有时在某些方面感觉像是一个值类型

您可以通过引用或值传递字符串参数,就像传递任何其他参数一样。绝对清楚这两个概念之间的区别是值得的。我有两篇关于这个主题的文章:

  • 引用类型和值类型
  • C中的参数传递#

真正熟悉这个主题(当然还有阅读我以外的文章(是值得的——理解引用类型和值类型之间的区别在C#中绝对是,理解参数传递(甚至是简单的赋值语句的含义(也是如此。

字符串不是值类型。它是一个不可变的密封引用类型。

关于字符串的MSDN页面可能值得一读。

您必须区分引用类型和通过引用的,因为它们是完全不同的东西。

字符串是一种引用类型,这意味着它是在堆上分配的对象,您可以使用引用来访问它。

当您通过引用传递某个内容时,您传递的是变量,而不是该变量包含的值。当需要更改变量的值时,可以通过引用传递变量,无论该值是值类型还是对对象的引用。

传递变量的默认值是by value,对于字符串,这意味着您向字符串发送引用的副本,而不是字符串数据的副本。

通常,参数是按值传递的,只有在某些特殊情况下,才需要考虑通过引用传递变量。如果您想从一个方法返回一个值(也可以是一个引用(,则使用返回类型。如果需要返回多个值,可以使用outref,但也可以创建一个具有多个属性的对象并返回该属性,因此不需要使用outref

你"知道"的错误事情会把你搞砸。

System.String是不可变的,但它不是一个值类型。

除此之外,ref/out可以与值类型或引用类型一起使用。当您想要替换整个对象时,需要它们。如果您只是想从对象中读取,则不需要它们。如果要更改对象的成员,则值类型需要ref,而引用类型则不需要。

由此我们得出结论,如果您只想读取string,您应该通过值传递它(该值是对字符串内容的引用,但它没有链接到原始字符串变量(。但是,如果要将字符串替换为其他字符串,请使用ref。如果没有任何字符串开头,则首先在函数内部分配,使用out