C#初识

定义变量

数据类型 变量名;

赋值

数据类型  变量名 = 值;


先定义变量然后再赋值:
数据类型  变量名;
变量名 = 值;

交换(位运算)

 a = a ^ b;
        b = a ^ b;
        a = a ^ b;

C#的命名规则

C# 命名规则是为了让整个程序代码统一以增强其可读性而设置的。每一个单位在开发一个软件之前都会编写一份编码规范的文档。

常用的命名方法有两种,一种是 Pascal 命名法(帕斯卡命名法),另一种是 Camel 命名法(驼峰命名法)。

Pascal 命名法是指每个单词的首字母大写;Camel 命名法是指第一个单词小写,从第二个单词开始每个单词的首字母大写。

  1. 变量的命名规则
    变量的命名规则遵循 Camel 命名法,并尽量使用能描述变量作用的英文单词。例如存放学生姓名的变量可以定义成 name 或者 studentName 等。另外,变量名字也不建议过长, 最好是 1 个单词,最多不超过 3 个单词。
  2. 常量的命名规则
    为了与变量有所区分,通常将定义常量的单词的所有字母大写。例如定义求圆面积的 n 的值,可以将其定义成一个常量以保证在整个程序中使用的值是统一的,直接定义成 PI 即可。
  3. 类的命名规则
    类的命名规则遵循 Pascal 命名法,即每个单词的首字母大写。例如定义一个存放学生信息的类,可以定义成 Student。
  4. 接口的命名规则
    接口的命名规则也遵循 Pascal 命名法,但通常都是以 I 开头,并将其后面的每个单词的首字母大写。例如定义一个存放值比较操作的接口,可以将其命名为 ICompare。
  5. 方法的命名规则
    方法的命名遵循 Pascal 命名法,一般采用动词来命名。例如实现添加用户信息操作的方法,可以将其命名为 AddUser。

goto应用

class Program
{
    static void Main(string[] args)
    {
        int count = 1;
    login:
        Console.WriteLine("请输入用户名");
        string username = Console.ReadLine();
        Console.WriteLine("请输入密码");
        string userpwd = Console.ReadLine();
        if (username == "aaa" && userpwd == "123")
        {
            Console.WriteLine("登录成功");
        }
        else
        {
            count++;
            if (count > 3)
            {
                Console.WriteLine("用户名或密码错误次数过多!退出!");
            }
            else
            {
                Console.WriteLine("用户名或密码错误");
                goto login;//返回login标签处重新输入用户名密码
            }
        }
    }
}

方法

  • get和set访问器:获取和设置字段(属性)的值

    1. get{}
      get 访问器,用于获取属性的值,需要在 get 语句最后使用 return 关键字返回一个与属性数据类型相兼容的值。

    若在属性定义中省略了该访问器,则不能在其他类中获取私有类型的字段值,因此也称为只写属性。
    2) set{}
    set 访问器用于设置字段的值,这里需要使用一个特殊的值 value,它就是给字段赋的值。

    在 set 访问器省略后无法在其他类中给字段赋值,因此也称为只读属性。

    private int id;
            //设置图书编号属性
            public int Id
            {
                get
                {
                    return id;
                }
                set
                {
                    id = value;
                }
            }
    

部分类

在 C# 语言中提供了一个部分类,正如字面上的意思,它用于表示一个类中的一部分。

一个类可以由多个部分类构成,定义部分类的语法形式 如下。

访问修饰符   修饰符   partial class   类名{……}

在这里,partial 即为定义部分类的关键字。部分类主要用于当一个类中的内容较多时将相似类中的内容拆分到不同的类中,并且部分类的名称必须相同。

【实例 1】定义名为 Course 的类,分别使用两个部分类实现定义课程属性并输出的操作。在一个部分类中设定课程的属性,在一个部分类中定义方法输出课程的属性。

根据题目要求,课程的属性包括课程编号、课程名称、课程学分,代码如下。

public partial class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Points { get; set; }
}
public partial class Course
{
    public void PrintCoures()
    {
        Console.WriteLine("课程编号:" + Id);
        Console.WriteLine("课程名称:" + Name);
        Console.WriteLine("课程学分:" + Points);
    }
}

main

        static void Main(string[] args)
        {
            // Test book = new Test();
            // Console.WriteLine(LambdaClass.Add(100, 200));
            Course course = new Course();
            course.Id = 1001;
            course.Name = "C#部分类";
            course.Points = 3;
            course.PrintCoures();
            Console.ReadKey();
        }

使用部分方法需要注意如下 3 点:

  • 部分方法必须是私有的,并且不能使用 virtual、abstract、override、new、sealed、extern 等修饰符。
  • 部分方法不能有返回值。
  • 在部分方法中不能使用 out 类型的参数。

例:

