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
    
  • 相关阅读:
    跟老婆学习软件工程一:瀑布模型
    我的手机需求
    我的BB8820手机
    WordPress中query_posts函数和WPpagenavi插件冲突的解决方法
    HomeZZ注册推介码
    分享:世界机场代码(ICAO)[带经纬度]
    Silverlight学习笔记十七BingMap(三)之地图的地区标识
    从真正的项目中学习Silverlight(MSN Entertainment项目源码下载)
    Silverlight的十几种图片展示炫酷效果(附源码)
    Silverlight水的微波凌步效果
  • 原文地址:https://www.cnblogs.com/hoosway/p/3600593.html
Copyright © 2011-2022 走看看