zoukankan      html  css  js  c++  java
  • .NET中的字符串(2):你真的了解.NET中的String吗?

    概述

    String在任何语言中,都有它的特殊性,在.NET中也是如此。它属于基本数据类型,也是基本数据类型中唯一的引用类型。字符串可以声明为常量,但是它却放在了堆中。希望通过本文能够使大家对.NET中的String有一个深入的了解。

    不可改变对象

    在.NET中String是不可改变对象,一旦创建了一个String对象并为它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值。这句话初听起来似乎有些不可思议,大家也许马上会想到字符串的连接操作,我们不也可以改变字符串吗?看下面这段代码:

     

    1using System;
    2
    3namespace Demo1
    4{
    5 /**//// <summary>
    6 /// String连接测试
    7 /// </summary>
    8 public class Test
    9 {
    10 public static void Main(string[] args)
    11 {
    12 string a = "1234";
    13 Console.WriteLine(a);
    14
    15 a += "5678";
    16 Console.WriteLine(a);
    17 Console.ReadLine();
    18 }
    19 }
    20}
    21
    

    运行的结果:

    1234

    12345678

    看起来我们似乎已经把MyStr的值从“1234”改为了“12345678”。事实是这样的吗?实际上并没有改变。在第5行代码中创建了一个String对象它的值是“1234”,MyStr指向了它在内存中的地址;第七行代码中创建了一个新的String对象它的值是“12345678”,MyStr指向了新的内存地址。这时在堆中其实存在着两个字符串对象,尽管我们只引用了它们中的一个,但是字符串“1234”仍然在内存中驻留。

    引用类型

    前面说过String是引用类型,这就是如果我们创建很多个相同值的字符串对象,它在内存中的指向地址应该是一样的。也就是说,当我们创建了字符串对象a,它的值是“1234”,当我们再创建一个值为“1234”的字符串对象b时它不会再去分配一块内存空间,而是直接指向了a在内存中的地址。这样可以确保内存的有效利用。看下面的代码:

    using System;
    
    namespace Demo2
    {
     /**//// <summary>
     /// String引用类型测试
     /// </summary>
     public class Test
     {
     public static void Main(string[] args)
     {
     string a = "1234";
    
     Console.WriteLine(a);
    
     Test.Change(a);
    
    
     Console.WriteLine(a);
     Console.ReadLine();
     }
    
     public static void Change(string s)
     {
     s = "5678";
     }
     }
    }
    


    运行结果:

    1234

    1234
    做一个小改动,注意Change(ref string s)

    using System;
    
    namespace Demo2
    {
     /**//// <summary>
     /// String引用类型测试
     /// </summary>
     public class Test
     {
     public static void Main(string[] args)
     {
     string a = "1234";
    
     Console.WriteLine(a);
    
     Test.Change(ref a);
    
     Console.WriteLine(a);
     Console.ReadLine();
     }
    
     public static void Change(ref string s)
     {
     s = "5678";
     }
     }
    }
    
    运行结果:
    
    1234
    
    5678
    
  • 相关阅读:
    Erlang学习记录:转义
    Erlang学习记录:运算符
    Erlang学习记录:语法和特性
    Erlang学习记录:相关工具和文档
    IDEA快捷键(收集自网络后整理)
    Redis学习
    SQL_server_2008_r2和visual studio 2010旗舰版的安装(2013-01-16-bd 写的日志迁移
    oracle 11gR2 for win7旗舰版64安装以及连接plsql和NaviCat(win64_11gR2_database) (2012-12-31-bd 写的日志迁移
    win7在某个盘或文件夹中出现右键只能新建文件夹的情况 (2012-12-28-bd 写的日志迁移
    宏基笔记本升级bios(2012-12-28-bd 写的日志迁移
  • 原文地址:https://www.cnblogs.com/hoosway/p/3600593.html
Copyright © 2011-2022 走看看