@

1.变量和表达式

1.1注释

  • 单行注释://
  • 多行注释:/**/
  • 文档注释:///

    VS编译后,会产生一个文本文件,该文件可创建文档

1.2C#控制台程序基本结构

using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("The first App in Begining C# Program!");
Console.Readkey();
}
}
}

折叠预处理

#region
……
……
#endregion

(折叠中间部分)

1.3变量(从存储长度来看)

  • 转义字符:为了将字面值赋给变量不出错

    eg:

    string myString = "\"string\" is";

  • 整数

    sbyte [-128, 127] 8位

    byte [0, 255] 8位

    short [-32 768, 32767] 16位

    ushort [0, 65535] 16位

    int [-2 147 483 648, 2 147 483 647] 32位

    uint [0, 4 294 967 296] 32位

    long [9 223 372 036 854 775 808, 9 223 372 036 854 775 807] 64位

    ulong [0, 18 446 744 073 709 551 615] 64位

  • 浮点

    前两种存储类型:+/- m x 2^e

    后一种存储方式:+/- m x 10^e

    类型 m-min m-max e-min e-max

    float 0 2^24 -149 104

    double 0 2^53 -1075 970

    decimal 0 2^96 -28 0

  • 文本和布尔

    char [0, 65 535]

    bool ture/false

    string 没有上限

1.4变量的命名

1、变量名的第一个字母必须是字母、下划线或@

2、其后可以是字母、下划线或数字

3(注意)变量名不能是关键字

1.5字面值

类型							后缀
int, uint, long, ulong 无
uint、ulong u或U
long、ulong l或L
ulong (u、l 位置关系和大小写不影响)Ul,Lu……均可
float f或F
double 无、d或D
decimal m或M

@置于字符串最前端,无需转义,即可正确存储和表达字面值

1.6运算符

  • 比较运算符

    ==、!=、<、>、<=、>=

  • 条件运算符

    &&、| |

  • 赋值运算符

    =、+=、-=、*=、/=、%=、&=、|=、^=

  • 其他

    一元:++、--,+(正)、-(负)

    三元:逻辑表达式?a:b

    逻辑表达式成立,三元表达式值为a,否则为b

    二元:+、-、*、/……

  • 优先级

    (优先级记忆不用担心,因为写代码时一般会使用括号指定优先级,增加可读性)

1、前缀:++,--,一 元:+,-

2、,/,%

3、+,-

4、>>、<<

5、>、<、>=、<=

6、==, !=

7、&

8、^

9、|

10、&&

11、| |

12、=,+=,-=,
=,/=、<<=、>>=、&=、|=、^=

后缀:++,--

2流程控制

该部分同c

2.1分支

三元运算符

<test>? <resultIfTrue> : <resultIfFalse>

if语句

if (<test>)
<code executed if <test> is true>;

if (<test>)
<code executed if <test> is true>;
else
<code executed if <test> is false>;

[效果同三元运算符]

if (varl == 1)
{
// Do something.
}
else if (varl == 2)
{
// Do something else.
}
else
{
// Do something else.
}

switch语句

switch (<testVar>)
{
case <comparisonVal1>:
<code to execute if <testVar> == <comparisonVal1> >
break;
case <comparisonVal2>:
<code to execute if <testVar> == <comparisonVal2> >
break;
……
case <comparisonValN>:
<code to execute if <testVar> == <comparisonValN> >
break;
default:
<code to execute if <testVar> != <comparisonVals> >
break;
}

2.2循环

do循环

do
{
<code to be looped>
}while (<Text>)

while循环

while (<Text>)
{
<code to be looped>
}

for循环

for (<initialization>; <condition>; <operation>)
{
<code to loop>
}

无限循环

while (ture)
{} for (; ;)
{}

……

3变量知识拓展

3.1类型转换

  • 隐式转换
  • 显式转换
(<destinationType>) <sourceVar>

3.2枚举

  • 定义
