c#语法基础,面向对象学习总结

输出 console.writeline()
输入 console.readline()
等待命令 console.readkey()
---------------------------------------------------------------------------------------------
转义符 
\n 换行
\" 表示一个英文半角的双引号
\b 表示一个BackSpace退格键,把前面的一个字符删除
\t 表示一个tab建的大空格
\\ 表示一个\
@ 用在字符串钱有两种用途
   1取消“\”在字符串中的转义作用,使其单纯的就表示一个斜线【多用于路径】@"D:/s/ss/sss"
   2将字符串按照原格式输出 
---------------------------------------------------------------------------------------------
Convert类型转换
不兼容类型转换如string和int,string和double
string num1="3.15";  string num2="123";
double num3=Convert.ToDouble(num1);
double num4=Convert.ToDouble(num2);
Convert.ToInt32();
Convert.ToDouble();
---------------------------------------------------------------------------------------------
占位符
a=1,b=2
Console.WriteLine("{0}+{1}={2}",a,b,a+b);
运算出的结果是:1+2=3;
---------------------------------------------------------------------------------------------
常量 一般全为大写
const 数据类型 常量名=值
---------------------------------------------------------------------------------------------
switch-case
stitch(变量或者表达式的值)
{
case 值1:
  执行代码;
  break;
。。。。。
default:
 要执行代码;
 break;
}
---------------------------------------------------------------------------------------------
数组   数据类型[] 数组名;
int[] intArray;
intArray=new int[5];
double[] doubleArray=new double[5];
---------------------------------------------------------------------------------------------
foreach遍历数组
foreach(变量数据类型 临时变量 in 数组名)
{
    console.writeline(临时变量);
}
---------------------------------------------------------------------------------------------
二维数组
int[,] intArray=new int[,];  行列
intArray.getlength() 0为行 1为列
for(int i=0;i<intArray.getlength(0);i++)获取行
for(int j=0;j<intArray.getLength(1);j++)获取列
---------------------------------------------------------------------------------------------
函数
static 返回值类型 函数名(【参数列表】)
{
函数代码体;
}
---------------------------------------------------------------------------------------------
ref参数
引用传递,调用地址
在主函数中调用时 Add(ref num)
在函数中定义时:
static void Add(ref int num)
---------------------------------------------------------------------------------------------
out参数
---------------------------------------------------------------------------------------------
ToUpper()
字符串小写转大写
ToLower()
字符串大写转小写
--------------------------
Equals()***
比较两个字符串是否相同,相同返回真,不同返回假name.Equals(name2);
--------------------------
Split()***
分割字符串
字符串变量.方法名(用于分割字符串的字符数组)
name.Split(m_char);
--------------------------
Substring()***
截取字符串,返回截取后的子串
name.Substring(2);从角标为2的位置到最后
name.Substring(2,2);从角标2到最后-2的位置
--------------------------
IndexOf()
查找某个字符串在字符串第一次出现的位置
找到返回位置,没找到返回-1
LastIndexOf()
查找某个字符在字符串最后一次出现的位置
找到返回位置,没找到返回-1
--------------------------
StartWith()
判断是否是以。。字符串开始,是返回真,否返回假
EndsWith()
判断是否是以。。字符串结束,是返回真,否返回假
--------------------------
Replace()**
将字符串中的某个字符串替换成一个新的字符串,返回新的字符串
name.Repalce("mon","lkk");
--------------------------
Contains()***
判断某个字符串是否包含指定的字符串,是返回真,否返回假
name.Contains("key");
--------------------------
Trim()***
去掉字符串中的前后空格,返回处理后的字符串
address.Trim()***
TrimEnd()
去掉字符串结尾后的空格
TrimStart()***
去掉字符串开始前的空格
--------------------------
IsNullOrEmpty()
判断一个字符串是否为Null或空
为空位NUll是TRUE 不为空为FALSE
string.方法名(字符串变量)
string.IsNullEmpty(name);
---------------------------------------------------------------------------------------------
StringBuilder类型
直接引用地址不会产生冗余,效率也远远高于string
创建
StringBuilder sb=new StringBuilder(); 其以来System.Text命名空间
往sb中追加数据
sb.Append(i);在后面增加字符串
sb.ToString();转换为字符串输出或者展示
清空sb中的数据
sb.Clear();
---------------------------------------------------------------------------------------------
效率测试
Stopwatch类 依赖System.Diagnostics命名空间
创建 Stopwatch sw=new StopWatch();
sw.start();计时开始
sw.stop();计时结束
sw.Elapsed;开始到结束之间的时长
---------------------------------------------------------------------------------------------
枚举类型 enum 用于存储数据 定义在namespace下 其下所有类都可用
public enum 枚举名
{
值1,
值2,
值n
}
public enum week
{
星期一,
星期二,
。。。
星期天
}
枚举类型 变量名=枚举类型.值;
week day=week.星期四;
---------------------------------------------------------------------------------------------
结构体 vector3三维向量 color颜色 quaternion四元数 ray射线
public struct 结构体名称
{
public 数据类型 变量名;
。。。
}
---------------------------------------------------------------------------------------------
在类对类相等的时候也是引用
p1=p2;
更改p1或者p2时,另一个的数据也更改,两者指向一个地址。
---------------------------------------------------------------------------------------------
继承
class 子类:父类
{
}
在子类中构造使用base传输给父类
public 子类名(int a,int b):base(a,b)
{
}
在子类访问父类中的public字段,使用 base.加字段名
---------------------------------------------------------------------------------------------
多态是:在继承关系的前提下,实例化出不同的对象,这些对象调用相同的方法,但是却表现出不同的行为
c#多态的三种方式:虚方法,抽象类,接口
---------------------------------------------------------------------------------------------
虚方法
在父类使用virtal关键字修饰的方法
在子类中可以使用override关键字对该虚方法进行重写
父类:
public virtual 返回值类型 方法名(){
方法体代码;
}
子类:
public override 返回值类型 方法名(){
方法体代码;
}
---------------------------------------------------------------------------------------------
面向对象六大原则:
单一职责原则
开闭原则
里式转换原则
依赖倒转原则
接口隔离原则
迪米特原则
---------------------------------------------------------------------------------------------
里式转换原则
子类对象可以直接赋值给父类成员
子类对象可以调用父类中的成员,但是父类对象只能调用自己的成员
如果父类对象中装的石子类对象,可以将这个父类对象强转为子类对象
//旧版方式
Cat c = new Cat();
c.Cry();
//新的方式
CatType ct= new Cat();
ct.Cry();
---------------------------------------------------------------------------------------------
is as进行类型转换判断
is:如果转换成功返回TRUE,否则返回FALSE
as:如果转换成功,返回对应的对象,失败返回null
---------------------------------------------------------------------------------------------
抽象方法
抽象方法在返回值类型前加abstract修饰,且无方法体
抽象方法必须存在于抽象类中
abstract class FuLei
    {
        //抽象方法
        public abstract void Hello();

    }
