C#中的string

C# || String与string的区别 C#是区分大小写的,但是C#中同时存在String与string,之前都随便用。最近好奇心上来。上网搜索了一下。 MSDN中对string的说明: string is an alias for String in the .NET Framework。 string是String的别名而已, string是c#中的类, String是Framework的类, C# string 映射为 Framework的 String。 如果用string,编译器会把它编译成String,所以如果直接用String就可以 阅读详情

      这篇文章我来总结一些string相关知识。

      System.String类型:平时在编程中对于string的用法应该是特别频繁的。通常我们会把string,int ,float放在一起比较,由于后面两个都是值类型,所以非常想当然的会认为string也会是值类型,这是错误的,string由于自身特殊的原因,它最终属于引用类型,当然它的最终基类还是Object。字符串存放在托管堆上,并不存放在堆栈中。
 
      构造字符串:如何来构造一个字符串呢?

         第一:既然string属于引用类型,那么是否可以用new操作符来生成呢?下面的代码是错误的。
   

String c  =   new  String( " aaa " );

  

        第二:我们通常的做法是不用new,而是直接赋值。

string  a  =   " aaaa " ;

  
         生成的部分IL代码:在生成的IL代码中并没有出现newobj操作符,但出现了ldstr:推送对元数据中存储的字符串的新对象引用。

     

IL_0001:  ldstr       " aaaa "
IL_0006:  stloc.
0

  

      字符串驻留池(String Pooling):公共语言运行库通过维护一个哈希表来存放字符串,该表称为字符串驻留池。它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。因此,具有特定值的字符串的实例在系统中只有一个。 [应该是应用了单例模式的应用。单例可以参考:老生常谈:单件模式],这里非常谢谢飞林沙的提示,应该是享元模式,同样可以参考如下文章:老生常谈:享元模式

      字符串驻留:根据字符串驻留池的定义可以看出字符串驻留技术的用处。主要目的是减少内存开销和系统开销,充分利用资源。提供了两个重要的方法:


         1:String.Intern :检索系统对指定 String 的引用。如果 str 的值已经留用,则返回系统的引用;否则返回对带有 str 值的字符串的新引用。
         2:String.IsInterned 方法 :检索对指定 String 的引用。如果 str 位于公共语言运行库“拘留池”中,则为对它的 String 引用;否则为 nullNothingnullptrnull 引用
 

      字符串的不可更改特性:当一个字符串创建后,我们就不能对它进行增加长,或者是缩减,也不能修改其中的任何字符。但有朋友可以会问,那为什么能对字符串进行那么多的操作呢?例如:"+"操作符,Substring等等。其实这些操作都会产生一个全新的字符串,而不是在原来字符串在修改。只要是把操作后的数据赋值给一个新的字符串变量,那么就是产生一个和原字符串完全不同的对象。先看下赋值的情况:把一个变量直接赋值给一个新的字符串变量,根据上面的理论来看,下面应该会返回false,但实际结果返回的是true,因为在字符串驻留的存在。 
            

             string  b  =   " aaa " ;
            
string  c  =  b;         
            Console.WriteLine(Object.ReferenceEquals(b, c));

   

     但是这并不代表b和c是一样的,我们再看下如下代码:分别分返回aaa,aaaa,false,既然string属于引用类型,但为什么修改c的值后,b的值没有跟着变呢,这只因为把字符串赋值给另一个字符串时,会创建一个全新的String对象。
            

             string  b  =   " aaa " ;
            
string  c  =  b;
            c 
=  b  +   " a " ;
            Console.WriteLine(b);
            Console.WriteLine(c);
            Console.WriteLine(Object.ReferenceEquals(b, c));

   

      字符串中的"+"操作符:通常我们会对字符串进行修改,例如"+"号,表示连接多个字符串。但加号会产生非常多的字符串,这样会造成非常多的内存开销和系统开销,这里可以利用StringBuilder来解决多字符串连接的性能问题。来看下下面的示例代码:

             string  b  =   " aaa " ;
            b 
=  b  +   " a " ;
            StringBuilder strb 
=   new  StringBuilder();
            strb.Append(
" aaa " );
            strb.Append(
" a " );

 

      IL代码:由于ConCat操作后会生成全新的对象,而StringBuild是在原对象上修改变量,并不会生成新对象,这样就会产生性能优势。上面的代码只是示范,一般在大量字符串拼接时这种性能问题会倍增。

