C# 中的函数声明是:

void foo(string mystring)

与 C 中的此相同:

void foo(char *)

IE。在 C# 中,被调用的函数是否在幕后接收指针?

有帮助吗?

解决方案

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

void foo(const char *);

.Net 字符串是不可变的并且通过引用传递。然而,一般来说,C# 在幕后接收指向对象的指针或引用。

其他提示

C# 中幕后有指针,尽管它们更像 C++ 的智能指针,因此封装了原始指针。char* 与 System.String 并不完全相同,因为指向 char 的指针通常表示字符数组的开头,而 C# 字符串是具有长度字段的对象 一个字符数组。指针指向外部结构,该结构指向类似 wchar_t 数组,因此存在一些使用 C# 字符串和更宽字符来实现 Unicode 支持的间接寻址。

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

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

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

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

您可以使用以下命令强制值类型传递引用 ref 关键词:

public void Foo(ref int value) { value = 12 }
public void Bar()
{
    int val = 3;
    Foo(ref val);
    // val == 12
}

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

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

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

然而它们并不相同。

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

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

任何不是“值类型”的内容(本质上包括枚举、布尔值和内置数字类型)都将“按引用”传递,这可以说与按引用或指针传递的 C/C++ 机制相同。从语法和语义上讲,它本质上与 C/C++ 通过引用传递相同。

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

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

虽然这些在语义意义上确实是等价的(即代码正在用字符串做一些事情),C# 和 Java 一样,将指针完全排除在日常使用之外,将它们降级到诸如转换为本机操作系统函数之类的领域 - 即使如此,也有一些框架类可以很好地包装它们,例如作为安全文件句柄。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top