这是 C# 中的函数声明:
void foo(string mystring)
与 C 中的这个相同:
void foo(char *)
即在C#中,被调用函数是否在后台接收指针?
这是 C# 中的函数声明:
void foo(string mystring)
与 C 中的这个相同:
void foo(char *)
即在C#中,被调用函数是否在后台接收指针?
在这个特定的例子中,它更像是:
void foo(const char *);
.Net 字符串是不可变的并通过引用传递。但是,通常 C# 在后台接收指向对象的指针或引用。
C# 背后有指针,虽然它们更像 C++ 的智能指针,所以封装了原始指针。char* 与 System.String 并不完全相同,因为指向 char 的指针通常表示字符数组的开始,而 C# 字符串是具有长度字段和字符数组的对象。指针指向外部结构,该结构指向类似于wchar_t数组的东西,因此对于 Unicode 支持,有一些 C# 字符串和更宽字符的间接性。
不。在 C#(和所有其他 .NET 语言)中,String 是一流的数据类型。它不仅仅是一个字符数组。您可以在它们之间来回转换,但它们的行为不同。有许多可用于 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# 字符串中的 no 是 unicode。在 c# 中,它不称为指针,而是引用。
如果您的意思是 - 是否允许该方法访问字符空间的内容,答案是肯定的。
是的,因为字符串是动态大小的,所以幕后肯定有堆内存
但是它们并不相同。
在 c 中,指针指向一个也可以在其他地方使用的字符串,因此更改它会影响其他地方。
任何不是“值类型”的东西,基本上涵盖了枚举、布尔值和内置数字类型,都将“按引用”传递,这可以说与 C/C++ 通过引用或指针传递的机制相同。在语法和语义上,它本质上与 C/C++ 通过引用传递相同。
但是请注意,在 C# 中字符串是不可变的,因此即使它是通过引用传递的,您也无法在不创建新字符串的情况下编辑该字符串。
另请注意,您不能在 C# 中将参数作为“const”传递,无论它是值类型还是引用类型。
虽然这些在语义上确实是等价的(即代码正在用字符串做某事),但 C# 与 Java 一样,将指针完全排除在日常使用之外,将它们归入诸如转换到本机 OS 函数之类的领域——即便如此,有一些框架类可以很好地包装它们,例如 SafeFileHandle。
长话短说,不要特意考虑 C# 中的指针。
据我所知,C# 中的所有类(不确定其他类)都是引用类型。