`
zhangziyangup
  • 浏览: 1186733 次
文章分类
社区版块
存档分类
最新评论

C#基础知识整理:基础知识(11) 值类型,引用类型

 
阅读更多

C#是面向对象的语言,在面向对象的思想中,只有对象,所有事物都可以用类描述。所以比如这些,int,bool,char,string,double,long等都是类,那么像,30,2.5,"test"都是对应类的一个对象。

        static void Main(string[] args)
        {
            string istring = 30.ToString();

            string dstring = 2.5.ToString();

            string sstring = "test".ToString();

            Console.WriteLine(string.Format("{0},{1},{2}", istring, dstring, sstring));

            Console.ReadLine();
        }

输出:

可以看出它们有ToString()这个方法,所以它们是对象。
在平时写代码时,定义数据类型除了上述的这种之外,肯定都用过:

         static void Main(string[] args)
        {
            Int32 i = 0;

            UInt32 j = 0;

            String str = "test";

            Console.ReadLine();
        }

这个其实是.NET的一个机制,.NET是一个平台,这个平台上有C#,VB这些语言。因此,.NET定义了一系列类型,映射到不同的语言中,Int32在c#中就是int。这样的数据类型称作基元类型,在C#中类的对象必须使用new生成。而这一部分类直接就可以用常量表示。基元类型定义在.net Framework中,System命名空间下。看一下基元类型在C#语言中的类型映射。

.NET Framework基元类型

C#类型

取值范围 备注

System.Boolean

bool

true/false /
System.Byte byte 0 ~255

无符号8位整数

System.Sbyte sbyte -128 ~ 127 有符号8位整数
System.Char char 0 ~ 65,535 无符号16位整数
System.Int16 short

-32,768 ~ 32,767

有符号16位整数
System.UInt16 ushort 0 ~ 65,535 无符号16位整数
System.Int32 int -2,147,483,648 ~ 2,147,483,647 有符号32位整数
System.Int64 long

-9,223,372,036,854,775,808 ~

9,223,372,036,854,775,807

有符号64位整数
System.UInt64 ulong

0 ~ 18,446,744,073,709,551,615

无符号64位整数
System.Single float

±1.5 × 10-45 ~ ±3.4 × 1038

(7位有效数字)

32位单精度浮点数
System.Double double

±5.0 × 10-324 到 ±1.7 × 10308

(15至16位有效数字)

64位双精度浮点
System.Decimal decimal

±1.0 × 10-28 到 ±7.9 × 1028

(27至28位有效数字)

128位浮点数数
System.String string 任意字符串 /
System.UInt32 uint 0 ~ 4,294,967,295 无符号32位整数

表中的除了string是引用类型(后面单独解释),其它都是值类型。
下面简单介绍下引用类型和值类型。
学习C语言的时候有个堆和栈的概念。
堆区——程序员分配释放,或者程序结束有OS回收,分配方式类似于链表。
栈区——由编译器自动分配释放,存放函数的参数值,变量值等。
栈内存结构可以快速的分配内存和回收内存,但栈空间有限,过多使用会“溢出”,因此栈只分配常用的,占用空间小的数据类型;堆内存结构分配内存较慢,但是利用空间大,可以存放大型数据。
在C#中,基本上所有的数据都存储在“堆”结构中,称之为“托管堆”,受.NET垃圾回收监控。但是相对于栈堆结构中内存分配效率比较低。为了正确进行垃圾回收,每次分配的堆空间比实际所需空间稍大,小型数据使用堆是不太合适的。
可以比较看一下值类型和引用类型:
C#中提供了Struct定义值类型,直接在栈上分配内存。

 /// <summary>
    /// 使用struct定义一个值类型,
    /// 值类型的只能实现接口,不能继承类
    /// </summary>
    public struct StructPositiveNumber : ICloneable  
    {
        /// <summary>
        /// 值类型字段
        /// </summary>
        private int number;

        /// <summary>
        /// 静态只读字段,作为类的初始值
        /// </summary>
        public readonly static StructPositiveNumber InitialValue = new StructPositiveNumber();

        /// <summary>
        /// 属性
        /// </summary>
        public int Number
        {
            get
            {
                return number;
            }

            set
            {
                if (value <= 0)
                {
                    throw new Exception();
                }

                this.number = value;
            }
        }
        /// <summary>
        /// 可以定义构造器,但是和类不同,这里的默认构造器依然存在
        /// </summary>
        public StructPositiveNumber(int value)
        {
            if (value <= 0)
            {
                throw new Exception();
            }

            this.number = value;
        }

        /// <summary>
        /// 实现克隆方法,返回当前对象
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            return new StructPositiveNumber(this.number);
        }
    }

调用

       static void Main(string[] args)
        {
            //声明变量,赋值
            StructPositiveNumber pNumber1 = StructPositiveNumber.InitialValue;

            pNumber1.Number = 1;

            //pNumber1赋给pNumber2
            StructPositiveNumber pNumber2 = pNumber1;

            //改变pNumber2的值
            pNumber2.Number = 2;

            //看打印结果,改变了pNumber2的值,但是不影响pNumber1
            Console.WriteLine(pNumber1.Number);//1

            Console.WriteLine(pNumber2.Number);//2

            //重新初始化pNumber2,通过构造器生成改变了初始值。
            pNumber2 = new StructPositiveNumber(3);

            Console.WriteLine(pNumber2.Number);//3

            //调用Clone将pNumber2复制给pNumber1
            pNumber1 = (StructPositiveNumber)pNumber2.Clone();

            Console.WriteLine(pNumber1.Number);//3

            //改变pNumber1的值,但是pNumber2值不改变
            pNumber1.Number = 4;

            Console.WriteLine(pNumber1.Number);//4

            Console.WriteLine(pNumber2.Number);//3

            Console.ReadLine();
        }

结果

再看引用类型定义的:

 public class ClassPositiveNumber : ICloneable
    {
        private int number;

        public int Number
        {
            get
            {
                return this.number;
            }

            set
            {
                if (value <= 0)
                {
                    throw new Exception();
                }

                this.number = value;
            }
        }

        //引用类型自己可以初始化为null,无需定义初始值
        //public readonly static ClassPositiveNumber InitialValue = new ClassPositiveNumber();

        public ClassPositiveNumber(int value)
        {
            if (value <= 0)
            {
                throw new Exception();
            }

            this.number = value;
        }

        public object Clone()
        {
            return new ClassPositiveNumber(this.number);
        }
    }

调用

      static void Main(string[] args)
        {
            ClassPositiveNumber cNumber1;//默认值为null

            cNumber1 = new ClassPositiveNumber(1);

            ClassPositiveNumber cNumber2 = cNumber1;

            cNumber2.Number = 2;

            //可以看出,两个引用引用到了相同的对象
            Console.WriteLine(cNumber1.Number);//2

            Console.WriteLine(cNumber2.Number);//2

            //重新初始化cNumber2,之前的对象已被丢弃
            cNumber2 = new ClassPositiveNumber(3);

            Console.WriteLine(cNumber2.Number);//3
            
            //复制是复制一个对象的副本,因此,是两个不同的对象
            cNumber1 = (ClassPositiveNumber)cNumber2.Clone();

            Console.WriteLine(cNumber1.Number);//3

            cNumber1.Number = 4;

            Console.WriteLine(cNumber1.Number);//4

            Console.WriteLine(cNumber2.Number);//3

            Console.ReadLine();
        }

结果

通过例子,可以看出值类型的特点如下:
a、使用struct声明;
b、不能继承类,但是可以实现接口(当然除object类外);
c、值类型使用值类型做为字段,但是字段无法有默认值;
c、值类型中必须有默认构造器,而且自己定义构造器后,默认的无参数的构造器依然存在。而且在构造其中只能访问类中的字段,但是不能访问属性。符号=对于值类型来说是赋值,所以赋值是值类型变量不能为空,因为值类型没有引用的概念,肯定有值。

代码下载:http://download.csdn.net/detail/yysyangyangyangshan/4452051

分享到:
评论

相关推荐

    C#知识整理(完整)

    本资源提供了C#基础知识的系统整理,对于期末考试有一定的帮助作用。下面是从给定的文件中生成的相关知识点: 第一章 1. C#应用程序可以使用除Word应用程序以外的工具和方法进行开发。 2. 命名空间可以签到。 3. ...

    C#部分基础知识整理

    值类型直接存储在它们所在的内存位置,而引用类型存储的是指向实际数据的引用。理解何时使用哪种类型可以避免不必要的内存开销和潜在的性能问题。 通过深入学习和实践这些C#基础概念,开发者可以更好地利用语言特性...

    C#常用知识整理

    - 数据类型:包括基本类型(如int、float、bool)、引用类型(如类、接口、数组)和值类型(如结构体)。 - 控制流语句:如if-else、switch、for、while、do-while循环等,用于控制程序的执行流程。 - 函数:定义...

    文件整理基础部分C#代码

    【标题】"文件整理基础部分C#代码"的描述中提到了C#编程语言的应用基础知识,这可能包括了变量声明、数据类型、控制结构(如if语句、for循环、while循环)、函数定义与调用、类与对象、继承、接口、异常处理等核心...

    C#知识点整理 教学程序

    1. **基础语法**:C#的基础包括变量、数据类型、常量、运算符和控制流语句(如if-else、switch-case、for、while等)。理解这些基本元素是编写任何C#程序的前提。 2. **类与对象**:C#是面向对象的语言,这意味着它...

    C#-知识点整理总结.doc

    【C# 知识点整理总结】 C# 是一种由微软公司开发的现代、通用的、面向对象的编程语言,其设计目标是简洁、高效、易于学习,并且具有丰富的编程特性。C# 是基于 C 和 C++ 的,但与 Java 有许多相似之处,尤其在面向...

    C#高级编程知识点总结

    第五章讨论了对象和类型,如引用传递与值传递的区别,值类型和引用类型的赋值行为,以及结构和类的差异。属性提供了一种封装数据的方式,Object类是所有.NET类的基类。 后续章节继续涵盖了数组和集合、委托和事件、...

    c#试题 基础测试

    从给定的C#基础测试题目中,我们可以总结出一系列重要的C#编程概念和知识点,这对于初学者理解和掌握C#语言的基本原理非常有帮助。以下是根据题目内容整理的关键知识点: ### 1. 抽象类与抽象方法 - **抽象类**:不...

    c#面试基础知识包 面试准备

    在面试中,对C#基础知识的掌握是评估候选人能力的重要环节。本资料包针对C#的基础知识进行了整理,涵盖了面试中常见的考点,以下是这些知识点的详细说明: 1. **C#语法基础** - 变量:包括数据类型(如int、float...

    C#笔记整理

    一、C#基础 1. 变量与数据类型:C#支持基本数据类型如int、float、double、bool,以及引用类型如string、object等。变量必须先声明后使用,遵循强类型检查。 2. 控制流:包括条件语句(if-else、switch)、循环...

    C#学习知识库2.0版

    C#学习知识库2.0版是一个专门为学习C#设计的知识整理系统,旨在帮助初学者和有经验的开发者更好地理解和掌握C#的关键概念和特性。 1. **基础语法**: - 变量与数据类型:C#支持基本数据类型(如int, double, bool...

    2018C#面试整理

    - **拆箱**:将引用类型转换回值类型的过程。 - **2.18 new关键字的用法** - 创建对象实例。 - 隐藏基类中的方法或字段。 - **2.22 什么是反射** - 反射是一种可以在运行时获取类型信息的能力,包括创建类型...

    c#提纲学习精华笔记整理

    以下是对【标题】"c#提纲学习精华笔记整理"和【描述】中涉及的知识点的详细解释: 1. **控制台语句**: - `Write()`:在控制台上输出文本,但不会换行。 - `WriteLine()`:在控制台上输出文本,并在输出后自动...

    C#学习笔记(c#重点整理)精编版.docx

    10. **引用类型与值类型**:C#中有两种基本类型:值类型(如结构)和引用类型(如类)。值类型存储实际的值,而引用类型存储值的内存地址。 11. **类与实例**:类是面向对象编程的基础,包含数据成员、函数成员和...

    自己整理的C#面试题

    以下是我根据"自己整理的C#面试题"这个主题,结合C#的基础知识和常见面试题,为你详细解析的一些关键知识点: 1. **基础语法**:C#语法与C++和Java类似,但更注重安全性。包括变量声明(如int、string、bool等)、...

    C#资料,本人学习整理过

    根据提供的文档内容,我们可以归纳总结出以下C#的相关知识点: ### .Net Framework简介 .NET Framework 是一个由...通过这些知识点的学习,开发者可以更好地理解和掌握C#语言的基础知识以及面向对象编程的核心概念。

    C# .net面试题整理集合

    了解引用类型和值类型的区别,特别是对object类型的使用和装箱拆箱的理解。 2. **面向对象编程**:深入理解类、对象、继承、多态、封装、抽象类和接口的概念。面试时可能会要求设计简单的类结构并解释其关系。 3. ...

    C#语言规范5.0中文版

    ### C#语言规范5.0中文版知识点概览 ...以上是基于《C#语言规范5.0中文版》的部分内容整理的知识点概览。这些知识点覆盖了C#语言的基础语法、结构特点以及核心概念,对于理解和学习C#编程语言具有重要的指导意义。

    C#6.0 语言规范中文版.pdf

    此外,C#还支持用户定义的引用类型和值类型,便于实现对象的动态分配和轻量级结构体的内嵌存储。 在版本控制方面,C#特别关注了程序和库能够在长时间内兼容演进的问题。它在设计时考虑了虚拟方法、重载决策规则以及...

Global site tag (gtag.js) - Google Analytics