关于String类型

String类详细介绍 size计算字符串长度。 阅读详情

     老早之前,有一个很有意思的帖子(string 引用类型,还是值类型),引来了热烈的讨论。当时把它给收藏了。这几天,闲来无事,翻看收藏夹的时候,又看到了它,觉得很有意思,研究了研究。有了一点点拙见。
      首先,String是引用类型,这肯定是勿庸置疑的。String是继承自System.Object类型的,而不是象Int32一样,继承自System.ValueType。但是String也是一个比较奇特的类型,一般而言,一个引用类型,构造的时候,是调用的IL指令:newobj。但是String有它自己的特殊的IL指令:ldstr。这说明,虽然String也是引用类型,但是,它和其他的引用类型还是有一些区别的。具体而言,CLR使用了字符串驻留技术,来提升String的性能。
      简单的说,字符串驻留技术保证:内容相同的字符串,其在托管堆栈上的地址也是相同的,这样,就避免了大量的相同的String实例的存在 ,从而提高程序的性能,下面的代码可以验证这一点。       
       string s = "1112";
       MessageBox.Show(object.ReferenceEquals(s,"1112").ToString())
;
       上面的结果,是True。
      此外,字符串,还有一个特性,是恒定性。qqchen对这个也做了讨论。
      我们可以看看下面的代码。
          unsafe{

         string s = "123";
         string b = "123";

         fixed(char* p = s)
        {
               System.IntPtr ip = (System.IntPtr)p;
               Console.WriteLine("这是s的初始地址,{0}",ip.ToString());
        }

        fixed(char* p = b)
       {
               System.IntPtr ip = (System.IntPtr)p;
               Console.WriteLine("这是b的地址,{0}",ip.ToString());
       }


       s = "234";

      fixed(char* p = s)
     {
            System.IntPtr ip = (System.IntPtr)p;
            Console.WriteLine("这是s的修改后地址,{0}",ip.ToString());
     }

     fixed(char* p = b)
     {
           System.IntPtr ip = (System.IntPtr)p;
          Console.WriteLine("这是b在s修改后的地址,{0}",ip.ToString());
      }

    }

     从上面的代码中,我们不难看出,s和b,一开始的时候,其地址是一样的,修改了s之后,s的地址就改变了,而b还是不变的。这就是string的恒定性和字符串驻留的具体体现。

     我主要想说的,是String作为参数传递的问题。同所有的引用类型一致,String作为参数传递的时候,传递了地址的拷贝,就象值类型传递的是值拷贝一样。
     有时候,可能会有这样的迷惑,既然String是按照地址来传递的,那么我在方法内部修改了String,为什么外部的String没有受到影响?比如下面的代码:
     string s = “初始值”;
     public void ChangeStr(string varStr)
    {
          varStr = “修改了!“;
    }

    在调用ChangeStr(s)之后,s的内容仍然是“初始值”,这是为什么呢?

    其原因就是:虽然varStr和s的地址,开始的时候是一致的,但是在修改了varStr的内容之后,他们的地址就不一致了!这个在上面的代码中其实可以体现出来。
