精华内容
下载资源
问答
  • 【C#基础】值类型和引用类型

    千次阅读 热门讨论 2016-10-23 18:58:18
    在备战软考的过程中,涉及到了原型模式,其中讲到了在浅复制的过程中,值类型和引用类型是区别的。那么究竟什么是值类型,什么是引用类型呢? 在理解这两个概念之前,我们先谈一谈栈和堆。

    一、前言:

        在备战软考的过程中,涉及到了原型模式,其中讲到了在浅复制的过程中,值类型和引用类型是有区别的。那么究竟什么是值类型,什么是引用类型呢?

    在理解这两个概念之前,我们先谈一谈栈和堆。

        计算机的内存从概念上分,会有许许多多独立的块,堆和栈就是其中的两种内存块。是一种先进后出的数据结构,当我们调用一个方法时,假如这方法有参数的话,那么我们就需要在中为这个方法的参数方法所用到的变量局部变量)分配一小部分内存。当方法结束的时候,所占用的内存就会自动释放回栈中。堆是用于为类型实例(对象)分配空间的内存区域,当我们使用new创建一个对象的时候,new出来的东西放在中。更多详情,猛戳这里


    二、值类型和引用类型:

        C#的类型一共分为两类,一种是值类型(Value Type),一类是引用类型(Reference)。

                     

        每一种编程语言的值类型都有一些非常细小的不同,C#的内置值类型共有七种:int、long、float、char、bool、enum、struct。而string类型是一种具有值类型特性的特殊引用类型,且按下不表。

               

    三、函数调用时参数的传递方式:

        1、传值调用是将实参传递给被调用函数的形参。因此实参既可以是表达式,也可以是变量(或数组元素)。

        2、传地址调用是将实参地址传给被调用函数的形参。所以,实参必须有地址。因此实参必须是变量(数组),不能表达式常量(因为他们不存在地址)。

        3、如果采用传值方式调用,则形参值的变化不会影响实参。

        4、如果采用引用方式调用,则形参值的变化直接反映到实参。


    四、举例:

        基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。举个例子:int  a =10; int b = a,此时b的值为10,当把a付给b时,开辟一块新的空间来保存b的值,b的值为10。当把a的值该为50时,会在a的空间保存50.。与b无关,此时b仍为10。                                                                              

    而引用类型则与之不同,因为引用类型指向的是同一个地址。  


    原型模式例子:

    简历类:

    <span style="font-family:KaiTi_GB2312;font-size:24px;">class Resume:ICloneable
    {
         private string name;
         private string sex;
         private string age;
         private string timeArea;
         private string company;
    
       public Resume(string name)
       {
          this.name = name;
       }
    
    //设置个人信息:
    
    public void SetPersonalInfo(string sex,string age) 
      {
          this.sex = sex;
          this.age = age;
       }
    //设置工作经历
    
    public void SetWorkExperience(string sex,string age)
     {
           this.timeArea = timeArea;
           this.company = company;
      }
    
    //显示
    
    public void Display()
     {
         Console.WriteLine("{0} {1} {2}",name, sex, age);
         Console.WriteLine("工作经历:{0} {1}",timeArea, company);
      }
    
      public Object Clone()
       {
           return (Object)this.MemberwiseClone();
        }
    
    }</span>
    客户端调用代码:

    <span style="font-family:KaiTi_GB2312;font-size:24px;">static void Main(string[] args)
    {
       Resume a = new Resume("大鸟");
       a.SetPersonalInfo("男","29");
       a.SetWorkExperience("1998-2000","XX公司")
    
       Resume b = (Resume)a.Clone();
       b.setWorkExperience("1998-2006","YY企业")
    
       Resume c = (Resume)a.Clone();
       c.SetPersonalInfo("男","24");
    
       a.Display();     
       b.Display();
       c.Display();
     
       Console.Read();
    }</span>


    结果显示:
    大鸟 男 29
    工作经历  1998-2000  XX公司

    大鸟 男 29
    工作经历  1998-2006  YY公司

    大鸟 男 24
    工作经历  1998-2000  XX公司


    工作经历类

    <span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="color:#ff6666;"><span style="color:#ff0000;">Class WorkExperience
    {
        private string workDate;
        public string WorkDate
        {
    	get {return workDate;}
            set {workDate = value;}
         }
        private string company;
        public string Company
        {
            get {return company;}
            set {company = value;}
         }
    }</span></span></span>


    简历类:

    <span style="font-family:KaiTi_GB2312;font-size:24px;">class Resume:ICloneable
    {
         private string name;
         private string sex;
         private string age;
       
       <span style="color:#ff6666;"><span style="color:#ff0000;">private WorkExperience work;</span> </span>//引用"工作经历"对象
       public Resume(string name)
       {
          this.name = name;
        <span style="color:#ffff00;">  </span><span style="color:#ff0000;"><span style="color:#ff0000;">work = new WorkExperience(); </span></span>   //在“简历”类实例化时同时实例化“工作经历”
       }
    
    //设置个人信息:
    
    public void SetPersonalInfo(string sex,string age) 
      {
          this.sex = sex;
          this.age = age;
       }
    //设置工作经历
    
    public void SetWorkExperience(<span style="color:#ff6666;">string workDate,string company</span>)
      {
          <span style="color:#ff6666;"> <span style="color:#ff0000;">work.WorkDate = workDate;
           work.Company = company</span>;</span>
      }
    
    //显示
    
    public void Display()
     {
         Console.WriteLine("{0} {1} {2}",name, sex, age);
         Console.WriteLine("工作经历:{0} {1}",<span style="color:#ff6666;"><span style="color:#ff0000;">work.WorkDate, work.Company</span></span>);
      }
    
      public Object Clone()
       {
           return (Object)this.MemberwiseClone();
        }
    
    }
    </span>


    客户端调用:

    <span style="font-family:KaiTi_GB2312;font-size:24px;">static void Main(string[] args)
    {
       Resume a = new Resume("大鸟");
       a.SetPersonalInfo("男","29");
       a.SetWorkExperience("1998-2000","XX公司")
    
       Resume b = (Resume)a.Clone();
       b.setWorkExperience("1998-2006","YY企业")
    
       Resume c = (Resume)a.Clone();
       c.SetPersonalInfo("男","24");
       c.SetWorkExperience("1998-2003","ZZ企业");
    
       a.Display();     
       b.Display();
       c.Display();
     
       Console.Read();
    }</span>


    结果显示:

    大鸟 男 29
    工作经历  1998-2003  ZZ公司

    大鸟 男 29
    工作经历  1998-2003  ZZ公司

    大鸟 男 24
    工作经历  1998-2003  ZZ公司


    分析:

        因为“简历”对象里的数据都是string型的,而string是一种拥有值类型特点的特殊引用类型,(在这里例子中可以看成是值类型。)前者是值类型,后者是类类型(属于引用类型)。所以两次的结果是不一致的。

        当执行c.SetWorkExperience("1998-2003","ZZ企业")之后,内存区域的数据变成 1998-2003  ZZ公司。因为引用类型的a、b、c指向的是这一块内存区域。所以a、b、c三个的显示结果都为:工作经历  1998-2003  ZZ公司

     

                   



    展开全文
  • 值类型介绍——float类型

    千次阅读 2011-11-12 22:08:59
    float关键字表示存储32位浮点的简单类型,该类型的存储如表4-5所示。 表4-5 float类型 类 型 范 围 大 小 类 型 float ±1.5×10-45 to±3.4×1038 7位 ...


    1.float类型的定义

    float关键字表示存储32位浮点值的简单类型,该类型的存储值如表4-5所示。

    表4-5  float类型

        

        

        

        

    float

    ±1.5×10-45 to±3.4×1038

    7

    System.Single

    2.float类型的标识

    默认情况下,赋值运算符右侧的实数被视为double。因此,应使用后缀f或F初始化浮点型变量,如下所示:

     float x = 3.5F;

    注意

    如果在以上声明中不使用后缀,则会因为你试图将一个double值存储到float变量中而发生编译错误。

    3.float类型的转换

    可在一个表达式中兼用数值整型和浮点型。在此情况下,整型将转换为浮点型。根据以下规则计算表达式:

     如果其中一个浮点型为double,则表达式的计算结果为double类型,在关系表达式或布尔表达式中为bool类型。

     如果表达式中不存在double类型,则表达式的计算结果为float类型,在关系表达式或布尔表达式中为bool类型。

    浮点表达式可以包含下列值集:

     正零和负零

     正无穷和负无穷

     非数字值(NaN)

     有限的非零值集

    功能说明:在下面的示例中,包含int、short和float类型的数学表达式得到一个float结果。请注意,表达式中没有double。

    展开全文
  • 我们都知道,c#的两大数据类型分别为值类型(int,float,double,char,DataTime)和引用类型(类、托管、数组和接口)。很多人或许闭着眼睛都能说出值类型包括简单类型、...为此,了解值类型和引用类型的本质差异就变的很

        我们都知道,c#的两大数据类型分别为值类型(int,float,double,char,DataTime)和引用类型(类、托管、数组和接口)。很多人都能说出值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等,但二者之间的联系和区别是什么,什么时候用struct什么时候用class时,就常常混淆不清了。为此,了解值类型和引用类型的本质差异就变的很有必要了。

        值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。
        从内存分配上来看,值类型通常分配在线程的堆(heap)栈(stack)上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC(Garbage Collection[垃圾回收])来控制其回收,需要进行地址转换,效率降低,这也正是c#需要定义两种数据类型的原因之一。
        值类型均隐式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封(sealed)的,所以无法派生出新的值类型。而且System.ValueType本身是一个类类型,而不是值类型,因为它重写了object的Equals()方法,所以对值类型将按照实例的值来比较,而不是比较引用地址。
        C#的统一类型系统,使得值类型可以转化为对象来处理,这就是常说的装箱和拆箱。由于装拆箱需要装建全新对象或做强制类型转换,这些操作所需时间和运算要远远大于赋值操作,因此不提倡使用它,同时也要尽量避免隐式装拆箱的发生。
    注:栈是操作系统分配的一个连续的内存区域,用于快速访问数据。因为值类型的容量是已知的,因此它可存储在栈上。而托管堆是CLR在应用程序启动时为应用程序预留的一块连续内存区,是用于动态内存分配的内存区,引用类型的容量只有到运行时才能确定,所以用堆来存储引用类型。

    C#的两种数据类型延伸之一--嵌套类型的内存分配

        对于引用类型嵌套值类型,以及值类型嵌套引用类型的情况下,内存分配可以根据以下两条规律来判断:

        引用类型始终部署在托管堆上;

        值类型总是分配在它声明的地方:作为字段时,跟随其所属的对象存储;作为局部变量时,存储在栈上。

    C#的两种数据类型延伸之二--string类型

        string是一个很有意思的引用类型,为什么说它很有意思呢?因为它表现了很多值类型的特点。请看一下代码示例:

    示例1:

    string str1 = "abc";
    string str2 = str1;
    str1 = "123";
    Console.WriteLine(str2);


    string a = "hello";
    string b = "h";
    b += "ello";
    Console.WriteLine(a == b);

    示例1的输出结果是abc,改变str1的值对str2没有影响。

    示例2的输出结果是True。

        这样的结果会使我们误以为string就是值类型。其实不然,示例1中str1 = "123"语句编译器私底下创建了一个新的字符串对象来保存新的字符序列"123",也就是此str1已非彼str1了,“此”str1的值的改变也就不能影响“彼”str1的值了,当然str2的值也就不会改变了。实质上str1 = "123"是str1=new string("123")的简写,它的每一次赋值都会抛掉原来的对象而生成一个新的字符串对象,分配新的内存空间,因此string是不可改变的。如果要创建可修改的字符串,可使用stringbuilder以获得更好的性能。至于示例2是因为为了方便比较字符串的值重定义了string的运算符== 和 !=。

    C#的两种数据类型延伸之三--struct和class 

        class和struct的语法基本相同,从声明到使用,都很相似。但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到,也就是说struct都能被class所代替。那么为什么还要使用struct呢?存在即是合理的,struct在很多方面有着性能优势。让我们看看它们的主要区别在哪里?

    数据类型不一样,struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。
    从继承性来看,struct既不能继承也不能被继承,但是可以实现接口,而Class就可以完全扩展了。
    内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段,但是值得注意的是,struct可以重写System.Object的3个虚方法,Equals()、ToString()和GetHashTable(),Class没有这些限制。
    比较struct和class的不同,可以得出以下几条struct和class的使用原则:

    1 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct。

    2 在表示数据量大、逻辑复杂的大对象时,首选class。

    3 在表现抽象和多级别的对象层次时,class是最佳选择。

     

    1.1数据类型分为值类型和引用类型。

        值类型主要包含简单类型、结构类型和枚举类型。引用类型包括类、托管、数组和接口。值类型的变量其内含为变量的值本身;C#语言中的另一大数据类型是引用类型,引用类型也称为参考类型。和值类型相比,引用类型的变量不直接存储所包含的值,而是指向它所要存储的值。换句话说,值类型在其内存空间中存储的是实际数据,而引用类型在其内存空间中存储的是一个指针,该指针指向存储数据的另一块内存位置。

        介绍两个经常用到的类:
    (1)object类
               object类是所有其它类型的基类,C#语言中的所有类型都直接或间接地从object类中继承。因此,对一个object的变量可以赋予任何类型的值:
               float f = 63.8 ;
               object obj1 ;
               obj1 = f ;
    (2)string类
               C#还定义了一个基本的类string,表示一个Unicode字符序列,专门用于对字符串的操作。

          2.可以从下面四个层面来理解变量:变量的名字、变量的值、变量的数据类型、变量的作用域。
           静态变量作用域:带有“static”修饰符声明的成员变量为静态成员变量。当静态成员变量所属类被装载后,静态成员变量生命周期开始,直到包含该所属类的程序运行结束后,静态成员变量生命周期结束。在C#中不存在类似其他语言的全局变量,使用公共静态成员变量可以实现类似的效果。
           实例变量作用域:不带 “static”修饰符声明的变量为实例成员变量。当一个类的实例被创建,其实例成员变量生命周期开始,直到该实例不在被使用且所占用内存空间被释放,其实例成员变量生命周期结束。实例成员变量和该类的具体实例具有相同的生命周期。
           方法参数作用域:方法参数变量的生命周期只在该方法的语句块内存在,方法被调用时,它的生命周期开始,方法执行完毕,它的生命周期结束。
           局部变量作用域:局部变量在其被定义的位置,生命周期开始,直到该局部变量被定义的语句块执行结束后,该局部变量的生命周期结束。
           异常处理参数作用域:异常处理参数变量的生命周期只在错误处理语句块内(即catch语句块内)存在。变量的访问修饰符限制了变量的可见性,可以用public | protected | private | internal | protected internal 等来限制,如果不使用修饰符,默认情况下为private。

          3.一维数组是最基本的数组类型,其声明方法如下:
               数据类型 [ ] 数组名 ;
               举例:
               int [ ] anArray ; // 声明一个整型的一维数组
          具有两个维度的数组是二维数组,其声明方法如下:
          数据类型 [ , ] 数组名 ;
          举例:
                int [ , ] anArray ; // 声明一个整型的二维数组
                float [ , ]anArrayOfFloats; // 声明一个浮点型的二维数组
                string [ , ] anArrayOfStrings; // 声明一个字符串型的二维数组
          声明数组变量时,还没有创建数组,还没有为数组中元素分配任何内存空间,因此,声明数组后,需要对数组实例化:
                anArray = new int [2,4] ;
                anArrayOfStrings = new stirng [2,4] ;
            我们也可以用给定的值对数组元素进行初始化。
                 int [, ] anArray = new int [2, 4] {{1,2,3,4},{5,6,7,8}};
                 string [, ] anArrayOfStrings = new string [2, 2] {{"某甲","某乙"}, {"冠军" ,"亚军" }};
            也可使用下列快捷方式:
             int [, ] anArray = {{0,1,2,3},{1,2,3,4}};
             string [, ] anArrayOfStrings = {{"某甲","某乙"}, {"冠军" ,"亚军" }};
            在C#语言中,数组为我们提供了一些有用的特性,利用这些特性,我们可以完成一些更高级的功能。
               数组名.Length :返回一个整数,该整数表示该数组的所有维数中元素的总数。
               数组名.Rank :返回一个整数,该整数表示该数组的维数。
               数组名.GetLength(int dimension) :返回一个整数,该整数表示该数组的指定维(由参数dimension指定,维度从零开始)中的元素个数。
    4.foreach语句针对数组或集合中的每一个元素,循环运行嵌入语句。foreach语句的语法格式为:
               foreach (数据类型 标识符 in 表达式)
               嵌入语句

    5.为了简洁代码,C#语言中使用using语句来导入名称空间。

    using 语句一般情况下被放在所有语句的前面。每个源文件中可以使用多个using语句,每行一个语句。比如:
    using System ;


    关于System.Collections空间
    System.Collections命名空间包含可使用的集合类和相关的接口,提供了集合的基本功能。

    该命名空间下的.NET非泛型集合类如下所示:

    — System.Collections.ArrayList:数组集合类,使用大小可按动态增加的数组实现Ilist接口。
    — System.Collections.BitArray:布尔集合类,管理位值的压缩数组,该值为布尔值。
    — System.Collections.Queue:队列,表示对象的先进先出集合。
    — System.Collections.Stack:堆栈,表示对象的简单的后进先出集合。
    — System.Collections.Hashtable:哈希表,表示键/值对的集合,这些键/值对根据键的哈希代码进行组织
    — System.Collections.SortedList:排序集合类,表示键/值对的集合,这些键和值按键排序并可按键和索引访问。

    该命名空间下的.NET非泛型接口如下所示:

    — System.Collections.ICollection:(继承于IEnumerable)定义所有集合的大小,枚举器和同步方法,可以获取集合中项的个数,并能把项复制到一个简单的数组类型中。
    — System.Collections.IComparer:比较两个对象的方法
    — System.Collections.IList:(继承于IEnumerable 和 ICollection)表示可按照索引单独访问一组对象,提供集合的项列表,并可以访问这些项。
    — System.Collections.IDictionary:(继承于IEnumerable 和 ICollection)表示键/值对的集合
    — System.Collections.IDictionaryEnumerator:枚举字典的元素
    — System.Collections.IEnumerator:支持在集合上进行简单迭代,可以迭代集合中的项。支持在非泛型集合进行简单迭代。

     

    C#数组与集合(拓展)
        数组非常有用,但存在着一些限制。
        Microsoft.Net Framework提供了几个类通过特殊的方法来收集元素这些类称为Collection(集合)类,集合类的元素类型是object。
        使用各种集合最设和的方法来天津单独的元素,如:ArrayList的方法是Add(添加),Queue(列队)的方法是Enqueue(入列),Stack的方法是Push(入栈),HashTable(哈希表).(Add)等。
        数组和集合比较:
        1)数组要声明它所容纳的元素类型,集合则不需要声明,因为集合是以object来存储元素的。
        2)数组实例具有固定的大小,不能增大或缩小,集合则可根据需要动态的改变大小。
        3)数组可以是多维的,集合则是线性的。

    常用数据结构:
        在C#语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本的数据类型或是构造类型。因此按数组元素类型的不通,数组又可以分为数值数组、字符数组、指针数组、结构数组等各种类别。

    堆 (Heap)

      在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。

    栈 (Stack)

      是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

    队列 (Queue)

      一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

    链表 (Linked List)

      是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
      链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

    树 (Tree)

      是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
      (1)有且仅有一个结点 k0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)。
      (2)除K0外,k中的每个结点,对于关系N来说有且仅有一个前驱。
      (3)K中各结点,对关系N来说可以有m个后继(m>=0)。

    图 (Graph)

      图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。

    散列表 (Hash)

      若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。

    展开全文
  • c# 基本值类型及其默认值

    千次阅读 2015-10-22 12:35:24
    基本值类型及其默认值 原文地址:http://songyongge417.blog.163.com/blog/static/1491464520106211021843/   //值类型   C# 类型 .NET Framework 类型 bool System.Boolean  4Byte 32bit布
    
    

    原文地址:http://songyongge417.blog.163.com/blog/static/1491464520106211021843/

     

    //值类型

     

    C# 类型      .NET Framework 类型


    bool            System.Boolean              


    4Byte 32bit布尔型变量 逻辑值,true或者false,默认值为false


    byte            System.Byte              


    1Byte 8bit无符号整数无符号的字节,所存储的值的范围是0~255,默认值为0


    sbyte         System.SByte 1Byte


    8bit有符号整数带符号的字节,所存储的值的范围是-128~127,默认值为0


    char           System.Char


    2Byte 16bit 无符号Unicode字符,默认值为’\0’


    decimal      System.Decimal


    16Byte 128bit十进制数不遵守四舍五入规则的十进制数,28个有效数字,通常用于财务方面的计算,默认值为0.0m


    double       System.Double


    8Byte 64bit双精度的浮点类型,默认值为0.0d


    float          System.Single


    4Byte 32bit单精度的浮点类型,默认值为0.0f


    int             System.Int32


    4Byte 32bit有符号整数,默认值为0


    uint           System.UInt32


    4Byte 32bit无符号整数,默认值为0


    long          System.Int64


    8Byte 64bit有符号整数,默认值为0


    ulong        System.UInt64


    8Byte 64bit无符号整数,默认值为0


    object       System.Object


    指向类实例的引用,默认值为null


    short        System.Int16


    2Byte 16bit有符号整数,默认值为0


    ushort       System.UInt16


    2Byte 16bit无符号整数,默认值为0


    string       System.String


    指向字符串对象的引用,默认值为null


    //引用类型


    引用类型的变量又称为对象,可存储对实际数据的引用。本节介绍以下用于声明引用类型的关键字:


    · class


    与 C++ 不同,C# 中仅允许单个继承。也就是说,类只能从一个基类继承实现。但是,一个类可以实现一个以上的接口。


    一个类可包含下列成员的声明:


    构造函数 析构函数 常数 字段 方法 属性 索引器 运算符 事件 委托 类 接口 结构


    只有嵌套类允许访问级别 protected 和 private。


    · interface


          接口只包含方法、委托或事件的签名,它是一个完全抽象的成员集合,它不是类,与基类有着本质的区别。方法的实现是在实现接口的类中完成的


          接口可以是命名空间或类的成员,并且可以包含下列成员的签名: 方法 属性 索引器 事件


    一个接口可从一个或多个基接口继承。


    当基类型列表包含基类和接口时,基类必须是列表中的第一项。


    实现接口的类可以显式实现该接口的成员。显式实现的成员不能通过类实例访问,而只能通过接口实例访问。


    ·delegate


          委托类型声明的格式如下:


    public delegate void TestDelegate(string message);


    delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。委托类似于 C++ 
    中的函数指针;但是,委托是类型安全和可靠的。


    委托是事件的基础。


    通过将委托与命名方法或匿名方法关联,可以实例化委托。


    以下为内置引用类型:


    ·object



          object 类型在 .NET Framework 中是 Object 的别名。在 C# 
    的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Object 继承的。可以将任何类型的值赋给 object 
    类型的变量。将值类型的变量转换为对象的过程称为“装箱”(Boxed)。将对象类型的变量转换为值类型的过程称为“取消装箱”。


    ·string


    string 类型表示零或更多 Unicode 字符组成的序列。string 是 .NET Framework 中 String 的别名。


    尽管 string 是引用类型,但定义相等运算符(== 和 !=)是为了比较 string 
    对象(而不是引用)的值。这使得对字符串相等性的测试更为直观。

    展开全文
  • 下列公式计算sin(x)的近似

    千次阅读 2018-06-19 21:04:20
    c++易错题【问题描述】给定一个精度e,用下列公式计算sin(x)的近似,要求前后两次迭代之差的绝对值小于e,给出相应的最小迭代次数n和最后一次计算的sin(x)。 sin x = x - x3/3! + x5/5! - x7/7! + ... + (-1)...
  • 在一行中按照“sum = S”的格式输出部分和的S,精确到小数点后六位,请注意等号的左右各一个空格。题目保证计算结果不超过双精度范围。 输入样例: 3 输出样例: sum = 7.500000 /* 功能:定义函数main(),输入正...
  • 定义函数main(),输入正整数n,计算并输出下列算式的。要求调用函数f(n)计算n*(n+1)…(2n-1),函数返回值类型是double。 s= 1+1/2*3 +1/​3∗4∗5 ​ ​​ ​​ 输入格式: 输入在一行中给出一个正整数n。 输出格式...
  • 一、类型和运算符 原文:Values, Types, and Operators 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)》 在机器的表面之下,程序在运转...
  • 输入一个正数x和一个正整数n,求下列算式的。要求定义两个调用函数:fact(n)计算n的阶乘;mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是double。 x - x2/2! + x3/3! + ... + (-1)n-1xn/n! ×输出...
  • 在表值类型参数被引入SQL Server 2008之前,传递多行数据到存储过程或者参数化的SQL命令中的可供选择的选项是受限制的,一个开发人员可以从下列的选项中选择一个传递多行数据到服务器: 使用一系列的独立参数...
  • 删除元素时,ArrayList的表现更佳C.ArrayList的访问速度比LinkedList快D.HashMap实现Map接口,允许任何类型的键和对象,并且允许键和都为null答案:ACD扩展:了解一下Collection架构,以及集合工具类Collections...
  • 输入一个正数x和一个正整数n,求下列算式的。要求定义两个调用函数:fact(n)计算n的阶乘;mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是double。 x - x2/2! + x3/3! + ... + (-1)n-1xn/n! ×输出...
  • 最近在编程的过程中遇到一个问题,就是如何获得int等基本数据类型所能表示的最大以及最小值。经过一番网上的查询,以及自己的实验,总结出了如下内容:   在定义一个int型的变量,并且想让它的为最大时,我们...
  • 语法 SQL_VARIANT_PROPERTY ( expression , property ) 参数expression 类型为 sql_variant 的表达式。 property 包含将为其提供信息的 sql_variant ...property 的数据类型为 varchar(128),可以是下列值之一。 值
  • C# 指针学习笔记之指针类型

    千次阅读 2014-09-05 09:31:11
    大学的时候学过C++、C,最近工作也不是很...在不安全的上下文中,类型可以是指针类型以及值类型或引用类型。指针类型声明具有下列形式之一: type* identifier; void* identifier; //allowed but not recomm
  • 2.4 表达式求类型转换 MySQL允许编写包括常量、函数调用和表列引用的表达式。这些可利用不同类型的运算符进行组合,诸如算术运算符或比较运算符。表达式的项可用圆括号来分组。表达式在SELECT 语句的列选择...
  • Outlook 2010 提示禁止访问下列

    千次阅读 2013-09-28 14:03:46
    outlook2007收到一封邮件带附件,但是却无法查看和下载,提示:禁止访问下列具有潜在不安全因素的附件。如何解决呢。先看一下官方的说明吧:http://support.microsoft.com/kb/829982/zh-cn。这篇说明针对的是2003...
  • C#数据类型

    千次阅读 多人点赞 2012-04-23 19:11:16
    C#的数据类型可以分为3类:数值... 值类型和引用类型的不同之处是值类型的变量值直接包含数据,而引用类型的变量把它们的引用存储在对象中。对于引用类型的变量,完全可能让两个不同的变量引用同一个对象,这样一来,
  • 编写程序从键盘输入10个float类型数存入一维数组a中,求这10个数的平均,然后用函数aver实现平均计算,输出这10个数以及平均,要求数组和元素个数作为参数传递。 声明函数avar: (3)主函数输入10个数据,用for...
  • JavaScript:数据类型

    千次阅读 2016-05-31 15:21:36
    一、数据类型 ...还有一种复杂数据类型—Object,Object本质上是由一组无序的名对组成的。 1、typeof  鉴于ECMAScript是松散类型的,因此需要一种手段来检测给定变量的数据—typeof就是负责提供这
  • SQL_VARIANT_PROPERTY (Transact-SQL)   返回有关 sql_variant 的基本数据类型和其他信息。   Transact-SQL 语法约定语法 SQL_VARIANT_PROPERTY (expression , property )参数...
  • http://bbs.zdnet.com.cn/thread-99851-1-1.html(转)SQL Server 2005关于数据类型最大48事情开始得很简单。MegaWare公司市场部门想要一个新的网站来发布文档,开发团队觉得使用SQL Server 2000数据库作为文档...
  • Boolean类型

    千次阅读 2019-02-22 22:15:29
    Boolean类型 Boolean类型是ECMAScript中使用得最多的一种类型,该类型...下面是为变量赋Boolean类型值的例子: var found = true; var lost = false; 注意:boolean类型的字面值true和false是区分大小写的。也就...
  • Java传递和引用传递详细说明

    千次阅读 2020-07-14 15:53:17
    传递和引用传递是初次接触Java时的一个难点,时候记得了语法却记不得怎么实际运用,时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:的论坛帖子说Java只有传递,的博客说两者皆;...
  • 文章目录一、考点1、JavaScript基本语法1) 变量的定义2)数据类型3)创建对象4) 函数5) 运算符6) 流程控制2、延伸1)JavaScript内置对象 ① Number② String③ Boolean ④ Array ⑤ Date常考:如何使用 JS 来...
  • 布尔型是最简单的数据类型。可以为TRUE或者FALSE,关键字不区分大小写。 要显式的将一个转换为布尔型,用(bool)或者(boolean)来强制转换。php在许多情况下,会进行自动类型转换,尤其在流程控制语句的条件表达式...
  • C++ decltype类型说明符

    万次阅读 多人点赞 2016-03-13 15:57:18
    decltype 类型说明符生成指定表达式的类型。在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的
  • JS数据类型

    千次阅读 2018-01-03 23:53:18
    1种复杂数据类型——Object,Object本质上是由一组无序的名对组成的。ECMAScript不支持任何创建自定义类型的机制,而所有最终都将是上述6种数据类型之一。 typeof 对一个使用typeof操作符可能返回下列的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 270,401
精华内容 108,160
关键字:

下列属于值类型的有