enum <typeName>:<underlyingType>
{
<value1> = <actualVal1>
<value2> = <actualVar2>
……
<valueN> = <actualVarN>
}

(数据默认为int类型,每个值根据顺序定义【从0开始】)

声明新类型的变量

<typeName> <varName>
  • 赋值:
<varName> = <typeName>.<value>;

3.3结构(体)

  • 定义
struct <typeName>
{
<memberDeclarations>
}
  • 结构的数据成员
<memberDeclarations>
  • 部分包含变量的声明:
<accessibility> <type> <name>

定义结构类型的变量类似枚举

可以通过句点字符访问这个组合变量中的数据成员

3.4数组

数组的索引是从0算起,如果要查找数组中第三个元素,语法为:myArray[2]

  • 定义:
<baseType> [ ] <name>

(必须在访问之前初始化)

举例

int [] myIntArray = {1, 2, 3};

或,int [] myIntArray = new int[arraySize];

arraySize可以是常数,也可以是变量

或,int [] myIntArray = new int[10] {2, 5, 5};

foreach循环

遍历数组中每一个元素

foreach (<baseType> <name> in <array>)
{
// can use <name> for each element
}

多维数组

[, ] ;

与一位数组类似,只是使用的时候需要更多的逗号和更多的大括号,数据在内存中顺序存储

eg:double [, ] hillHight = new double[3, 4] {{2, 3 , 4, 5}, {2, 33, 55.7, 5}, {2, 5}};

数组的数组

声明:int[ ] [ ] jaggedIntArray;

  • 初始化:
jaggedIntArray = new int [2] [ ];
jaggedIntArray [0] = new int [3];
jaggedIntArray [0] = new int [2];
//或是下面这样
jaggedIntArray = new int [3] [ ]{
new int [2] {2, 4}, new int [3] {2, 3, 4},
new int [1] {5} };
  • 又或声明与初始化放一起
int [ ] [ ] jaggedIntArray = new int [3] [] {
new int [2] {2, 4}, new int [3] {2, 3, 4},
new int [1] {5} };
  • foreach实现遍历
foreach (int [ ] sonArray in fatherArray)
{
foreach (int sprit in sonArray)
{
// work;
}
}

3.5字符串的处理

  • 思路
  • 转为字符数组,(一般)使用封装好的方法操作即可

    1、字符串转字符数组:<stringName>. ToCharArray( ) 【其后方法使用方式一致】,有返回值

    2、获取字符串中字符数:Length( ),有返回值

    3、转为大,小写:ToUpper( ), ToLower( ),有返回值

    4、删除指定字符:Trim(需要的字符),有返回值,默认删除字符串前后空格

    5、删除字符串前后空格:TrimStart( ), TrimEnd( ), 有返回值

    6、在字符串左边或右边添加指定字符至指定长度:PadLeft(<length>,<char> ), PadRight(<length> , <char>), 有返回值,默认添加空格

4函数

static <returnType> <FunctionName>( <type> <typeName>)
{
// do something.
return <typeVar>
}

如果是void类型,则之间return; 或省略不写

4.1返回值

如果方法有返回值,在方法体内,所有情况下,都必须有返回内容,否则会报错 “并不是所有的处理路径都用返回值”

针对一行代码的方法,可以使用 表达式体方法(expression-bodied method)处理

如:

static double Multiply (double myVal1, double myVal2)
{
return myVal1 * myVal2;
}

可改写为:

static double Multiply (double myVal1, double myVal2) => myVal1 * myVal2;

4.2参数

  • 参数匹配

    参数类型、个数。顺序 在定义与使用时保持一致

  • 参数数组

    只能指定一个特殊参数

    可以传递同类型的多个参数:

static <returnType> <FunctionName> (params <type>[ ] <name>)

