C#学习笔记(二)基本语法、数据类型、类型转换

C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中。

一个 Rectangle(矩形)类的实现:

using System;
namespace RectangleApplication
{
    class Rectangle
    {
        // 成员变量
        double length;
        double width;
        public void Acceptdetails()
        {
            length = 4.5;    
            width = 3.5;
        }
        public double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }
    
    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.Acceptdetails();
            r.Display();
            Console.ReadLine();
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

Length: 4.5
Width: 3.5
Area: 15.75

using关键字

在任何 C# 程序中的第一条语句都是: using System

using关键字用于在程序中包含命名空间。一个程序可以包含多个using语句。

class关键字

class关键字用于声明一个类。

C#中的注释

多行注释以 ‘/* */ ‘

单行注释 ‘//‘

成员变量

变量是类的属性或数据成员,用于存储数据。

在上面的程序中,Rectangle 类有两个成员变量,名为 length 和 width。

成员函数

函数是一系列执行指定任务的语句。类的成员函数是在类内声明的。

类 Rectangle 包含了三个成员函数: AcceptDetails、GetArea 和 Display。

实例化一个类

在上面的程序中,类 ExecuteRectangle 是一个包含 Main() 方法和实例化 Rectangle 类的类。

==直白地解释就是==:通过已有的类(class)创建出该类的一个对象(object),这一过程就叫做类的实例化。

==打个比方==:你设计了一个飞机模型,交给工人师傅去加工制作,生产出一个(一批)飞机。飞机模型就相当于程序中的类,生产出来的飞机就是对象,生产飞机这一过程就叫做类的实例化。

MyPlane plane1= new MyPlane();        //类的实例化

标识符

标识符是用来识别类、变量、函数或任何其它用户定义的项目。在 C# 中,类的命名必须遵循如下基本规则:

标识符必须以字母、下划线或 @ 开头,后面可以跟一系列的字母、数字( 0 - 9 )、下划线( _ )、@。
标识符中的第一个字符不能是数字。
标识符必须不包含任何嵌入的空格或符号,比如 ? - +! # % ^ & * ( ) [ ] { } . ; : " ‘ / 。
标识符不能是 C# 关键字。除非它们有一个 @ 前缀。 例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。
标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。
不能与C#的类库名称相同。

C# 关键字

关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符,但是,如果您想使用这些关键字作为标识符,可以在关键字前面加上 @ 字符作为前缀。

在 C# 中,有些关键字在代码的上下文中有特殊的意义,如 get 和 set,这些被称为上下文关键字(contextual keywords)
***

数据类型

  • 值类型:int``````float``````double``````bool
    • 1.不能从值类型派生新类型,但可以结构实现接口
    • 2.值类型不能包含 null 值
    • 3.每个值类型都具有一个初始化该类型的默认值的隐式默认构造函数
  • 引用类型:自定义引用类型有class、interface、delegate
    • 对象类型object:值类型转换为对象类型是装箱;对象类型转换为值类型是拆箱
    • 只有装过箱的数据才能拆箱
    object obj;
    obj = 100; //这是装箱
    
    int val = 8;
    object obj = val;//整型数据转换为了对象类型(装箱)
    
    int val = 8;
    object obj = val;//先装箱
    int nval = (int)obj;//再拆箱
    • 动态类型dynamic
    dynamic <variable_name> = value;
    dynamic d = 20;
    • 字符串类型string ==(待补充)==
    String str = "study";
    @"study";//等价
    
    string str = @"C:\Windows";
    string str = "C:\\Windows";//等价
    /*这里的String和string有不同
    string是C#里的类,String是.net Framework的类
    (待补充)*/
    • 指针类型

      类型转换

      类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种形式:
  • 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
  • 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。

隐式类型转换:

namespace TypeConvertion
{   class Class1
    {

    }

