通用类型系统

C#中,变量是值还是引用仅取决于数据类型

所有的数据类型都是对象。因为它们具有自己ide方法和属性

int
int_value = 101;

    //调用*int_value*的比较方法与整型*2*进行进行比较
    int_value.CompareTo(2); 

    //在控制台输出
    Console.WriteLine(int_value.ToString());

值类型

内置值类型

整型

  • sbyte(System.SByte)

  • short(System.Int16)

  • int(System.Int32)

  • long(System.Int64)

  • byte(System.Byte)

  • ushort(System.UInt16)

  • uint(System.UInt32)

  • ulong(System.UInt64)

  • char(System.Char)

浮点型

  • float (System.Single)

  • double(System.Double)

高精度类型

  • decimal(System.Decimal)

bool(System.Boolean)

用户定义的值类型

结构体类型(派生于System.ValueType)

枚举类型结构体类型(派生于System.Enum)

可空类型结构体类型(派生于System.Nullable泛型结构体)

C#的所有值类型均隐式派生自System.ValueType;

判断是否为值类型

Type.IsValueType

引用类型

数组(派生于System.Array)

用户可以自定义的引用类型

类:class(派生于System.Object)

接口:interface

委托类型:delegate(派生于System.Delegate)

字符串:string(System.String的别名)

Lambda表达式

数组类型

值类型数组

int[]
int_array = new int[10];

  • 在堆内存中一次初始化10个int类型的存储空间

  • 自动初始化这10个元素

  • 将10个元素存储到刚刚分配的内存空间内

引用类型数组

object[]
obj_array = new object[10];

  • 在堆内存中分配一次空间

  • 不会自动初始化任何元素

    • obj_array[i]都是null
  • 当有代码初始化某个元素时,对应元素的存储空间会分配在堆内存上

    • obj_arr[i]=new
      object();

内存部署

堆内存上存储了所有的引用类型

object
item = new objct();

  • new 关键字在堆内存中分配内存空间,并且返回该内存空间的地址

  • item存储分配后返回的内存地址

语法

结构体

关键字struct定义

public struct LORect
{
    private float x;
    private float y;
    private float width;
    private float height;
}

构造函数

  public LORect(float x,float y,float width,float height)
  {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
  }
  • 不允许重载无参构造函数

属性

    public float X{
        set{
            this.x = value;
        }
        get{
            return this.x;
        }
    }

定义变量

LORect
frame = new LORect(0f,0f,100f,100f);

枚举

关键字enum定义

public enum LOControlType
  {
    LOControlTypeNormal = 0,
    LOControlTypeHighlight = 1,
    LOControlTypeDisable = 2,
  }

定义变量

LOControlType
type = LOControlType.LOControlTypeNormal;

父类

关键字class定义

public class LOPerson { private
string name; private int age; }

构造函数

  • public
    LOPerson(){}

  • public
    LOPerson(string name){this.name = name;}

  • public
    LOPerson(string age){this.age = age;}

  • 多个参数的构造函数

    public LOPerson(string name,int
    age) { this.name = name; this.age = age; }

自定义函数

  public void SayHi()
  {
    Console.WriteLine (this.name + “: Hello”);
  }

析构函数

  ~LOPerson()
  {
    this.name = null;
    this.age = 0;
  }
  • 在析构函数中,将引用类型成员变量置为null,内存处理

  • 在析构函数中,将值类型成员变量置为默认值,程序逻辑安全

子类

关键字class定义

  public class LOStudent:LOPerson
  {
    private float score;
  }

构造函数

  • 基于父类无参的构造函数

      public LOStudent(float score):base()
      {
    this.score = score;
      }
  • public
    LOStudent(int age):base(age){}

  • 在构造函数的继承中,都会先调用父类的构造函数

自定义函数

  public void SayHello()
  {
    base.SayHi();
    Console.WriteLine (“this.SayHi”);
  }
  • 在自定义函数中,调用父类的某个函数要用到base关键字