在子类继承抽象类时,需要用override关键字来重写父类中所有抽象方法。
抽象类注意事项:
抽象类中不一定有抽象方法,但是抽象方法必须存在于抽象类中。
抽象类不能被实例化,因为抽象类中有抽象方法(无方法体)。
使用场景:
当父类中的方法不知道如何去实现的时候,可以考虑将父类携程抽象类,讲方法写成抽象方法。
如果父类中的方法有默认实现,并且父类需要被实例化,这时,可以考虑将父类定义成一个普通类,用虚方法实现多态。
如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义成抽象化。
抽象方法必须被重写***
virtual虚方法可以有实例,方法体。abstract抽象类不能有实例,方法体。
在子类都使用override关键字来重载。
---------------------------------------------------------------------------------------------
抽象类-》接口
当抽象类中所有的方法都是抽象方法的时候,这个时候可以把这个抽象类用另外一种姓氏来表现,这种姓氏叫做接口。
接口永interface关键字来定义,没有class关键字,接口名一般用“Ixxxxxx”来定义。
接口中不包含字段,但是包含属性。接口中不能用方法体,全都是抽象方法,但是不需要用abstract修饰,接口中的成员不允许添加修饰符,默认都是public;
一个类可以实现多个接口,被实现接口之间要使用逗号隔开
一个接口可以继承多个接口,接口之间也可以用逗号来分割。
***类与类之间只能是单继承关系,接口与接口之间也可以继承并且可以多继承关系。
---------------------------------------------------------------------------------------------
自动属性封装
private string name;
public string Name { get; set; }
在接口中使用属性,就可以写自动属性的格式。
---------------------------------------------------------------------------------------------
虚方法、抽象方法、接口代码实现比较
虚方法代码实现
class 父类名
{
    public virtual void 方法名()
    {
        Console.WriteLine("方法体");
    }
}
class 子类 : 父类名
{
    public override void 方法名()
    {
        base.方法名();
        Console.WriteLine("子类中的代码");
    }
}
虚方法:父类中的个别方法用虚方法实现,然后允许子类在有需要的情况下重写这些虚方法
----------------
抽象方法代码实现
abstract class 抽象类{
    public abstract void 抽象方法();
}
class 子类:抽象类{
    public override void 抽象方法(){
        Console.WriteLine("子类实现抽象方法");
    }
}
抽象类:父类定义一系列的规范,子类去把父类里面定义的这些规范全部实现
-------------------
接口代码实现
interface I接口名
{
    void 方法1();
    void 方法2();
}
class 子类:I接口名{
    public void 方法1(){
        Console.WriteLine("方法1");
    }
    public void 方法2(){
        Console.WriteLine("方法2");
    }
}
接口:是一种功能的拓展,是在原有的类的继承关系以外的新功能的扩展

