您的位置:知识库 »

C#基础概念之P/Invoke,StringBuilder 和 String

作者: Clark Zheng  来源: 博客园  发布时间: 2008-09-10 19:49  阅读: 7622 次  推荐: 0   原文链接   [收藏]  

系列文章导航:

静态成员和非静态成员的区别?

const 和 static readonly 区别?

extern 是什么意思?

abstract 是什么意思?

internal 修饰符起什么作用?

sealed 修饰符是干什么的?

override 和 overload 的区别?

什么是索引指示器?

new 修饰符是起什么作用?

this 关键字的含义?

可以使用抽象函数重写基类中的虚函数吗?

C#基础概念之密封类,属性访问器,接口

类和结构的区别?

C#基础概念之抽象类,接口,接口多继承

别名指示符是什么?

如何手工释放资源?

C#基础概念之P/Invoke,StringBuilder 和 String

explicit 和 implicit 的含义?

params 有什么用?

什么是反射?


21.P/Invoke是什么?
答:

在受控代码与非受控代码进行交互时会产生一个事务(transition) ,这通常发生在使用平台调用服务(Platform Invocation Services),即P/Invoke

如调用系统的 API 或与 COM 对象打交道,通过 System.Runtime.InteropServices 命名空间

虽然使用 Interop 非常方便,但据估计每次调用事务都要执行 10 到 40 条指令,算起来开销也不少,所以我们要尽量少调用事务

如果非用不可,建议本着一次调用执行多个动作,而不是多次调用每次只执行少量动作的原则

 

22.StringBuilder 和 String 的区别?
答:

String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String

另外,对于 String 我们不得不多说几句:

1.它是引用类型,在堆上分配内存

2.运算时会产生一个新的实例

3.String 对象一旦生成不可改变(Immutable)

4.定义相等运算符(== 和 !=)是为了比较 String 对象(而不是引用)的值

示例:

Code
using System;
using System.Collections.Generic;
using System.Text;

namespace Example22
{
class Program
{
static void Main(string[] args)
{
const int cycle = 10000;

long vTickCount = Environment.TickCount;
String str
= null;
for (int i = 0; i < cycle; i++)
str
+= i.ToString();
Console.WriteLine(
"String: {0} MSEL", Environment.TickCount - vTickCount);

vTickCount
= Environment.TickCount;
//看到这个变量名我就生气,奇怪为什么大家都使它呢? :)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < cycle; i++)
sb.Append(i);
Console.WriteLine(
"StringBuilder: {0} MSEL", Environment.TickCount - vTickCount);

string tmpStr1 = "A";
string tmpStr2 = tmpStr1;
Console.WriteLine(tmpStr1);
Console.WriteLine(tmpStr2);
//注意后面的输出结果,tmpStr1的值改变并未影响到tmpStr2的值
tmpStr1 = "B";
Console.WriteLine(tmpStr1);
Console.WriteLine(tmpStr2);

Console.ReadLine();
}
}
}

 

结果:

String: 375 MSEL
StringBuilder: 16 MSEL
A
A
B
A

0
0

热门文章

    最新文章

      最新新闻

        热门新闻