析构函数

  ~LOStudent()
  {
    this.score = 0f;
  }
  • 子类和父类的析构函数的执行顺序

    • 1.自动调用子类的析构函数

    • 2.自动调用父类的析构函数

    • 不需要特别语法指名

特性

关键字Attribute定义

  [AttributeUsage(AttributeTargets.Property)]
  public class LOTypeAttribute:Attribute
  {
    public string Type{set;get;}
  }

特性的用法

  public class LOPeople
  {
    [LOType(Type=“NoHealthy”)]
    public string hobby{set;get;}
  }

获取特性的值

      PropertyInfo item = property_list[0];
    LOTypeAttribute attribute = (LOTypeAttribute)Attribute.GetCustomAttribute(item,typeof(LOTypeAttribute));  

    Console.WriteLine (attribute.Type);

反射

命名空间

using
System.Reflection;

获取Type

  LOPeople people = new LOPeople();
  people.hobby = “Smoke”;  

  Type p_type = people.GetType();

属性(PropertyInfo)

  • 获取属性列表

    • PropertyInfo[]
      property_list = p_type.GetProperties();
  • 获取指定属性

    • PropertyInfo
      property = p_type.GetProperty(“hobby”);
  • 方法

    • 获取people对象的属性值 .GetValue()

      • property.GetValue(people,null);
    • 设置people对象的属性值 .SetValue()

      • property.SetValue(people,”Drink”,null);

方法(MethodInfo)

  • 获取方法列表

    • MethodInfo[]
      method_list = p_type.GetMethods();
  • 获取指定方法

    • MethodInfo
      method = p_type.GetMethod(“SayHi”);
  • 方法调用

    • Invoke()
  • 方法的参数列表

    • method.GetParameters();
  • 方法的返回值

    • method.ReturnType;

成员(MemberInfo)

  • 获取成员列表

    • MemberInfo
      member_list = p_type.GetMembers();
  • 获取指定成员

    • MemberInfo[]
      member= p_type.GetMember(“name”);

构造函数(ConstructorInfo)

  • 获取构造函数列表

    • ConstructorInfo[]
      constructor_list = p_type.GetConstructors();
  • 获取指定构造函数

    • ConstructorInfo
      constructor = p_type.GetConstructor(new Type[]{typeof(int)});

委托

关键字delegate

public
delegate void LODataSource(List<int> data_list);

定义委托类型变量

LODataSource
dataSource;

委托类型变量赋值

Lambda表达式赋值

  dataSource = (List<int> data_list)=>{
            foreach (int item in data_list)
            {
                Console.WriteLine (item.ToString());
            }
  } ;

函数地址赋值

  void ProcessData(List<int> data_list)
  {
    foreach (int item in data_list)
    {
        Console.WriteLine (item.ToString());
    }
  }
  • dataSource
    = new LODataSource(ProcessData);

  • dataSource
    = ProcessData;

接口

关键字interface

  public interface LOInterface{
    void SayNice();
  }

接口中只能声明函数,不能实现函数

接口的用法

  public class LOTeacher:LOInterface{
    private string name;  

    public void SayNice()
    {
        Console.WriteLine (this.name + “: Nice”);
    }
  }
  public class LOManager:LOInterface{
    private string name;  

    public void SayNice()
    {
        Console.WriteLine (this.name + “: Nice”);
    }
  }

接口的好处

为多个不同的类提供相同名称的方法接口,提供不同的实现过程