---------------------------------------------------------------------------------------------
五种访问修饰符
-------------------------
public
-------------------------
private
-------------------------
protected[保护访问] 受保护的访问权限
只能在当前类的内部,以及该类的子类中访问;实例对象访问不到.
-------------------------
internal[内部访问]
只能在当前程序集(项目)中访问;
在同一个项目中internal和public的访问权限一样
-------------------------
protected internal[内部保护访问]
protected+internal的访问权限
-------------------------
使用场合:
修饰类:public,internal.  类的默认访问修饰符是internal
修饰类成员:五中都可以,  默认访问修饰符石private
----------------------------------------------------------------------------------------------
static关键字:用于修饰类,字段,属性,方法,构造方法等.
被修饰的类称为"静态类"
被修饰的成员称为"静态成员",被修饰的成员叫做:静态字段,静态属性,静态方法,静态构造方法.
-------------------------
静态字段:被static关键字修饰过的字段.
其不属于任何对象只属于类.必须使用 类名.静态字段名 进行访问,而 对象名.静态字段名无法访问.
静态字段重新赋值  类名.静态字段名="***";
-------------------------
静态属性:被static修饰的属性
静态属性用于对静态字段进行封装,并保证静态字段值的合法性;
其使用 类名.静态属性名 进行访问;
-------------------------
静态方法:被static修饰过得方法
用 类名.方法名 来访问
控制台程序Program中的main就是静态方法
在静态方法中不能调用非静态方法
-------------------------
静态构造方法:
作用:初始化静态成员.
一个类中只能有一个静态构造方法,该静态方法没有任何访问修饰符,也没有参数.
可以定义在静态类,也可以定义在非静态类中
        public static string adress;//静态字段
        static Person()//静态构造方法 唯一
        {
            //初始化静态成员
            adress = "中国";
        }
-------------------------
静态类
当类中的成员全都是静态成员,可将类声明为静态类
在class前加static修饰符
静态类中只能有静态成员,并且静态类不能被实例化.
 /// <summary>
    /// 静态类
    /// </summary>
   static class Syy
    {
        private static string name;
        public static string Name
        {
            get{return name;}
            set { name = value; }
        }
        public static void Hello()
        {
            Console.WriteLine("Hello c#");
        }
        static Syy()
        {
            name = "擅码网";
        }
    }
----------------------------------------------------------------------------------------------
单例设计模式
单例:设计一个类的时候,需要保证整个程序在运行期间只存在一个实例对象.
单例设计模式是适用于非静态类中,在静态类中写单例无意义.
单例实现步骤:
1.声明一个静态且私有的当前类类型的字段
private static ClassName instance;
2.创建私有无参构造方法,保证外部无法实例化这个类
private ClassName(){}
3.创建一个静态方法,用于创建此类的唯一对象
public static ClassName Instance
{
    if(instance==null)
    {
        instance=new ClassName();
    }
    return instance;
}
--------
例:
/// <summary>
    /// 单例
    /// </summary>
    class Monkey
    {
        //1
        private static Monkey instance;
        //2
        private Monkey() {}
        //3
        public static Monkey Instance()
        {
            if (instance == null)
            {
                instance = new Monkey();
            }
            return instance;
        }
    }