{

	……

	return <returnValue>

}
  • 引用参数和值参数

    把变量作为一个参数,调用方法时并不影响主函数中变量的值。

    (实质是重新开辟了一块空间,传参时将变量给新空间复制了一份,在方法执行完毕后,复制的变量就会和方法一起被清理掉,而原来的参数并没有参与方法中的任何操作)

    改变原变量的方法:

    1、使用返回值

    缺点:不直观、只有一个返回值

    2、使用ref 限定

static void ShowDouble ( ref int val)

{

	val *= 2;

	WriteLine($ "val double = {val}");

}

调用(必须加 ref):

int myNumber = 5;

ShowDouble( ref myNumber);

ref的限制:

a、值参数必须是“非常量”变量

b、必须使用初始化过的变量

3、使用全局变量——可读性差

  • 输出参数

    out

    使用方法及作用同ref

    区别:

    1、未赋值的变量可以做out的参数,但不能做ref的参数

    2、函数使用out参数时,必须将其看作未赋值的

5.调试和错误处理

5.1 VS中调试

  • 非中断模式下调试

    1.输出调试信息
Debug.WriteLine( )	//仅在调试模式下运行
Trace.WriteLine( ) //还可用于发布程序

2.跟踪点

  • 中断模式下调试

    1.断点进入

    Debug.Assert( )

    Trace.Assert( )

    第一个参数:布尔值,为false时触发语句

    第二个参数:字符串,将信息弹到对话框

    第三个参数:字符串,将信息弹到Output窗口

Debug.Assert ( myVar < 10, " my Var is 10 or qreater", "Assertion occurred in Main( ).")

2.语句进入

3.监视变量内容

4.单步执行

5.Immediate 和 Command 窗口

调整变量值,测试表达式

6.Call Stack 窗口

描述程序如何执行到当前位置

5.2 错误处理

  • try……catch……finally
try
{
……
} catch ( <exceptionType> e) when (filterIsTure)
{
<await methodName( e); >
……
} finally
{
<await method name>
……
}

正常执行顺序:就像字面意思,先尝试执行 “try” 中的代码,如果有错误,跳到 “catch” 抓住异常,执行相应操作,最后“finally”。

catch的补充1:也可以将错误 “catch”后抛出:

catch(Exception)
{
throw;
}

代码可以嵌套,因此如果外层代码仍没有处理抛出的异常,编译器就会迫使程序暂停(不能正常编译)

catch的补充2:如上述代码,catch后的括号里需要跟异常的类名,如果不知道异常的类名,可以选择跟异常之父——“Exception”。只有catch了正确的异常类——即程序异常的类名与catch后括号的类名一致时,才会执行catch中的代码,同理,可以有多个catch并列,但catch(Exception)只能位于最后。

eg:

try
{
int[4] myArray = {1, 2, 3, 4};
int myElem = myArray[ 4];
} catch (Exception ex)
{
Debug.WriteLine( ex.Message);
}
  • 列出和配置异常

6.面向对象编程

6.1 面向对象



  • 类:类是功能的封装,例:衣服

    对象:对象是类中的一个实例,例:第三行第二列的那件衣服

    C#中可以创建类,类中有成员。

    static问题:

    静态的即全局的,静态的类就可以通过点句运算符直接访问,参考Console()进行理解。

    静态构造函数调用时机:

    创建含静态函数的类实例

    访问含静态构造函数的类的静态成员

    1.构造函数

    构造函数——数据成员初始化

    本质:方法

    特点:没有返回值,与类同名

    例——用new调用默认构造函数,实例化一个对象:

CupOfCoffee myCup = new CupOfCoffee();

与可以是非默认构造函数:

CupOfCoffee myCup = new CupOfCoffee(" Blue Mountain");

构造函可public也可private,因此可以private默认构造函数,强制类的用户使用非默认构造函数

2.构析函数

归还内存

~<ClassName>()
{} //当析构语块结束时,析构函数执行

也可以使用CG

CG.Collect( );
//这个看CG的心情,CG觉得时机不成熟,即使有该语句也不会进行清理