在实例 1 的基础上添加部分方法,在第一个部分类中添加一个没有方法体的 PrintCourse 方法。

根据题目要求,添加部分方法后的代码如下。

public partial class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Points { get; set; }
    partial void PrintCourse();
    //调用PrintCourse方法
    public void PrintMsg()
    {
        PrintCourse();
    }
}
public partial class Course
{
    public void PrintCoures()
    {
        Console.WriteLine("课程编号:" + Id);
        Console.WriteLine("课程名称:" + Name);
        Console.WriteLine("课程学分:" + Points);
    }
}

其他类

Console类:控制台输入输出

C# Console 类主要用于控制台应用程序的输入和输岀操作。

在前面演示的实例中就使用了该类,本节将具体具体讲解 Console 类的 4 个常用方法。

Console 类中常用方法
方法描述
Write向控制台输出内容后不换行
WriteLine向控制台输出内容后换行
Read从控制台上读取一个字符
ReadLine从控制台上读取一行字符

此外,在向控制台中输出内容时也可以对输出的内容进行格式化,格式化时使用的是占位符的方法,语法形式如下。
Console.Write(格式化字符串, 输出项, 输出项2);

其中,在格式化字符串中使用{索引号}的形式,索引号从 0 开始。输出项 1 填充 {0} 位置的内容,依此类推。

下面通过实例来学习 Console 类的用法。

【实例】从控制台依次输入姓名和所在学校,并在输出时组成一句话“xx 同学在 xx 学习”。

    static void Main(string[] args)
    {
        Console.WriteLine("请输入学生姓名:");
        string name = Console.ReadLine();
        Console.WriteLine("请输入所在学校:");
        string school = Console.ReadLine();
        Console.WriteLine("{0}同学在{1}学习", name, school);
    }
Math类
方法描述
Abs取绝对值
Ceiling返回大于或等于指定的双精度浮点数的最小整数值
Floor返回小于或等于指定的双精度浮点数的最大整数值
Equals返回指定的对象实例是否相等
Max返回两个数中较大数的值
Min返回两个数中较小数的值
Sqrt返回指定数字的平方根
Round返回四舍五入后的值
Random类

方法 描述
Next() 每次产生一个不同的随机正整数
Next(int max Value) 产生一个比 max Value 小的正整数
Next(int min Value,int max Value) 产生一个 minValue~maxValue 的正整数,但不包含 maxValue
NextDouble() 产生一个0.0~1.0的浮点数
NextBytes(byte[] buffer) 用随机数填充指定字节数的数组

DateTime类

在 DateTime 类中提供了常用的属性和方 法用于获取或设置日期和时间,如下表所示。

方法 描述
Date 获取实例的日期部分
Day 获取该实例所表示的日期是一个月的第几天
DayOfWeek 获取该实例所表示的日期是一周的星期几
DayOfYear 获取该实例所表示的日期是一年的第几天
Add(Timespan value) 在指定的日期实例上添加时间间隔值 value
AddDays(double value) 在指定的日期实例上添加指定天数 value
AddHours(double value) 在指定的日期实例上添加指定的小时数 value
AddMinutes(double value) 在指定的日期实例上添加指定的分钟数 value
AddSeconds(double value) 在指定的日期实例上添加指定的秒数 value
AddMonths(int value) 在指定的日期实例上添加指定的月份 value
AddYears (int value) 在指定的日期实例上添加指定的年份 value

字符串

  • 求字符串长度

    class Program
    {
        static void Main(string[] args)
        {
            string str = Console.ReadLine();
            Console.WriteLine("字符串的长度为:" + str.Length);
            Console.WriteLine("字符串中第一个字符为:" + str[0]);
            Console.WriteLine("字符串中最后一个字符为:" + str[str.Length - 1]);
        }
    }
    
  • IndexOf和LastIndexOf:查找字符串中的字符

IndexOf 方法得到的是指定字符串在原字符串中第一次出现的位置,LastlndexOf 方法得到的是指定字符串在查找的字符串中最后一次出现的位置。

需要注意的是字符串中的每个字符的位置是从 0 开始的。

无论是哪个方法,只要指定的字符串在查找的字符串中不存在,结果都为 -1。

  • Replace:字符串替换函

  • Substring:字符串截取函数

    Substring(指定位置); //从字符串中的指定位置开始截取到字符串结束
    Substring(指定位置, 截取的字符的个数); //从字符串中的指定位置开始截取指定字符个数的字符
    
  • Insert:字符串插入

    str.insert(位置,插入内容)
    