C#数据类型汇总的更多相关文章

  1. day 7 - 1 集合、copy及基础数据类型汇总

    集合:{},可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复.(不重要)集合的书写 set1 = set({1,2,3}) #set2 = {1,2,3,[2,3],{'name':' ...

  2. Django Models的数据类型汇总

    https://blog.csdn.net/devil_2009/article/details/41735611 Django Models的数据类型 汇总 AutoField IntegerFie ...

  3. 基础数据类型汇总补充;集合set ;深浅copy

    首先回顾: 小数据池:int -5~256str 特殊字符,*数字20 ascii : 8位 1字节 表示1个字符unicode 32位 4个字节 表示一个字符utf- 8 1个英文 8位,1个字节 ...

  4. 基础数据类型汇总补充,python集合与深浅拷贝

    一.基础数据类型汇总补充 1.查看str所有方法方式 2.列表:在循环中删除元素,易出错或报错(飘红) lis = [11,22,33,44,55] # for i in range(len(lis) ...

  5. MySQL学习笔记(二):MySQL数据类型汇总及选择参考

    本文主要介绍了MySQL 的常用数据类型,以及实际应用时如何选择合适的类型.  ******几个通用的简单原则:******* 1. 更小的通常更好.但是要确保没有低估需要存储的值的范围,如果无法确定 ...

  6. python 基础数据类型汇总

    数据类型小结(各数据类型常用操作) 一.数字/整型int int()强行转化数字 二.bool类型False&True bool()强行转化布尔类型. 0,None,及各个空的字符类型为Fal ...

  7. mysql的数据类型汇总

    数字型 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0, ...

  8. python基础数据类型汇总

    list和dict 在循环一个列表和字典时,最好不要删除其中的元素,这样会使索引发生改变,从而报错! lis = [11, 22, 33, 44, 55] for i in range(len(lis ...

  9. Java最常用的变量定义汇总

    Java最常用的数据类型有基本数据类型,字符串对象,数组,基本数据类型又分为:数值型(包括整形和浮点型),字符型,布尔型,下面用一个简单的程序把这些数据类型汇总一下 public class Java ...

随机推荐

  1. CloudFoundry云环境中应用的特殊设计

    常规的应用,大多数可以不经过任何修改即可部署于CloudFoundry云平台之上,但是在一些特殊情况下,总是不可避免地会出现一些细小的问题,如果在应用设计之初,就考虑到针对云平台的一些特殊情况,遵守云 ...

  2. 【COM学习】之一、QueryInterface

    开始先说一句,学习com之前要学好c++ 对象模型. QueryInterface的使用: QueryInterface是IUnknown的一个成员函数,客户可以通过此函数来查询某个组件是否支持某个特 ...

  3. oracle-TNS是什么?

    oracle 的 TNS 是什么的缩写?Transparent Network Substrate(透明网络底层,即无论底层的网络层用什么协议对于上层的应用层都是透明的,也即上层的应用层不用关心底层的 ...

  4. WORLD OPERATS

        word文章设置无法复制 通常我们会采用设置密码的方式,规定某个文档的使用范围. 但这种方法是有一个局限,那就是可以观看文档的人未必靠谱,万一复制了文档的重要内容怎么办? 因此,不妨考虑加上禁 ...

  5. MySQL定时事件

    1.创建一个测试表 CREATE TABLE aaa (timeline TIMESTAMP); 2.创建一个事件:每秒插入一条记录到数据表 CREATE EVENT e_test_insert SE ...

  6. 八、频繁模式挖掘Frequent Pattern Mining

    频繁模式挖掘(Frequent Pattern Mining): 频繁项集挖掘是通常是大规模数据分析的第一步,多年以来它都是数据挖掘领域的活跃研究主题.建议用户参考维基百科的association r ...

  7. get client machine name

    System.Net.Dns.GetHostEntry(Request.ServerVariables["remote_addr"]).HostName;

  8. Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法

    今天项目中碰到一个以前从没有见过的异常信息“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”,于是查了一下资料,原来此异常是由于我在代码中使用了"Response.End ...

  9. 用java具体代码实现分数(即有理数)四则运算

    用java具体代码实现分数(即有理数)四则运算 1,背景 Java老师布置了一个关于有理数运算的题目,因为参考书上有基本代码,所以自己主要是对书上代码做了一点优化,使其用户交互性更加友好以及代码封装性 ...

  10. [转] stat命令输出结果中, Access,Modify,Change的含义

    先建立一个空白文件a.txt 1 [emduser@emd tmp]$ touch a.txt 2   3 [emduser@emd tmp]$ ls -al a.txt 4   5 -rw-rw-r ...