复制代码
.method  private  hidebysig  static   void   Main( string [] args) cil managed
{
  .entrypoint
  
//  代码大小       50 (0x32)
  .maxstack   2
  .locals init ([
0 ]  string  b,
           [
1 ]  class  [mscorlib]System.Text.StringBuilder strb)
  IL_0000:  nop
  IL_0001:  ldstr      
" aaa "
  IL_0006:  stloc.
0
  IL_0007:  ldloc.
0
  IL_0008:  ldstr      
" a "
  IL_000d:  call       
string  [mscorlib]System.String::Concat( string ,
                                                              
string )
  IL_0012:  stloc.
0
  IL_0013:  newobj     instance 
void  [mscorlib]System.Text.StringBuilder::.ctor()
  IL_0018:  stloc.
1
  IL_0019:  ldloc.
1
  IL_001a:  ldstr      
" aaa "
  IL_001f:  callvirt   instance 
class  [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append( string )
  IL_0024:  pop
  IL_0025:  ldloc.
1
  IL_0026:  ldstr      
" a "
  IL_002b:  callvirt   instance 
class  [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append( string )
  IL_0030:  pop
  IL_0031:  ret
} 
//  end of method Program::Main
复制代码

   

      安全字符串:如果字符串中存放了此比较敏感的信息,例如用户的密码,信用卡信息之类的,如果此时有非安全代码或者是非托管代码访问这些字符串,这些代码可以扫描进程的地址空间,访问包含敏感数据的字符串,以一种非授权的方式来使用这些数据。即使只使用这些字符串时间很短,马上回进行垃圾回收,也是需要一定时间的,而且string本身无法修改的特性,使这些非安全的或者是非托管代码在访问时会留string的副本在内存中。

      FCL解决了这个问题,它就是System.Security.SecureString:表示应保密的文本。文本在使用时出于保密目的被加密,并在不再需要时从计算机内存中删除。无法继承此类。当你构造一个SecureString对象时,系统会在内存中分配一个非托管区域,里面包含一个字符数组,里面的内容均是经常加密的。之所以是非托管空间,就是为了不让垃圾回收器来管理。

      System.Security.SecureString实现了IDisposable接口,这样可以保证在使用完后立即对字符串进行销毁。

深入解析C#中的String和string 在C#语言中,String是.NET Framework类库中System.String类的别名,而string则是C#中的一个基础数据类型。两者在功能上是相同的,但是String是面向对象的引用类型,而string是C#的别名,它为String的简写。尽管使用时没有显著差异,但在一些特定的情况下,如泛型编程中,两者的区别可能会导致编译器的行为有所不同。字符串是编程中经常使用到的数据类型,在C#中也不例外。为了处理字符串数据,C#提供了丰富的字符串操作方法。 阅读详情

相关推荐

Java后端实战:钉钉互动卡片消息从配置到生产级对接

在企业级消息推送场景中,机器人通知已从简单的文本向富交互演进。其核心原理在于通过可交互的卡片模板,将传统单向通知升级为双向、有状态的微型应用界面,实现了用户无需跳转即可完成操作的技术价值。这广泛应用于审批、任务确认、数据填报等需要即时反馈的业务流程。本文聚焦于钉钉平台,深入剖析其互动卡片消息机制,并基于Java后端,系统讲解如何实现包括安全验签、异步回调与卡片动态更新在内的生产级对接方案,涵盖配置管理、服务降级等工程实践关键点,助力构建稳定高效的企业消息交互服务。

weixin_30617737的博客 435

C# 字符串操作--减少垃圾回收压力

C# 性能优化细节 1、使用string.Empty给一个空字符串变量赋初始值 String.Empty是一个指代,而””是具体的实现string filter=“”;//不建议 string filter=string.Empty; //建议 2、使用str.Length == 0做空串比较 最快的方法:if (str.Length ==...

weixin_34148456的博客 607

rbf神经网络python预测代码_RBF神经网络预测

%用RBF网络来预测股票走势clcclear%归一化数据input=[0 0 0 0 0 0.0277;0.0177 0.0292 0.0184 0.0122 0.0264 0.0492;0.0374 0.0946 0.0393 ...

weixin_39951419的博客 1889

(c#) 销毁资源和释放内存

0. 什么是资源? .NET 框架中如何访问资源? 所谓的资源就是程序中可利用的数据,譬如:字符串、图片和任何二进制数据,包括任何类型的文件。 在面向对象的环境中,每一个类型都标识为某些程序所用的资源,要想使用这些资源,必须为相应的类型分配一定的内存空间。 访问一个资源需要如下几个步骤: 1)分配内存空间: 调用中间语言(IL)中的newobj指令(使用new操作符时,将产生newobj指...

weixin_30488085的博客 1679

反激开关电源变压器设计实战:从理论到绕制的完整流程解析

本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。

weixin_29305313的博客 683

UVM(5)-TLM通信

TLM是一种基于事务 (transaction) 的通信方式,通常在高抽象级语言例如SystemC或者SV/UVM中作为模块之间的通讯方式。

2301_76431006的博客 2106

C# string字符串内存管理深入分析(全程干货)

C# string字符串内存管理深入分析(全程干货)

游戏码农一枚,不定时分享技术文章~ 4071

【智慧城市】GIS数据获取-获取道路/水路数据

【GIS数据获取】获取道路/水路数据

qq_16599281的博客 4749

C#中,String和string的区别

 C#中,字符串的声明,你使用String还是string?String? string? 只有一个大小写的问题,你习惯用哪个?知道具体的区别吗?我是习惯了用string,区别也是最近才找到了权威的根据,CLR via C#。其实,String是CLR的类型名称(也算是keyword),而string是C#中的keyword。在C#的编译时,默认会增加几行代码,看了你就会明白string和

Jack @ 优快云 1118

Win10右键新建菜单丢了记事本?别慌!5分钟教你用注册表找回来(附权限设置避坑指南)

本文详细指导如何通过注册表编辑器恢复Win10右键新建菜单中丢失的记事本选项,包括重建键值结构、配置ShellNew项及设置权限等关键步骤。特别提供权限避坑指南,确保修改持久有效,帮助用户快速解决这一常见但困扰的问题。

weixin_31714129的博客 856

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

算法大师! 623

C# string与String区别

  C#是区分大小写的,但是我却发现C#中同时存在String与string,于是我很困惑,于是我上网搜索了一下,于是我了解了一些小知识。   MSDN中对string的说明:string is an alias for String in the .NET Framework。string是String的别名而已,string是c#中的类,String是Framework的类,C# string 映射为 Framework的 String。如果用string,编译器会把它编译成String,所以如果直接用

Zzd的博客 3069

AI游戏制作07——波次计时器,敌人按波次生成

AI游戏制作07——波次计时器,敌人按波次生成

qq_40572023的博客 47

C#中String和string区别

String是一个类,string是一种数据类型. string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色) c# string映射为.net Framework的String 如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作 如果使用c#,建议使用string,比较符合...

weixin_33962923的博客 1481

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C#中string 和String

今天突然看到一篇文章关于string和String的,注意一个是string,另一个是String。感觉这个小细节还是很重要的,所以就转了来。 众所周知string是C#中System.String的别名,一般情况下二者具有相同的含义和功能,那问题时二者是完全相同没有任何区别的吗?如果答案是“是”的话,微软为什么实现了这两个概念而不是仅仅用sting或者String呢,毕竟用一个的话跟...

diaomen1607的博客 231

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C#中String和string的区别

在C#编程中,string和String本质上是相同的,string是C#为System.String提供的关键字别名。两者在编译后没有性能差异,但使用场景有所不同:string常用于变量声明,更符合C#语法风格,而String适用于调用System.String的静态方法。在项目中保持一致性,遵循代码规范,并考虑跨语言兼容性,是使用这两种形式的最佳实践。C#提供string别名旨在提高代码的可读性和简洁性,便于开发者从其他语言过渡。

qq_29715355的博客 662

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C# String 与 string的问题

今天突然用到C#的string,突然想起来一直没弄明白string和String有什么区别,查了一下电子书、MSDN以及百度和Google,更进一步看看String的一些问题。 0.  问题: 1. C#到底是什么时候传引用?什么时候传值?2. String传值还是传引用3. string和String有什么区别?4. String为什么是Immutable,怎么实现的?以下查询结果以及我的理解:

kiss0kill的专栏 1992

C# String与string的区别

C#中同时存在String与stringMSDN中对string的说明:stringis analiasforStringin the .NET Framework。string是String的别名而已,string是c#中的类,String是Framework的类,C# string 映射为 Framework的 String。如果用string,编译器会把它编译成Strin...

LEWENCAI560618的博客 76

C# string与String的区别

最近,正在简单地学习C#的一些知识。 C#是区分大小写的,但是我却发现C#中同时存在String与string,于是我很困惑,于是我上网搜索了一下,于是我了解了一些小知识。 MSDN中对string的说明:string is an alias for String in the .NET Framework。string是String的别名而已,string是c#中的类,String是Fram

米刀文 859

c# string与String区别

[C#] String与string的区别:供参考 转自:https://www.cnblogs.com/rosesmall/p/8351808.html C#是区分大小写的,但是我却发现C#中同时存在String与string,于是我很困惑,于是我上网搜索了一下,于是我了解了一些小知识。 MSDN中对string的说明:string is an alias for ...

andu1644的博客 382

String in C#(String在C#中的运用)

C#string中的字符串。与任何其他编程语言一样,C#中的字符串是最重要和最常用的类型之一。在本文中,您将学习如何使用C#中的字符串。本文讨论了String类、它的方法和属性,以及如何使用它们。空字符串是系统的有效实例。包含零个字符的字符串对象。有两种方法可以创建空字符串。我们可以使用字符串。属性,或者我们可以简单地分配一个文本值,其中没有文本。下面的代码段创建了两个空字符串。上述两条语句生成相同的输出。空字符串有时用于比较其他字符串的值。以下代码段使用空字符串与名称字符串进行比较。...

weixin_42488150的博客 1896

C# 中String和string的区别

在C#编程时,有时碰到String,有时碰到string,可是感觉二者都可以,所以决定总结下二者的区别。 首先: MSDN(Microsoft Developers Network )中对string的说明: string is an alias for String in the .NET Framework。即string是String的别名而已。 string是c#中的类

一言的博客 574
上一篇: session
下一篇: IL代码的分析
我心V飞翔
博客等级 码龄16年 55粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值