数据类型转换

  1. 隐式类型转换
    这些转换是 C# 默认的以安全方式进行的转换,不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
  2. 显式类型转换
    显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
  • 隐式转换

    int a = 100;
    double d = a;  //将int类型转换为double类型
    float f = 3.14f;
    d = f;    //将float类型转换为double类型
    

    隐式转换的类型

    • 从 sbyte 类型到 short,int,long,float,double,或 decimal 类型。
    • 从 byte 类型到 short,ushort,int,uint,long,ulong,float,double,或 decimal 类型。
    • 从 short 类型到 int,long,float,double,或 decimal 类型。
    • 从 ushort 类型到 int,uint,long,ulong,float,double,或 decimal 类型。
    • 从 int 类型到 long,float,double,或 decimal 类型。
    • 从 uint 类型到 long,ulong,float,double,或 decimal 类型。
    • 从 long 类型到 float,double,或 decimal 类型。
    • 从 ulong 类型到 float,double,或 decimal 类型。
    • 从 char 类型到 ushort,int,uint,long,ulong,float,double,或 decimal 类型。
    • 从 float 类型到 double 类型。
  • 强制转换

    数据类型变量名 = (数据类型)  变量名或值;
    

    例:

    double dbl_num = 12345678910.456;
    int k = (int) dbl_num ;//此处运用了强制转换
    
  • Parse方法:字符串类型转换

    Parse 方法用于将字符串类型转换成任意类型,具体的语法形式如下。

    数据类型   变量二数据类型.Parse(字符串类型的值);
    

    这里要求等号左、右两边的数据类型兼容。

  • Convert方法:数据类型转换

    数据类型 变量名 = convert.To数据类型(变量名);

    方法 说明
    Convert.ToInt16() 转换为整型(short)
    Convert.ToInt32() 转换为整型(int)
    Convert.ToInt64() 转换为整型(long)
    Convert.ToChar() 转换为字符型(char)
    Convert.ToString() 转换为字符串型(string)
    Convert.ToDateTime() 转换为日期型(datetime)
    Convert.ToDouble() 转换为双精度浮点型(double)
    Conert.ToSingle() 转换为单精度浮点型(float)

装箱和拆箱

在 C# 语言中数据类型分为值类型和引用类型,将值类型转换为引用类型的操作称为装箱,相应地将引用类型转换成值类型称为拆箱。

在上面的转换中 int 类型是值类型,而 string 类型是引用类型,当将值类型变量 a 的值转换成引用类型变量 str 时就是一个装箱的操作, 而拆箱操作则是将引用类型变量 str 的值再转换成整型的过程,转换的代码如下。

a=int.Parse(str);

这样就完成了一个简单的装箱和拆箱操作

int val = 100;
object obj = val;
Console.WriteLine("对象的值 = {0}", obj);
//这是一个装箱的过程,是将值类型转换为引用类型的过程
int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine("num: {0}", num);
//这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程

委托

委托从字面上理解就是一种代理,类似于房屋中介,由租房人委托中介为其租赁房屋。

修饰符  delegate  返回值类型  委托名 ( 参数列表 );

实例化的语法

委托名  委托对象名 = new 委托名 ( 方法名 );

委托中传递的方法名既可以是静态方法的名称,也可以是实例方法的名称。

需要注意的是,在委托中所写的方法名必须与委托定义时的返回值类型和参数列表相同。

class Program
{
    public delegate void MyDelegate();
    static void Main(string[] args)
    {
        MyDelegate myDelegate = new MyDelegate(Test.SayHello);
        myDelegate();
    }
}
class Test
{
    public static void SayHello()
    {
        Console.WriteLine("Hello Delegate!");
    }
}

多播委托

多播委托是指在一个委托中注册多个方法,在注册方法时可以在委托中使用加号运算符或者减号运算符来实现添加或撤销方法。

在这里委托相当于点餐平台,每一个类型的商品可以理解为在委托上注册的一个方法。

可以同时多个方法一起使用

+=委托添加方法

-=委托删除该方法

匿名委托

步骤

  1. 定义委托

    修饰符  delegate  返回值类型  委托名 ( 参数列表 );
    
  2. 定义委托

    委托名  委托对象 = delegate
    {
        //代码块
    };
    
  3. 调用委托

    委托对象名 ( 参数列表 );
    

事件

访问修饰符  event  委托名  事件名 ;
class Program
{
    //定义委托
    public delegate void SayDelegate();
    //定义事件
    public event SayDelegate SayEvent;  //SayEvent事件绑定SayDelegate委托
    //定义委托中调用的方法
    public void SayHello()
    {
        Console.WriteLine("Hello Event!");
    }
    //创建触发事件的方法
    public void SayEventTrigger()
    {
        //触发事件,必须与事件是同名方法
        SayEvent();
    }
    static void Main(string[] args)
    {
        //创建Program类的实例
        Program program = new Program();
        //实例化事件,使用委托指向处理方法
        program.SayEvent = new SayDelegate(program.SayHello);
        //调用触发事件的方法
        program.SayEventTrigger();
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值