3.方法

解决问题

4.字段

存储数据——变量

5.属性

保护字段读写

  • UML

    UML即Unified Modeling Language

是一种建模语言

类的表示:

第一行:类名

第二行:成员- 成员名: 成员类型

第三行:方法名( 标识符 参数名: 参数类型):方法类型

标识符:out 和 inout 分别对应 out 和 ref,in 不使用以上两种关键字(默认情况),return 表返回值

(注:二、三行“+、-”号表示public和private,下划线表private)

类似于伪代码,不受编程语言是语法限制,来表述问题解决思路。

6.2 OOP技术

  • 接口

    把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合

    可理解为将多个有相似特性的类组合在一起的大类。

    (区别是:类只能继承一个,接口可以继承多个)

    可删除对象:使用using关键字后,代码块执行完毕,就会调用Dispose()方法,删除代码块

using (<ClassName > <VariableName> = new <ClassName>)
{
……
}
  • 继承

    任何类都可以从另一个类继承

    基类——父类,派生类——子类

    注:C#的对象仅能直接派生一个基类

    可访问性:派生类不能访问基类的私有成员,可访问共有成员,外部代码同。

    第三种可访问性:protected。家族类可访问,外部代码不能。

    继承行为:基类成员可以是虚拟的,成员可以由继承它的类重写。派生类可以提供成员的另一种实现方法,这种实现代码不会删除原来的代码,但外部代码不能访问它们。如果没有提供其他实现方式,通过派生类使用成员的外部代码就自动访问基类中成员的实现代码。

    (虚拟成员不能是私有变量)

    抽象类:不能实例化,使用时必须继承它,并在派生类中重写。可封装功能

    类可密封,密封的类不能做基类。

    C#中,所有对象有一个共同的基类Object

  • 多态

    条件:有家族关系、有相同的类

    使用方法:调用类的方法需要一个过渡变量

//Cow是Animal的派生类,Cow继承Animal的EatFood方法
//且有一个基类没有的Moo()方法
Cow myCow = new Cow();
Animal myAnimal = myCow;
myAnimal.EatFood;
Cow myNewCow = (cow) myAniaml;
myNewCow.Moo();

使用环境:作用在同一个类的不同对象上执行任务

接口的多态性:条件——有方法、有共同接口

优势:不用依赖于一个公共的基类

唯一的区别:必须提供方法的实现代码

  • 对象之间的关系

    1.包含关系

    类似于继承

    *2.集合关系

    存储多个同类型的变量,类似于数组(变量即对象,万物皆可对象)

转载请注明出处

【游戏开发笔记】编程篇_C#面向对象{上}的更多相关文章

  1. [置顶] mmog游戏开发之业务篇

    这周不是很忙,因为我们的游戏开发了近一年,由于公司的业务调整,在游戏开第二服的时候,老板果断的把项目停到了. 感觉超级的不爽啊.因为这个游戏项目像我的孩子一样和我一样成长,里边的大概的业务逻辑都是偶实 ...

  2. ONVIFclient搜索设备获取rtsp地址开发笔记(精华篇)

    概要:           眼下ONVIF协议家族设备已占领数字监控行业半壁江山以上.亲,作为开发人员的你还在犹豫是否了解下吗?本文介绍了ONVIFclient从设备搜索,鉴权,能力获取,媒体信息获取 ...

  3. ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    原文  http://blog.csdn.net/gubenpeiyuan/article/details/25618177   概要: 目前ONVIF协议家族设备已占据数字监控行业半壁江山以上,亲, ...

  4. 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要:           目前ONVIF协议家族设备已占据数字监控行业 ...

  5. STM32F412应用开发笔记之六:使用片上Flash存储参数

    我们的项目中需要保存一些系统配置参数,这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能.这就需要考虑这些参数保存的问题.将这类数据存在指定 ...

  6. [webkit移动开发笔记]之如何去除android上a标签产生的边框(转)

    转载地址:http://www.cnblogs.com/PeunZhang/archive/2013/02/28/2907708.html 去年年底,做完最后一个项目就可以开开心心回家,可是在测试阶段 ...

  7. [webkit移动开发笔记]之如何去除android上a标签产生的边框

    去年年底,做完最后一个项目就可以开开心心回家,可是在测试阶段,发现了不少bug,为了不影响回家时间,加班加点也要解决这些问题,这里算是工作回忆,也算是工作的一点小总结. 在ios4+和android2 ...

  8. 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子

    原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...

  9. 【android】开发笔记---存储篇

    SQLite批量插入数据 当我们执行 db.execSQL("sql语句")的时候,系统进行了一次IO操作,当批量插入成千上万条时,就会消耗掉许多资源. 解决之道是通过事务,统一提 ...

  10. odoo开发笔记 -- 单台物理服务器上,利用docker部署多套odoo应用

    部署结构: 待更新! ----服务器硬件配置: 操作系统:ubuntu16.04-64bit CPU/内存:4核8G 1. 基础环境安装 nginx离线安装: docker环境安装: 2. 官方容器镜 ...

