C#中的C指针
这是C#中的函数声明吗?
void foo(string mystring)
与C中的这个相同:
void foo(char *)
即在C#中,被调用函数是否在幕后接收到指针?
解决方案
回答
从本质上讲,是的。在C#中,字符串(实际上是System.String)是引用类型,因此,在调用foo()时,它将接收指向堆中字符串的指针。
回答
在这种特定情况下,它更像是:
void foo(const char *);
.Net字符串是不可变的,并通过引用传递。但是,一般来说,Creceives指向幕后对象的指针或者引用。
回答
cstring中的no是unicode。
在cit中不称为指针,而是引用。
回答
如果意思是允许该方法访问字符空间的内容,则答案为是。
回答
是的,因为字符串的大小是动态的,所以在后台必须有堆内存
但是它们并不相同。
在c中,指针指向一个字符串,该字符串也可以在其他地方使用,因此更改它会影响其他位置。
回答
对于值类型(int,double等),该函数将接收值的副本。对于其他对象,它是指向原始对象的引用。
字符串之所以特殊是因为它们是不可变的。从技术上讲,这意味着它将通过引用,但是在实践中,它将表现得非常类似于值类型。
我们可以使用ref
关键字强制值类型传递引用:
public void Foo(ref int value) { value = 12 } public void Bar() { int val = 3; Foo(ref val); // val == 12 }
回答
尽管C#的智能指针更像C ++的智能指针,但在C#中还是有一些指针。 char *与System.String并不完全相同,因为指向char的指针通常表示字符数组的开始,而Cstring是具有长度字段和字符数组的对象。指针指向外部结构,该结构指向wchar_t数组之类的东西,因此存在一些间接作用,其中包含Cstring和更宽的字符以支持Unicode。
回答
否。在C语言(和所有其他.NET语言)中,String是一流的数据类型。它不仅仅是一个字符数组。我们可以在它们之间来回转换,但是它们的行为并不相同。 String类有许多可用的字符串处理方法(例如" Substring()"和" StartsWith"),通常不适用于数组,而字符数组只是其中的一个实例。
回答
据我所知,C中的所有类(不确定其他类)都是引用类型。
回答
任何非"值类型"(本质上涵盖枚举,布尔值和内置数字类型)的内容都将"通过引用"传递,这可以说与通过引用或者指针传递的C / C ++机制相同。在语法和语义上,它与通过引用传递的C / C ++本质上相同。
但是请注意,Cstrings是不可变的,因此即使通过引用传递了该字符串,也不能在不创建新字符串的情况下编辑该字符串。
还要注意,无论C是值类型还是引用类型,都不能在C#中将参数作为" const"传递。
回答
尽管这些在语义上确实是等效的(例如,代码正在使用字符串执行某些操作),但是C#(类似于Java)使指针完全脱离了日常使用,即使在那时,它们也被转移到了诸如向本机OS功能过渡的领域。是框架类,可以很好地包装它们,例如SafeFileHandle。
长话短说,不要用C#中的指针思考。