我们还是用代码进行验证:
    unsafe
   {
    string s = "123";

    fixed(char* p = s)
    {
     System.IntPtr ip = (System.IntPtr)p;
     Console.WriteLine("这是s的初始地址,{0}",ip.ToString());
    }

    ChangedStr(s);
   }
   public void ChangedStr(string s)
  {
   unsafe
   {
    fixed(char* p = s)
    {
     System.IntPtr ip = (System.IntPtr)p;
     Console.WriteLine("这是参数s的初始地址,{0}",ip.ToString());
    }

    s = "134";

    fixed(char* p = s)
    {
     System.IntPtr ip = (System.IntPtr)p;
     Console.WriteLine("这是参数s修改后的地址,{0}",ip.ToString());
    }

   }

     上面代码的运行结果,是,参数s修改后的地址,已经和传递进来的地址不一样了。
     这样,我们就明白了,【在调用ChangeStr(s)之后,s的内容仍然是“初始值”,这是为什么呢?】这个问题。
     如果我们要得到这个修改后的结果,那么,只能用ref来修改传递的规则。public void ChangedStr(ref string s),这样,才能得到修改后的值。

String类详解 String类算是比较特殊的类型了,作为初学者我们甚至把这个引用类型时不时当成基本类型来用,而且发现,竟然差不多。然而实际呢?我们太年轻,差的真的很多,今天就来详细讲一讲到底差在哪。 一、创建字符串的四种方式 1.直接赋值 直接赋值,在堆中的常量池中创建该字符串对象 String str1 = "HelloWorld"; 2.通过构造方法创建对象 在堆中创建对象,并把该对象的拷贝放到常量池中 String str2 = new String("HelloWorld"); 3.通过字符数组 阅读详情

相关推荐

string类(详细描述)

string中文意思是字符串,string是一个类,在C++语言中,string类型不属于基础类型string是一个模板类,实例化就是一个对象。也可以理解为他是一个可以操作字符串的类。基础类型有八种:byte、boolean、char、short、int、float、long、double定义了一个名为CharTTraits和Allocator。这些参数分别指定了字符类型、字符特性和分配器类型用于分配内存。CharT参数表示字符类型,通常使用char来表示普通的字符串。Traits。

qq_55610255的博客 7160

String类的详解

注意:replaceAll方法并不是在s的基础上替换的,而是将替换的结果作为一个新的字符串返回了,替换之后始终不变,因为String类在设计的时候,就严格限定了String类的对象是不可改变的,即字符串是不可变对象。2、将自定义类型的对象转换为String类型的字符串,类中需要重写Object类中的toString的方法,如果没有重写,将来转换完之后的结果:类全路径名+@+hashCode的十六进制的结果。注意:对于内置对象,==比较的是变量中的值,对于引用类型,==比较的是引用中的地址。

m0_53677355的博客 1741

String类型(详述)

String类详细讲解

程序员阿龙的博客 7386

String类型

String类型 一、相关概念 1.定义 String类型是字符串的对象包装类型 创建String对象 var stringObject=new String("hello world"); 2.补充 String对象大方法也可以在所有基本的字符串值中访问到 继承的valueOf()、toLocaleString()和toStr

前端萌新一枚 1万+

String是值类型,还是引用类型

一直

a220315410的专栏 2万+

Redis string类型&&hash类型

⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如 key = "key",value = { {注意:哈希类型中的映射关系通常称为 field-value,⽤于区分 Redis 整体的键值对(key-value),注意这⾥的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下⽂的作⽤。

m0_74099572的博客 1427

Java中String是个什么类型?

Java中String是个什么类型Java中的八大数据类型String 是个什么类型String常见的方法 Java中的八大数据类型 面试官的套路 Java中的数据类型分为四类 1.整型 byte,short,int,long 2.符点型 float,double 3.字符型 char 4.布尔类型 boolean String 是个什么类型 其实Java中的数据包含了基本数据类型和引用数据类型 基本数据类型的存储原理是:基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间的. 引用类

weixin_43950187的博客 4174

Date类型String类型

Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = simpleDateFormat.format(date); //Date类型String类型 Date d = simpleDateFormat.parse(time);

weixin_45151960的博客 3万+

Redis基本类型String类型

Redis基本类型String类型

s17856147699的博客 1481

String类型变量

String类型应该是比较常用的数据类型,接下来就来了解一下String类型变量的一些使用方法; String 类型变量的使用 1.String 属于引用数据类型,翻译为:字符串; 2.声明String 类型变量时,使用一对 “ ” 3. String 可以和8种基本数据类型变量做运算,且运算只能是连接运算: +; 4.运算结果仍然是String 类型 String s=""; //长度无限制 /...

qq_22002457的博客 4277

int类型转换String类型String类型转换成int类型

一、int 类型转换 成String类型 定义一个int类型 int i =100; //方法一:使用 i+""; String s1 = i+""; //方法二:String.valueOF(i); String s2 = String.valueOF(i); //方法三:转化成包装类Integer,再Integer转化成String Integer integer = new Integer(i); String s3 = integer.toString(); //方...

weixin_56408993的博客 2万+

String类型转Int类型、其他类型String类型

1.String类型转Int类型:Integer.parseInt(String)方法、Integer.valueOf(String)方法 2.其他类型String类型:(String)、toStringString.valueOf方法 参考博客: https://blog.csdn.net/kkkkkfffd/article/details/121293849 java如何把String类型转换为int类型-java教程-PHP中文网 ...

java全包开发,java辅导 488

string是什么数据类型

学习java有段时间了,今天复习回顾了之前学过的内容,在刚开始复习就发现了一个问题,string是什么数据类型?倒不是这个问题有多难,但是好像突然就把我问蒙住了,后来仔细思考了一下,好像悟了哈哈 1、前言 首先提出一个问题在 Java 中 String 属于那种数据类型? 我的一个朋友是这么说的,「what?是不是有很多疑惑,int、double、String 不都是经常一起使用的么,应该都是同一种数据类型吧,基本数据类型?」 大家认为呢? 对于初学者而言可能没有对数据类型没有很强的意识,没有特别的注意到这

sulixu的博客 2万+

java——String类型

两个String类的对象不能直接用==号相比较,因为用==比较的是两个对象的地址,而我们大多数都要比较两个对象的内容是否相等。: 返回从指定索引开始向前搜索时,指定子字符串在字符串中最后一次出现处的索引。如果找不到子字符串,则返回-1。: 返回从指定索引开始搜索时,指定子字符串在字符串中第一次出现处的索引。: 返回从指定索引开始向前搜索时,指定字符在字符串中最后一次出现处的索引。: 返回从指定索引开始搜索时,指定字符在字符串中第一次出现处的索引。返回一个新的字符串,其中包含字符串缓冲区中指定范围内的字符。

2301_81147883的博客 1323

int类型String类型的相互转换

int -> String :String.valueOf(number) String -> int : Integer.parseInt(s) /* * int类型String类型的相互转换 * * int -- String * String.valueOf(number) * * String -- int * Integer.parse...

loveayas 1041

String为值类型还是引用类型

关于String为值类型还是引用类型的讨论一直没有平息,最近一直在研究性能方面的问题,今天再次将此问题进行一次明确。希望能给大家带来点帮助。 如果有错误请指出。 来看下面例子: 复制代码 复制代码 //值类型 int a = 1; int b = a; a = 2; Console.WriteLine(“a is {0},b is {1}”, a, b); //字符串 string str1 = ...

weixin_44973055的博客 310
上一篇: WebForm的Grid页面页脚DropDownList事件
下一篇: 留个纪念
brightheroes
博客等级 码龄23年 60粉丝 10原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值