4

这是 C# 中的函数声明:

void foo(string mystring)

与 C 中的这个相同:

void foo(char *)

即在C#中,被调用函数是否在后台接收指针?

4

11 回答 11

12

在这个特定的例子中,它更像是:

void foo(const char *);

.Net 字符串是不可变的并通过引用传递。但是,通常 C# 在后台接收指向对象的指针或引用。

于 2008-09-15T17:01:19.497 回答
5

C# 背后有指针,虽然它们更像 C++ 的智能指针,所以封装了原始指针。char* 与 System.String 并不完全相同,因为指向 char 的指针通常表示字符数组的开始,而 C# 字符串是具有长度字段字符数组的对象。指针指向外部结构,该结构指向类似于wchar_t数组的东西,因此对于 Unicode 支持,有一些 C# 字符串和更宽字符的间接性。

于 2008-09-15T17:03:08.307 回答
5

不。在 C#(和所有其他 .NET 语言)中,String 是一流的数据类型。它不仅仅是一个字符数组。您可以在它们之间来回转换,但它们的行为不同。有许多可用于 String 类的字符串操作方法(如“Substring()”和“StartsWith”),它们通常不适用于数组,字符数组只是其中的一个实例。

于 2008-09-15T17:06:14.633 回答
4

本质上,是的。在 C# 中,字符串(实际上是 System.String)是一个引用类型,所以当 foo() 被调用时,它会收到一个指向堆中字符串的指针。

于 2008-09-15T17:00:28.733 回答
3

对于值类型(int、double 等),函数接收值的副本。对于其他对象,它是指向原始对象的引用。

字符串是特殊的,因为它们是不可变的。从技术上讲,这意味着它将传递引用,但实际上它的行为非常像值类型。

ref您可以使用关键字强制值类型传递引用:

public void Foo(ref int value) { value = 12 }
public void Bar()
{
    int val = 3;
    Foo(ref val);
    // val == 12
}
于 2008-09-15T17:02:41.803 回答
1

c# 字符串中的 no 是 unicode。在 c# 中,它不称为指针,而是引用。

于 2008-09-15T17:01:50.807 回答
1

如果您的意思是 - 是否允许该方法访问字符空间的内容,答案是肯定的。

于 2008-09-15T17:02:18.293 回答
1

是的,因为字符串是动态大小的,所以幕后肯定有堆内存

但是它们并不相同。

在 c 中,指针指向一个也可以在其他地方使用的字符串,因此更改它会影响其他地方。

于 2008-09-15T17:02:27.310 回答
1

任何不是“值类型”的东西,基本上涵盖了枚举、布尔值和内置数字类型,都将“按引用”传递,这可以说与 C/C++ 通过引用或指针传递的机制相同。在语法和语义上,它本质上与 C/C++ 通过引用传递相同。

但是请注意,在 C# 中字符串是不可变的,因此即使它是通过引用传递的,您也无法在不创建新字符串的情况下编辑该字符串。

另请注意,您不能在 C# 中将参数作为“const”传递,无论它是值类型还是引用类型。

于 2008-09-15T17:27:57.733 回答
1

虽然这些在语义上确实是等价的(即代码正在用字符串做某事),但 C# 与 Java 一样,将指针完全排除在日常使用之外,将它们归入诸如转换到本机 OS 函数之类的领域——即便如此,有一些框架类可以很好地包装它们,例如 SafeFileHandle。

长话短说,不要特意考虑 C# 中的指针。

于 2008-09-15T17:50:53.123 回答
0

据我所知,C# 中的所有类(不确定其他类)都是引用类型。

于 2008-09-15T17:12:56.897 回答