----------------------------------------------------------------------------------------------
嵌套类
在c#中可以将一个类定义在另一个类的内部.
如果想实例化内部类,需要使用 外部类名.内部类名 的方式访问到内部类.
例:
在Person类中定义Web类
在主函数使用时:
Person.Web w = new Person.Web();
w.webName = "shanmaw";
w.webUrl = "www.sss.com";
w.Show();
-------------------------
匿名类
如果某个类的实例对象只使用一次,可以使用匿名类的方式创建这个对象
不需要定义类,我们就可以创建一个对象
这样的类一般用于存储一组只读对象

代码格式
var p = new { Name = "Monkey",Age = 100 };
li:只读
var mk = new { Name = "lkk", Age = 100, Address = "shandong" };
Console.WriteLine("姓名:{0},年龄:{1},地址:{2}",mk.Name,mk.Age,mk.Address);
-------------------------
密封类
被sealed关键字修饰过的类不可被继承,也就是说不能有子类;
例:
sealed class AAA
{
}
----------------------------------------------------------------------------------------------
Object类
1.在c#中,Object类石所有类的父类,在c#中所有类都是直接或间接继承自Object类.
Object是类,object是类型.
2.重写ToString方法
我们经常会在自己的类中重写ToString方法,将类中的信息打印输出
string.Format格式化
public override string ToString()
        {
            return string.Format("{0}--{1}--{2}", name, age, address);
        }
static void Main(string[] args)
        {
            Person p = new Person("syy", 21, "山东泰安");
            p.Hello();
            Console.WriteLine(p.ToString());
            Console.ReadKey();
        }
----------------------------------------------------------------------------------------------
装箱与开箱
装箱:值类型-->引用类型
拆箱:引用类型-->值类型
两种类型只有存在继承关系的时候,才可能出现装箱或拆箱操作

注意:
装箱和拆箱本质上是数据存储在栈空间与堆空间之间变更,因此频繁的装箱或拆箱辉降低代码的运行速度,尽量少用装箱和拆箱操作.
----------------------------------------------------------------------------------------------
预编译指令:也叫预处理指令,在程序正式编译之前执行.
这些指令不会转化为可执行代码中的命令,但是辉影响编译过程中的各个方面.
-----------------------
区域指令,是预编译执行中的一种
指令格式:
#region Info              Info是预编译指令的名字
.......
#endregion
作用:
优化代码结构,当我们的一个脚本有500+,1000+行的时候,一个脚本文件中会出现大量的字段,属性,方法,各种各样的功能的代码.
如果想要快速定位某个功能的代码,很不方便.这个时候我们可以使用区域指令,进行代码折叠.
 class Person
    {
        #region 字段
        private string name;
        private int age;
        private string address;
        #endregion
        #region 构造方法
        public Person(string name, int age, string address)
        {
            this.name = name;
            this.age = age;
            this.address = address;
        }
        #endregion
        #region 普通方法

        public void Hello()
        {
            Console.WriteLine("大家好我是syy");
        }

        public override string ToString()
        {
            return string.Format("{0}--{1}--{2}", name, age, address);
        }
        #endregion
    }
}
----------------------------------------------------------------------------------------------
对象初始化器
在一个类中,我们通常使用构造方法来对属性进行赋值,完成对象的初始化.
但是当一个类中的属性很多的时候,我们不可能为各种情况定义构造方法,这个时候可以使用"对象初始化器"来完成属性的赋值.
语法格式:
类名 对象名=new 类名(){属性名 = 值; 属性名 = 值;}
当使用对象初始化器的时候,不可以定义构造函数,否则报错.
Person p1 = new Person() { Name = "syy", Age = 100 };
Person p2 = new Person() { Name = "sss" };
Person p3 = new Person() { Age = 32, Address = "ssssfafaf" };

----------------------------------------------------------------------------------------------


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值