在c#中使用字符数组(char [])而不是字符串

Posted

技术标签:

【中文标题】在c#中使用字符数组(char [])而不是字符串【英文标题】:Using of Array of chars (char[]) instead of strings in c# 【发布时间】:2016-06-19 22:11:24 【问题描述】:

C语言中没有字符串这个概念吧? 所以,我想知道:在现代语言(例如 C#)中使用字符数组而不是字符串是否会节省内存。

【问题讨论】:

在 C 中,“字符串”只是一个以零结尾的字符数组。因此,虽然它不存在特定的 string 类型,但它确实有字符串。 我怀疑,字符串的 .NET 运行时仅存储字符 + 字符串的长度(在 IL 中,字符串是使用单独的指令 ldstr 加载的,换句话说,它们不被视为类)。相同的字符串由完全相同的字符串实例表示 - 这称为实习(此处节省内存)。只有在不断修改字符串时才能节省内存(默认情况下它们是不可变的) - 但在这种情况下,StringBuilder 在内部使用 char[] 字符串是由字符组成的类。字符串类中的方法与字符类中的方法不同。所以字符串和字符是不同的。 【参考方案1】:

在 Python 中,如果我的理解正确,答案是“视情况而定”。 (我使用 python 是为了方便,你说“任何现代语言”)

我创建了一个创建字母字符数组的函数,以及另一个创建字母字符串的函数。然后每个运行 100 万次。

字符数组大约需要 1.7 秒,而字符串数组需要 0.5 秒。

“也许这是一个开销的事情?”你可能会问。 很好:我对它们进行了全局初始化,然后通过循环(100 万次)对每一个进行迭代,将一些变量设置为当前字母。 字符数组需要 7.7 秒,而字符串需要 9 秒。

“如果您正在寻找特定元素怎么办?” 我遍历每个变量以查看“z”是否在元素中。 char 数组耗时 1.8 秒,而字符串耗时 0.4 秒。

“这很有趣,也许这只是一个作业?” 我的最后一个测试是在不分配任何内容的情况下进行迭代。 同样,char 数组的速度更快,为 3.9 秒,而字符串迭代为 5.3 秒。

所以看起来字符串对于初始创建和搜索更快(我也假设排序,但我不打算编写排序函数来找出答案),而字符数组对于迭代事件更快(对于数组中的每个/字符串)。

希望这会有所帮助。 PS - 我的第一个测试类的代码:

#!/usr/bin/env python
import dis
import time

def char_func():
        my_c_var = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
        #print my_c_var

def stri_func():
        my_s_var = "abcdefghijklmnopqrstuvwxyz"
        #print my_s_var

start_time = time.time()
for i in range(1000000):
        char_func()
print("--- %s seconds ---" % (time.time() - start_time))

start_time = time.time()
for i in range(1000000):
        stri_func()
print("--- %s seconds ---" % (time.time() - start_time))

【讨论】:

以上是关于在c#中使用字符数组(char [])而不是字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用字符串而不是 char 数组时程序崩溃

char 数组是不是包含字符串?

c++中,如果cout 或者cin char类型的数组名,指针,都会把字符串输出,而不是输出地址,

在 C# String 构造函数 String(Char*) 中,为啥构造函数不期望指向字符数组的指针?

将 char 数组值从 C++ 传递到 C# 应用程序

在 C# 中将 char 转换为 int