我可以用c#这样做来确定字符串长度吗?

我可以用c#这样做来确定字符串长度吗?,c#,string-length,C#,String Length,出于好奇,我试图在不使用属性或方法的情况下确定字符串长度,这在C中是可行的,但对于\0这个概念来说还是有点新的 据我所知,我所说的是C,这个字符是在将值设置为某个字符串后自动放置的,这样就可以确定存储需要多少空间,但是在C#中这是如何工作的呢 string str = "someText"; int lenght = 0; while (str[lenght]!='\0') { lenght++; } Console.WriteLine(str); Console.WriteLine("

出于好奇,我试图在不使用属性或方法的情况下确定字符串长度,这在C中是可行的,但对于
\0
这个概念来说还是有点新的

据我所知,我所说的是C,这个字符是在将值设置为某个字符串后自动放置的,这样就可以确定存储需要多少空间,但是在C#中这是如何工作的呢

string str = "someText";
int lenght = 0;
while (str[lenght]!='\0')
{
    lenght++;
}
Console.WriteLine(str);
Console.WriteLine("String lenght is : "+ lenght);
Console.ReadLine();
字符串是
string
类型的对象,其值为text。在内部,文本存储为Char对象的顺序只读集合在C#字符串的末尾没有空终止字符;因此,C#字符串可以包含任意数量的嵌入空字符(“\0”)。字符串的Length属性表示它包含的字符对象的数量,而不是Unicode字符的数量。要访问字符串中的单个Unicode代码点,请使用StringInfo对象

C#字符串没有终止字符。相反,它们的实际长度与文本本身一起存储。这就是所谓的

您可以使用
length
属性访问长度。

这里是C代码


在C语言中,nul字符终止作为字符数组处理的字符串是标准库支持的一种约定。它不是语言本身的一部分。请注意,在设置C字符串值时,没有任何东西可以“自动”放置nul字符,它由库和编译器处理常量


C#不使用以nul结尾的字符串,因此所有这些都不适用。

将字符串视为一个抽象的字符序列。在计算机库中实现这种序列有多种方法。以下是一些例子:

  • 以Null结尾的-字符序列以特殊字符值
    '\0'
    结尾。C使用这种表示
  • 以字符结尾-这类似于以null结尾,但使用了不同的特殊字符。这种表现在当今是罕见的
  • 长度前缀-字符串的前几个字节用于存储其长度。帕斯卡使用了这种表示法
  • 长度和字符数组-此表示法将字符串存储为具有字符数组的结构,并将长度存储在单独的区域中
也可以使用混合表示法,例如在长度和数组表示法中存储以null结尾的字符串


C#使用长度前缀和以null结尾的字符串的组合,还允许在字符串中嵌入null字符。但是,这并不意味着您可以访问空终止符或长度字节,因为与C不同,C#执行绑定检查,并在试图访问字符串末尾时抛出异常。

C#字符串不是以空终止的。在询问它如何工作之前,您是否尝试过调试和跟踪它?发生的情况应该很明显……字符串有两个字段:
int m_stringLength
char\u firstChar
,它们不是以null结尾的,因为已知长度。编辑:实际上,它们以null结尾,这是coreclr repo的一条注释://对于空字符串,这将是“\0”,因为//字符串都以null结尾,并且长度前缀为“@LeonardoAlvesMachado It;
String
类上提供长度的方法是
length
属性。在c#中,字符串的最后一个字符不是c中的空值字符。您可能希望捕获IndexOutOfRangeException以确定字符串的结尾。但这并不能回答问题。您没有抓住问题的重点。“C#使用长度前缀和以null结尾的字符串的组合“这句话有来源吗?的文档中另有说明。@Amy这来自阅读参考源和。注释和断言表示,它们期望出现空终止。这很可能是为了与C库的兼容性和调试。“对于空字符串,这将是'\0',因为字符串都以null结尾,并且长度前缀为”@Amy文档没有提到字符串以null结尾,因为它是一个实现细节,而不是语言的一部分(您自己的运行时可能会选择不以这种方式表示字符串),另外,因为它以null结尾这一事实对您来说是模糊的。@Servy但如果这是一个实现细节,那么说C#同时使用以null结尾的字符串和长度前缀字符串是否是错误的?问题在于语言,而不是具体的实现。
    string str = "someText";
    int lenght = 0;

    foreach (char c in str)
    {
        lenght++;
    }
    Console.WriteLine(str);
    Console.WriteLine("String lenght is : "+lenght);
    Console.ReadLine();