    class Class2 : Class1 //类Class2是类Class1的子类
    {

    }
    class Program
    {
        static void Main(string[] args)
        {
            int inum = 100;
            long lnum = inum; // 进行了隐式转换,将 int 型(数据范围小)数据转换为了 long 型(数据范围大)的数据
            Class1 c1 = new Class2(); // 这里也是隐式转换,将一个新建的 Class2 实例转换为了其基类 Class1 类型的实例 C1
        }
    }
}

显式类型转换例1:

namespace TypeConversionApplication
{
    class ExplicitConversion
    {
        static void Main(string[] args)
        {
            double d = 5673.74;
            int i;

            // 强制转换 double 为 int
            i = (int)d;
            Console.WriteLine(i);
            Console.ReadKey();           
        }
    }
}

结果:

5673

显式类型转换例2:

double dnum = 100.1;
int ifromd = (int)dnum; //double类型显式转换转为int类型


Class1 c11 = new Class1();
Class2 c22 = c11 as Class2; //使用as进行显式转换
Console.WriteLine(c22 is Class1);
Console.WriteLine(c22 is Class2);

结果:

FALSE
FALSE

C#类型转换方法

序号 方法 描述
1 ToBoolean 如果可能的话,把类型转换为布尔型
2 ToByte 把类型转换为字节类型
3 ToChar 如果可能的话,把类型转换为单个 Unicode 字符类型
4 ToDateTime 把类型(整数或字符串类型)转换为 日期-时间 结构
5 ToDecimal 把浮点型或整数类型转换为十进制类型
6 ToDouble 把类型转换为双精度浮点型
7 ToInt16 把类型转换为 16 位整数类型
8 ToInt32 把类型转换为 32 位整数类型
9 ToInt64 把类型转换为 64 位整数类型
10 ToSbyte 把类型转换为有符号字节类型
11 ToSingle 把类型转换为小浮点数类型
12 ToString 把类型转换为字符串类型
13 ToType 把类型转换为指定类型
14 ToUInt16 把类型转换为 16 位无符号整数类型
15 ToUInt32 把类型转换为 32 位无符号整数类型
16 ToUInt64 把类型转换为 64 位无符号整数类型

把不同值的类型转换为字符串类型:

namespace TypeConversionApplication
{
    class StringConversion
    {
        static void Main(string[] args)
        {
            int i = 75;
            float f = 53.005f;
            double d = 2345.7652;
            bool b = true;

            Console.WriteLine(i.ToString());
            Console.WriteLine(f.ToString());
            Console.WriteLine(d.ToString());
            Console.WriteLine(b.ToString());
            Console.ReadKey();     
        }
    }
}

结果:

75
53.005
2345.7652
True

类型之间的转换 - Convert 和 Parse(以下摘自菜鸟教程)

string locstr = 123.ToString();

//如果要将"locstr"转成整型数

//方法一: 用 Convert 
int i = Convert.ToInt16(locstr);

//方法二: 用 Parse
int ii = int.Parse(locstr);
Convert.ToInt32() 与 int.Parse() 的区别

没搞清楚 Convert.ToInt32 和 int.Parse() 的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从 url 中取一个参数 page 的值,我们知道这个值是一个 int,所以即可以用 Convert.ToInt32(Request.QueryString["page"]),也可以用 int.Parse(Request.QueryString["page"]),但是如果 page 这个参数在 url 中不存在,那么前者将返回 0,0 可能是一个有效的值,所以你不知道 url 中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有 page 这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做 0 来处理。

(1) 这两个方法的最大不同是它们对 null 值的处理方法: Convert.ToInt32(null) 会返回 0 而不会产生任何异常,但 int.Parse(null) 则会产生异常。

(2) 对数据进行四舍五入时候的区别

  • a. Convert.ToInt32(double value) 如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5 转换为 4,4.5 转换为 4,而 5.5 转换为 6。不过 4.6 可以转换为 5,4.4 转换为 4 。
  • b. int.Parse("4.5") 直接报错:"输入字符串的格式不正确"。
  • c. int(4.6) = 4 Int 转化其他数值类型为 Int 时没有四舍五入,强制转换。

(3) 对被转换类型的区别 int.Parse 是转换 String 为 int, Convert.ToInt32 是转换继承自 Object 的对象为 int 的(可以有很多其它类型的数据)。你得到一个 object 对象, 你想把它转换为 int, 用 int.Parse 就不可以, 要用 Convert.ToInt32。
***

int.TryParse(string s,out int i)

该方式也是将数字内容的字符串转换为int类型,但是该方式比int.Parse(string s) 好一些,它不会出现异常,最后一个参数result是输出值,如果转换成功则输出相应的值,转换失败则输出0。

class test
{
    static void Main(string[] args)
    {
        string s1="abcd";
        string s2="1234";
        int a,b;
        bool bo1=int.TryParse(s1,out a);
        Console.WriteLine(s1+" "+bo1+" "+a);
        bool bo2=int.TryParse(s2,out b);
        Console.WriteLine(s2+" "+bo2+" "+b);
    }
}

结果输出:

abcd False 0
1234 True 1234

C#学习笔记(二)基本语法、数据类型、类型转换

上一篇:关于Android代码混淆,你了解多少?


下一篇:大师们好!我是初学小白。请教一个例题上的原理图。1位置的R8是什么作用?