Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我们访问';长度';C#中字符串的属性?_C#_String - Fatal编程技术网

当我们访问';长度';C#中字符串的属性?

当我们访问';长度';C#中字符串的属性?,c#,string,C#,String,示例代码如下所示: string hi = "HelloWorld"; int length = hi.Length; Console.WriteLine(length); Console.WriteLine(length); ... string hi = "HelloWorld"; int length = hi.Length; Console.WriteLine(hi.Length); Console.WriteLine(hi.Length); ... 如果string的Length属

示例代码如下所示:

string hi = "HelloWorld";
int length = hi.Length;
Console.WriteLine(length);
Console.WriteLine(length);
...

string hi = "HelloWorld";
int length = hi.Length;
Console.WriteLine(hi.Length);
Console.WriteLine(hi.Length);
...
如果string的Length属性将被多次访问,那么第一个代码片段是否比第二个更好?为什么?

当我们以hi.length的方式访问字符串的长度时,CLR将计算hi中的字符数并返回它,或者仅仅返回一个10,因为在初始化hi时,length属性被赋值为10,或者其他什么


在Java中如何?

Length
是数组的一个属性(字符串在内部是一个字符数组),这意味着它总是在内存中可用(数组总是固定长度的,所以
Length
属性不会更改)。在这两种情况下,您应该始终使用
hi.Length
,而不是声明另一个变量。现在只需在内存中保存两次长度(一次在堆栈中保存
int
,一次在堆中保存属性)

Edit:正如下面的评论员所指出的,此方法经过优化,可用于
ICollection
使用属性而不是迭代。
如果要使用linq方法
.Count()
,这将导致程序在整个数组中迭代以计算元素。

根据
字符串。长度是一个属性,它将为您提供当前字符串对象中的字符数


在你的情况下,第二种选择相对来说是最好的;因为它可以避免额外的
int变量
。而且
String.Length
不会创建任何实例或额外的内存空间,它将返回堆中为字符串分配的内存空间。

您的问题是.NET在非常低的级别上发生了什么。当JIT’ed和优化代码执行时,实际发生的情况可能与您预期的不同

但是,回答您的问题的一种方法是查看生成的IL:

string hi = "HelloWorld";
int length = hi.Length;
Console.WriteLine(length);
Console.WriteLine(length);
编译成

ldstr       "HelloWorld"
callvirt    System.String.get_Length
dup         
call        System.Console.WriteLine
call        System.Console.WriteLine
ldstr       "HelloWorld"
dup         
callvirt    System.String.get_Length
call        System.Console.WriteLine
callvirt    System.String.get_Length
call        System.Console.WriteLine

(由于未使用,我已将赋值删除为
length
)编译为

ldstr       "HelloWorld"
callvirt    System.String.get_Length
dup         
call        System.Console.WriteLine
call        System.Console.WriteLine
ldstr       "HelloWorld"
dup         
callvirt    System.String.get_Length
call        System.Console.WriteLine
callvirt    System.String.get_Length
call        System.Console.WriteLine
与第二个版本相比,第一个版本的效率似乎稍高一些,因为只有一个对
System.String.get_Length
的调用,并且两个版本都使用了额外的堆栈位置(
dup
)。然而,JIT'er可以将这个调用内联,然后使用间接方式从内存位置读取一个值,这样就几乎没有什么区别了


请注意,.NET字符串类型将字符串的长度存储在string对象中,因此不需要计算字符串中的字符数。创建字符串时,长度是已知的。

可能与@VMA重复-否,海报询问调用
hi.length
的开销是否值得存储重复使用的值您是否要学习“最佳”写10万亿条不同的代码,然后盲目地坚持使用它们,不管它们对可读性有什么影响?优化的第一条规则是:不要。编写简单、清晰、易懂的代码,同时设定性能目标。然后衡量你的表现,评估你是否达到了目标。如果没有,请指出性能问题所在,并集中精力解决。微观优化属性访问非常值得怀疑。