随机推荐

  1. [Pytorch框架] 5.1 kaggle介绍

    文章目录 5.1 kaggle介绍 5.1.1 Kaggle 平台简介 比赛介绍 5.1.2 Kaggle板块介绍 Data Rules Team Kernels Discussion Leaderb ...

  2. java镜子之反射篇

    文章目录 注解 内置注解 元注解 反射 类的初始化 类加载器 双亲委派机制 反射方法的使用 调用类的方法.成员变量.构造器等 总结 注解和反射是Java中非常重要的知识,一些优秀开源的框架都是大量运用 ...

  3. Java SE 20 新增特性

    Java SE 20 新增特性 作者:Grey 原文地址: 博客园:Java SE 20 新增特性 CSDN:Java SE 20 新增特性 源码 源仓库: Github:java_new_featu ...

  4. IDP中的黄金路径究竟是什么?

    在云原生时代,开发人员面临着越来越多的工具.技术.思维方式的选择,给他们带来了极大的认知负担和工作量.为了提高开发人员的开发效率与开发体验,一些头部科技公司开始建立自己的内部开发者平台(IDP).在之 ...

  5. prism journal导航按钮的可用性探索记录

    prism使用导航功能的时候,跳了几个坑,记录一下. 1.导航记录的产生,是在区域导航过程中产生的. _regionManager.Regions[PrismManager.MainViewRegio ...

  6. VueUse 是怎么封装Vue3 Provide/Inject 的?

    Provide/Inject Provide 和 Inject 可以解决 Prop 逐级透传问题.注入值类型不会使注入保持响应性,但注入一个响应式对象,仍然有响应式的效果. Provide 的问题是无 ...

  7. ai问答:使用 Vue3 组合式API 和 TS 配置 axios 拦截器 http错误状态

    通过 axios.create() 可以创建一个 axios 实例 axiosInstance,参数如下: baseURL:请求前缀 timeout:超时时间 headers:请求头 默认配置: im ...

  8. thinkphp常量定义

    是已经封装好的系统常量 主要是用在控制器下面的动作当中 这样能很大的提高我们的开发效率主要有下面的一些     手册上面都有的     __ROOT__ 网站的根目录     __APP__ 代表项目 ...

  9. Docker私有仓库harbor

    Docker私有仓库harbor 目录 Docker私有仓库harbor Harbor私有仓库介绍 Harbor部署 harbor页面不显示排错思路 Harbor的使用 Harbor拉镜像 自制镜像推 ...

  10. Spring源码:Bean生命周期(终章)

    前言 本系列前面讲解了Spring的bean定义.bean实例化.bean初始化等生命周期.这些步骤使我们能够了解bean从创建到准备好使用所经历的过程.但是,除了这些步骤,bean的销毁也是非常重要 ...