为什么我需要“;out”;带有C#中的字符串
本文关键字:带有 字符串 out 为什么 | 更新日期: 2023-09-27 18:10:12
我知道string
是C#中的一个值类型。我知道C#中的所有内容都是通过值传递的。
但如果它是一个值类型,就不需要"out"或"ref",对吧?
String是一种引用类型(类(,正如其他人所指出的那样。只是它是不可变的,这使得它有时在某些方面感觉像是一个值类型。
您可以通过引用或值传递字符串参数,就像传递任何其他参数一样。绝对清楚这两个概念之间的区别是值得的。我有两篇关于这个主题的文章:
- 引用类型和值类型
- C中的参数传递#
真正熟悉这个主题(当然还有阅读我以外的文章(是值得的——理解引用类型和值类型之间的区别在C#中绝对是键,理解参数传递(甚至是简单的赋值语句的含义(也是如此。
字符串不是值类型。它是一个不可变的密封引用类型。
关于字符串的MSDN页面可能值得一读。
您必须区分引用类型和通过引用的,因为它们是完全不同的东西。
字符串是一种引用类型,这意味着它是在堆上分配的对象,您可以使用引用来访问它。
当您通过引用传递某个内容时,您传递的是变量,而不是该变量包含的值。当需要更改变量的值时,可以通过引用传递变量,无论该值是值类型还是对对象的引用。
传递变量的默认值是by value,对于字符串,这意味着您向字符串发送引用的副本,而不是字符串数据的副本。
通常,参数是按值传递的,只有在某些特殊情况下,才需要考虑通过引用传递变量。如果您想从一个方法返回一个值(也可以是一个引用(,则使用返回类型。如果需要返回多个值,可以使用out
或ref
,但也可以创建一个具有多个属性的对象并返回该属性,因此不需要使用out
或ref
。
你"知道"的错误事情会把你搞砸。
System.String
是不可变的,但它不是一个值类型。
除此之外,ref
/out
可以与值类型或引用类型一起使用。当您想要替换整个对象时,需要它们。如果您只是想从对象中读取,则不需要它们。如果要更改对象的成员,则值类型需要ref
,而引用类型则不需要。
由此我们得出结论,如果您只想读取string
,您应该通过值传递它(该值是对字符串内容的引用,但它没有链接到原始字符串变量(。但是,如果要将字符串替换为其他字符串,请使用ref
。如果没有任何字符串开头,则首先在函数内部分配,使用out
。